主题中讨论的其他器件: C2000WARE
我在与另外两个器件通信的 SPI 总线上将 TMS320F28075配置为从器件。 如果只选择 TMS320并传输数据、则一切都很顺利。 但是、当选择 SPI 总线上的其他器件时、TMS320上的数据有时会损坏。 这里的关键字是 有时 ,因为数据并不总是损坏的。
以下是所发生情况的逻辑捕获:
此处发送了3条消息。 首先、选择 TMS320并且该传输成功。 然后、选择总线上的另一个器件、该传输也很好。 然后第3次传输、再次选择 TMS320。 TMS320此处接收到不正确的数据。
放大了第三条消息:
这是我调试时数据的样子(我应该看到:0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00):
我知道这不是最好的示例、因为这里发送的大多数数据都是0x00。 但我尝试过其他具有更具体值的消息、我将始终收到与上述 pic 相同的消息。 此外、我使用 CRC 来验证数据、因此很容易判断数据何时不正确。
此损坏的数据仅在 SPI 总线上的另一个器件传输完毕后才会立即发生。 因此我知道这与此相关。 如果 SPI 总线上没有其他传输、我看到没有损坏的数据。 我已经通过在没有其他设备的情况下运行30分钟的方法对此进行了测试。 我没有看到损坏的数据。
奇怪的是、因为我已将 TMS320 SPI 配置为 RX 缓冲区上的中断为1。 当总线上的其它器件传输数据时、TMS320不会中断。 所以 RX 缓冲区没有被填满。 但是、数据仍然是损坏的。 另外、TMS320绝不会干扰其它器件的传输。
以下是在 TMS320上配置 SPI 的方法:
void McuCommsInit(void) { // // GPIO55 is the SPISOMIA. // GPIO_setMasterCore(55, GPIO_CORE_CPU1); GPIO_setPinConfig(GPIO_55_SPISOMIA); GPIO_setPadConfig(55, GPIO_PIN_TYPE_STD); GPIO_setQualificationMode(55, GPIO_QUAL_ASYNC); // // GPIO54 is the SPISIMOA clock pin. // GPIO_setMasterCore(54, GPIO_CORE_CPU1); GPIO_setPinConfig(GPIO_54_SPISIMOA); GPIO_setPadConfig(54, GPIO_PIN_TYPE_STD); GPIO_setQualificationMode(54, GPIO_QUAL_ASYNC); // // GPIO57 is the SPISTEA. // GPIO_setMasterCore(57, GPIO_CORE_CPU1); GPIO_setPinConfig(GPIO_57_SPISTEA); GPIO_setPadConfig(57, GPIO_PIN_TYPE_STD); GPIO_setQualificationMode(57, GPIO_QUAL_ASYNC); // // GPIO56 is the SPICLKA. // GPIO_setMasterCore(56, GPIO_CORE_CPU1); GPIO_setPinConfig(GPIO_56_SPICLKA); GPIO_setPadConfig(56, GPIO_PIN_TYPE_STD); GPIO_setQualificationMode(56, GPIO_QUAL_ASYNC); SPI_disableModule(SPIA_BASE); SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_SLAVE, 2500000, 8); SPI_disableLoopback(SPIA_BASE); SPI_enableTalk(SPIA_BASE); SPI_enableFIFO(SPIA_BASE); SPI_resetTxFIFO(SPIA_BASE); SPI_resetRxFIFO(SPIA_BASE); SPI_enableModule(SPIA_BASE); SPI_enableInterrupt(SPIA_BASE, SPI_INT_RXFF); SPI_setFIFOInterruptLevel(SPIA_BASE, SPI_FIFO_TX16, SPI_FIFO_RX1); Interrupt_register(INT_SPIA_RX, &RxSpiInterrupt); Interrupt_enable(INT_SPIA_RX); GPIO_setInterruptPin(57, GPIO_INT_XINT1); GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_BOTH_EDGES); GPIO_enableInterrupt(GPIO_INT_XINT1); Interrupt_register(INT_XINT1, &ChipSelectInterrupt); Interrupt_enable(INT_XINT1); }
以下是我读取 SPI 数据的方式:
void ReadSpiReceiveData(void) { SPI_RxFIFOLevel rxFifoStat = SPI_getRxFIFOStatus(SPIA_BASE); uint8_t count = 0; while(rxFifoStat != SPI_FIFO_RXEMPTY) { count++; WriteToBuffer(SPI_readDataNonBlocking(SPIA_BASE)); rxFifoStat = SPI_getRxFIFOStatus(SPIA_BASE); } SPI_resetRxFIFO(SPIA_BASE); }