Thread 中讨论的其他器件:TMS570LS3137、 TMS570LS0332
上下文:
我们拥有一个使用以下微控制器的应用:
TMS320F280049CPZS - DSP
TMS570LS3137–主要
TMS570LS0332 -辅助
所有处理器均通过 SPI 接口相互通信。 SPI 和 DMA 模块在 DSP 中配置如下:
主器件与 DSP 之间的通信
SPI 总线:SPIA
SPI 比特率:8MHz
SPI 消息:每1毫秒64个字。
主设备是主设备。 DSP 是从设备。
DMA 通道:Ch5 (DSP 到主)和 CH6 (主到 DSP)。
DMA CH6:连续模式开启
DMA CH5:连续模式关闭
DMA 中断:INT_AT_END
辅助与 DSP 之间的通信
SPI 总线:SPIB
SPI 速度:8MHz
SPI 消息:每1毫秒64个字。
从控制器是主控制器。 DSP 是从设备。
DMA 通道:CH3 (DSP 到辅助通道)和 CH4 (主通道到辅助通道)。
DMA CH4:连续模式开启
DMA CH3:连续模式关闭
DMA 中断:INT_AT_END
问题
如果微控制器中的一个被强制复位而其它微控制器继续运行、那么不能正确地"理解" SPI 数据。 此问题是间歇性的(不会在每次复位时发生)。
检查 DMA 存储器、可以观察到数据偏移了给定数量的字。
假设
当强制复位时、SPI 从器件与主器件失去同步。 如果在传输数据时发生复位、则部分消息将丢失。 DMA 存储器存储不完整的消息流。
建议的解决方案
如果我们检测到不正确的数据流、请将 SPI 和 DMA 模块重置为其默认状态。 我们使用 CS 线路和 GPIO 中断使 SPI/DMA 进入已知状态。 但是、我们想确认适当的步骤集应该是为了使 SPI 和 DMA 模块都进入其初始状态(工作状态)。
我们需要在主器件与 DSP 之间进行通信、同时保持辅助器件与 DSP 之间的通信处于活动状态、反之亦然。
以下代码是否用于 main 和 DSP 之间的通信?
//Disable SPI SPI_disableModule(SPIA_BASE); //Stop channel and clear trigger Flag DMA_stopChannel(DMA_CH6_BASE); DMA_clearTriggerFlag(DMA_CH6_BASE); //Soft Reset the DMA Channel 6 DMA_triggerSoftReset(DMA_CH6_BASE); // Soft Reset Channel 5 and Flush SPI Tx Buffer DMA_triggerSoftReset(DMA_CH5_BASE); SPI_resetTxFIFO(SPIA_BASE); DMA_enableTrigger(DMA_CH5_BASE); //Enable SPI SPI_enableModule(SPIA_BASE); //Start Channel DMA_startChannel(DMA_CH6_BASE);
我们怀疑某些代码可能不是必需的、或者可能需要附加代码。