我遇到了一个非常奇怪的问题、我已经在调试了一个多星期了、所以我想我会看看这里是否有人有任何想法。 我将解释我的系统的相关部分、然后解释我看到的内容。
我将 DMA 与 CAN 一起用于接收 CAN 消息。 在此设置中、除了最后一个硬件邮箱外、所有硬件邮箱都专用于单个 CAN 消息。 最后一个设置为触发 DMA、以将接收到的消息传输到定期处理的缓冲器中。 此 DMA 通道在其链寄存器中有另一个 DMA 通道。 该次通道写入并指示 CAN 消息缓冲器中的哪个索引最后写入。
我们有一个外部实时时钟、该时钟将32kHz 节拍馈送到 NHET 模块中。 我们使用 HTU 来检索时间电流时间。
这个系统已经过测试并运行了很长时间、但是我们有一条代码、当任何消息进入最后一个 CAN 邮箱并应该使用 DMA 进行传输时、该代码会出现问题。 当它接收到其中一条消息时、消息不会传输、时间永远不会被检索、并且在刷新时、调试器中的内存浏览器会针对所有值显示 BAD0BAD0、直到代码执行暂停。
这是我们用来获取时间的代码。 接收到 CAN 消息且 DMA 开始处理后、它会卡在 while 循环中。
htuREG2->GC = htuREG2->GC & 0xFFeffff;//禁用传输单元 while ((htuREG2->BUSY0)& 0x01000000); SubSecTimestamp t = RTCBuffer; htuREG2->GC = htuREG2->GC | 0x00010000;//重新启用传输单元
除此之外、CAN 消息永远不会出现在目的缓冲区中。 从我从 DMA 寄存器中可以看出、它认为 CAN 消息已传输到缓冲区、并且正在链通道上等待完成。 没有其他 DMA 通道处于活动状态、它只应复制一个字节、因此不应花费任何时间。
启用或禁用中断时会发生这种行为、因此我认为接收到 CAN 消息时不会产生某些中断。
对我来说、这一点非常奇怪、DMA 和 HTU 似乎都受到影响、尽管我不知道它们以什么方式进行链接。
以下是发送 CAN 消息前后 DMA 的寄存器状态。
e2e.ti.com/.../5050.dma_5F00_before_5F00_crash.txt
e2e.ti.com/.../7317.dma_5F00_after_5F00_crash.txt
当我在上面提到的 while 环路中等待时、NHET 和 HTU 寄存器在崩溃前后看起来都一样。
e2e.ti.com/.../3302.nhet_5F00_htu_5F00_after_5F00_crash.txt
提前感谢。 请告诉我是否有任何其他信息有用。