一、一个FIFO最多可存储几组CAN数据?
手册里介绍了RX FIFO的寄存器数据结构,0x90-0xDC保留用作存储FIFO引擎,它里面的结构和上面0x80~0x90完全一样吗?也是16个字节吗?好像没有说明。根据大小计算0xDC-0x90=0x4C=76Bytes。若存储16个字节,可存储4个数据。换言之,FIFO里面最多可存储1+5=6个数据(至少包含ID)
![](https://img-blog.csdnimg.cn/20181116144759737.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDEzNzI1Mg==,size_16,color_FFFFFF,t_70)
二、FIFO初始化:
不是任何帧都能进FIFO,首先使能FIFO,然后指定符合哪些CANID的帧可以进FIFO,即设置FIFO ID Table,显然最多允许8个CANID的帧。
![](https://img-blog.csdnimg.cn/20181116151417600.png)
![](https://img-blog.csdnimg.cn/20181116151140112.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDEzNzI1Mg==,size_16,color_FFFFFF,t_70)
三、如何使用FIFO接收数据:
情况一,比如下载程序时,用500kbps波特率,平均一帧8Bytes传输时间400us, 按1ms间隔传输。那么主程序也以1ms间隔接收,总体上两边吞吐率相等。会发生某个间隔内有2帧数据,也会发生下一个间隔总线上没有一帧数据。这样的话只要检测到IFLAG1.B.BUF5I==1,就认为Buffer里还有数据(CANID+8字节Data+数据长度+时间戳),立即取出来。从而不会丢失数据。
情况一,总线上以500us甚至更短间隔传输数据,但是每次最多只传输6个字节。那么主程序无论以多长周期接收,只要接收6次,就可以把Buffer里面的数据全部取完。
![](https://img-blog.csdnimg.cn/20181116145738502.png)
![](https://img-blog.csdnimg.cn/20181116145708889.png)