Microchip
直播中

徐波

7年用户
私信 关注
[问答]

计算FIFO缓冲区大小的正确方法是什么

嗨,我做了一个程序,接收CAN数据,然后通过UART(仅ID-EN数据)将接收到的CAN数据发送到终端。一切都很好,但是我收到了一些奇怪的数据,我想这个问题和CAN的FIFO配置有联系。我只使用一个接收FIFO(FIFO 1),并且大小为14(我通过一个ID发送数据,例如ID=0x710,用于通过CAN阅读器进行测试)。所发生的是,在我收到第十三或第十四个CAN数据之后,我收到了同样的ID,一个奇怪的数据。我通过CAN读取器发送恒定的相同数据,我从CAN读取器获得正确的数据,但是在第13或14次接收数据之后,我从相同的ID(不是我想要的数据)接收奇怪的数据,然后重复该过程。我得到正确的数据,在收到第十三或第十四个数据后,我收到来自同一ID的奇怪数据,为什么?计算FIFO缓冲区大小的正确方法是什么?我们如何确定我们将使用多少FIFO大小?我们如何确定我们将分配多少FIFO内存?我的控制器是PIC32 MX77,F512H,XC32编译器,MPLABX IDE V 3.20.我的FIFO配置示例。

回帖(3)

朱佳婧

2020-4-28 09:20:22
您可能需要查看原始内存,在那里放置了CAN缓冲区,看看这个“奇怪”的数据是否在RAM中。什么是一个日志的例子,你可以生成100个+或类似的消息,足以显示你遇到的问题。在我看来,您为正在设置的FIFO配置分配了足够的内存;我还为FIFO元素计算了64*32位的存储项。如果您在第13或14次RX之后能够可靠地重复执行代码的问题,那么可能必须查看指针值(CiUAFIFOn...)。当您有FIFO的基址时,计算FIFO的边界,看看这个寄存器是否表明下一个读取可能超出边界。它应该环绕在递增到最终元素之后,正如我使用PIC32 MX的CAN模块所经历的那样。我有一个PIC32 MX795F512L,CAN模块大部分工作得很好。我不认为你应该遇到任何“奇怪”的问题,如果编程正确。无论如何,请尝试看我的一些建议,希望你取得进步。
举报

张茜

2020-4-28 09:28:11
谢谢你的回答。我现在已经解决了这个问题。我是如何解决这个问题的?所以我把CANFIFO的值改为256,而不是64。显然,我没有分配足够的内存。如果你知道,你能给我一个公式来计算我必须分配的内存量吗?因为我讨厌编程而不理解。例如,我将从14个不同的ID接收数据,我必须精确分配多少内存?提前感谢。
举报

朱佳婧

2020-4-28 09:35:07
您的分配是正确的;您只需要分配64个x32位值。我将记录来自CiFoCoCin的索引值,看看索引是否超出范围。同样,可以说,您可以同时查看CiFIFOUAn,以确保您的读/写不会因为任何原因超出范围。我的想法是将FIFO的索引(以及地址,如果想知道更多细节)存储到一些其他的调试/仪表阵列中,以便放置下一个RX或从其中读取下一个TX。如果我不使用数据只用消息FIFO,那么每个缓冲区需要4个DWORD,因此需要16个缓冲区*4个DWORDS/.=64个DWORD。你看过FIFO周围的公羊吗?这是有原因的,如果你没有发现,这可能会回来。也许检查你的设备的勘误表…也许你在做一些你不应该做的事?正如我前面提到的,我已经可靠地使用了PIC32模块在PIC32 MX795F512L上好几年,并不是一个主要问题…我用这个模块为汽车的目的服务几个主要的OEM的-谈论一些繁忙的网络!在附注中,我想象当您在RX/TX发生消息时设置UINC位时,您正在通过CiFIFOCONnSET寄存器推进当前FIFO的消息缓冲区索引,如errata中所述……FRM不强调这个,这是必须的!可能不是你的问题,而是一个必要的建议。
举报

更多回帖

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