主题中讨论的其他器件:TMS570LS1224
在我的应用中、我使用 Mibspi5传输6 * 8位消息数据包。 我观察到、消息的传输会中断。 在我的示例中、首先发送5个字节、仅在大约2ms 后发送剩余字节。
传输未完全完成的情况如何?
该图显示了传输的信号。 最后一个段显示最后一个字节在很晚的时候发出。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
在我的应用中、我使用 Mibspi5传输6 * 8位消息数据包。 我观察到、消息的传输会中断。 在我的示例中、首先发送5个字节、仅在大约2ms 后发送剩余字节。
传输未完全完成的情况如何?
该图显示了传输的信号。 最后一个段显示最后一个字节在很晚的时候发出。
您好、再说一次、
在每次传输之前、中断应使用_disable_interrupt_()停用;发送后立即从 sys_core.h 中通过_enable_interrupt_()再次打开中断;
为了进行测试、我创建了一个 while 循环、其中禁用了中断并且只发送了一条消息。 显然、我仍然能够通过 mibspi5中断接收响应。
那么、没有使用函数_disable_interrupt_()禁用中断;?
此致
Konstanty Kuczynski
您好 Konstanty、
很抱歉我没有仔细阅读您的消息。 尽管有7个字。 SPI 本质上是同步的、因此每个字之间的小间隙不应导致问题。
有几个因素可能会影响延迟:
如果 CSHOLD 未置位、则 CS 建立时间(C2TDELAY+2 VCLK 周期)和保持时间(C2ELAY VCLK 周期)。 最短建立时间为 2VCLK 周期
2.如果启用 WDELAY,则2个字之间的延迟为(WDELAY+2 )*VCLK 周期
如果未启用 WDELAY、则如果 CSHOLD 未置位、两个字之间至少有2VCLK 周期延迟。
disable_interrupt_()将在 CPU 级别禁用 IRQ 和 FIQ。 当字从 SPIDAT 或 TXBUF 寄存器复制到移位寄存器时、TXINTFLG 仍应置位。 但 在调用_enable_interrupt_()之前不会生成 IRQ 或 FIQ 中断。
您好 QJ、
我必须添加一些描述不是很正确的内容。 我使用 SPI4发送消息、使用 MibSPI5接收消息。
我再次检查了配置。 CSHOLD 被置位且 WDELAY = 0。 VCLK 频率为60MHz、这意味着一个周期持续16.67ns。
设备在短距离内没有问题(例如从第二张图片中)。 但是、传输期间的2ms 中断会导致问题、从而使器件不响应此消息并检测到错误。
我刚刚禁用了所有其他中断(定时器中断除外)作为测试。 在传输过程中、仍然会有2ms 中断的消息。
是否还有其他可能导致问题?
此致
Konstanty Kuczynski
您好!
感谢您的支持。
通常(大部分)消息之间的距离也很小。
如果这是系统中中断消息发送的另一个中断,我仍然不明白为什么我不能通过调用_disable_interrupt_()来避免这种情况。 如果我在传输期间关闭中断、则不会再发生中断。 或者我是否理解不正确?
针对我们的应用进行了最小调整的 tran想念 函数如下:
静态 SPI_STATUS_t SPI_TMS570LS_transmitPolling (const SPI_CommInterfaceConfig* comConfig、uint8_t length、const uint16_t * dataTx) { SPIRegister* spiRegister = SPI_TMS570LS_getChannel (comConfig->spiChannel); volatile uint32_t dataRx; uint32_t transmitData =((uint32_t) comConfig->format << 24U)|((uint32_t) comConfig->chipSelect << 16U)| (((uint32_t) SPI_TMS570LS_DELAY_COUNTER_ENABLE << 26)|((uint32_t) SPI_TMS570LS_CHIP_SELECT_HOLD_CONFIG << 28); uint8_t nrOfData = comConfig->dataLength; if (comConfig->dataLength ==0) { nrOfData =长度; } while (nrOfData!= 0U) { if ((spiRegister->FLG & 0x000000FFU)!=0U) { 中断; } if (nrOfData = 1U) { transmitData &=~(1U <<SPI_TMS570LS_CS_HOLD_ACTIVE_ACT_POS_POS);//在最后一次传输后禁用 CS } spiRegister->DAT1 =(transmitData & 0xFFFF0000u)|(uint32_t)*数据发送;//发送数据 dataTx++; uint16_t TIMEOUT = spiWaitForTransactionFinished (spiRegister、0xFF); if (超时==0U) { 中断; } dataRx = spiRegister->BUF; //清除接收缓冲区 nrOfData--; } 返回 SPI_TMS570LS_evalateFailureState (spiRegister、(uint8_t)(spiRegister->FLG & 0xFFU)); }
此致
Konstanty Kuczynski