英飞凌
直播中

李莉

7年用户 1375经验值
私信 关注

使用TLE9893的SSC0向一个SPI设备发送一些数据,数据寄存器中的字节传输到移位寄存器后,是否会产生传输结束中断?

我正在使用 TLE9893 的 SSC0 向一个 SPI 设备发送一些数据。
我正在手动控制芯片选择。

我有这样的代码来发送数据:

static bool SCC0_TransmitInterrupt_EndTx = false;void SCC0_TransmitInterrupt (void){    SCC0_TransmitInterrupt_EndTx = true;}#define SSC_EEPROM  0#define SSC_MEMS    1void SSC0_Send ( uint8_t device, uint16_t sizeData, uint8_t * p_Data, bool endOperation ){    switch ( device )    {        case SSC_EEPROM:    GPIO_setP11State ( GPIO_STATE_LOW );    break;        case SSC_MEMS  :    GPIO_setP09State ( GPIO_STATE_LOW );    break;    }    for ( uint16 i=0 ; i
我在示波器上看到的是 CS 信号太短。



因此,CS 过早被取消选择。
是否有移位寄存器(如 UART)? 数据寄存器中的字节传输到移位寄存器后,是否会产生传输结束中断?
我可以使用什么中断或轮询机制来检测所有数据是否已传输完毕? 谢谢!



                                                                                                                                                                                                                                                                                                                                                                                                        
                                                        

回帖(1)

张莉

2024-7-23 17:38:47
sp; case SSC_EEPROM:
        SSC0->CR = SSC_CR_TXEN;
        break;
    case SSC_MEMS:
        SSC0->CR = SSC_CR_TXEN | SSC_CR_TXSRC(1);
        break;
    default:
        break;
}

SCC0_TransmitInterrupt_EndTx = false;
while (!SCC0_TransmitInterrupt_EndTx) {
    // Wait for the interrupt to be triggered
}

for (uint16_t i = 0; i < sizeData; i++) {
    SSC0->DR = *p_Data++;
}

// Disable the transmitter
SSC0->CR &= ~SSC_CR_TXEN;
}

在这段代码中,我们首先根据设备类型设置SSC0的控制寄存器(CR)。然后,我们将SCC0_TransmitInterrupt_EndTx标志设置为false,并在循环中等待传输中断触发。接下来,我们通过SSC0的数据寄存器(DR)发送数据。最后,我们禁用传输器。

关于您的问题,TLE9893的SSC0在数据寄存器中的字节传输到移位寄存器后,确实会产生传输结束中断。在您的代码中,当数据发送完毕后,SSC0_TransmitInterrupt()函数会被调用,并将SCC0_TransmitInterrupt_EndTx标志设置为true。这样,循环中的while语句会退出,表示传输已经完成。

请注意,为了确保传输中断能够正确触发,您需要在NVIC(嵌套向量中断控制器)中启用SSC0的中断。您可以使用以下代码启用SSC0的中断:

NVIC_EnableIRQ(SSC0_IRQn);

同时,确保在您的项目中实现了SSC0_IRQn的中断处理函数,如下所示:

void SSC0_IRQHandler(void) {
    SSC0_TransmitInterrupt();
}

这样,当SSC0的传输结束中断触发时,SSC0_IRQHandler()函数会被调用,进而调用SSC0_TransmitInterrupt()函数,将SCC0_TransmitInterrupt_EndTx标志设置为true,从而完成数据传输。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分