现在车规级MCU内集成的CAN 控制器大多使用Bosch M_CAN 的IP,MCAN 一个module有4个CAN node(相当于4个CAN控制器),这几个CAN node使用共同的message RAM;不同的半导体供应商在集成MCAN 模块时,分配给MCAN 的message RAM 大小可能不一样;
在Gateway,VCU,BCM 应用中,对CAN node 数量的需求会比较多,本文讨论的场景为多CAN节点多报文使用时会遇到的问题;无此应用场景可忽略;
对于同一个CAN module,message RAM 分配的不合适,有可能导致同一module其他 node 的RX FIFO内容被异常覆盖或报文收发异常等;下文讨论此种情况产生的机制及规避措施;
以TCxx系列MCU为例,其内部集成了3个MCAN module,给MCAN0 分配的message RAM为 32Kbyte,给MCAN1/2 分配的message RAM为 16Kbyte;
一个MCAN module 的4个CAN node 共用一块message RAM,每个CAN node使用的message RAM 的地址和大小用户均可以自由配置,只要在Message RAM 的范围内即可;
假设CAN1/4/7/9 使用MCAN1 的4个CAN node,EB 提供的MCAL 配置工具会按照CanController 的index 并结合FIFO, Buffer的配置为各个CAN node 先后分配message RAM空间,但其没有提供检查功能;如留给CAN9 的memory 空间已经放不下配置的FIFO/Buffer, 配置工具并不会报错;但程序运行起来后,就可能导致CAN9/CAN1收发数据异常;如CAN9 总线上接收的数据可能覆盖CAN1 Filter 参数的配置,导致CAN1 接收不成功;
每个CAN node message RAM 的结构如下,由Filter Configuration信息,RXFIFO0, RXFIFO1, RX Buffer,TX Event FIFO,TX Buffer 和Trigger memory组成;
RXFIFO0, RXFIFO1,RX/TX Buffer 占用的memory空间,一方面取决于数据帧的类型,标准CAN 或CAN FD frame(CAN FD frame比 Standard CAN frame会占用更多的memory空间),另一方面取决于配置的FIFO 的深度,或者Buffer的个数;
假设总线的波特率为1Mbit/s, 总线上传输一帧数据的时间约为100多us;如果总线的负载率很高,每隔100多us CAN 控制器会收到一帧总线数据;
MCU用中断的方式去处理接收数据,每隔100多us,触发一次中断,将CAN控制器接收到的总线数据复制到用户buffer(假设内核执行这段中断服务函数可在2us内完成);
如果内核被其他高优先级的中断占用,并且中断服务函数的执行时间较长(假设500us),在这500us内CAN controller 接收到总线上数据后,内核接收中断ISR执行不了,处理不了接收数据,在这个过程中CAN控制器可能已接收了3帧数据,第3帧数据就会把前两帧数据覆盖掉,内核再去读数据时,读不到前两帧数据,导致丢帧;
如果CAN 控制器使用RX FIFO 来存放接收到的数据,这样在这500us内,CAN 控制器就可以把这3帧数据放入RX FIFO中;内核再次发生接收中断读数据的时候,把所有FIFO中的数据都copy到用户RAM中,供上层使用,就可以避免丢帧的发生;
使用RX FIFO, 可以降低内核对接收数据处理实时性的要求,RX FIFO 的深度越大,内核处理接收数据的时间间隔就可以越大;
假如内核执行CAN发送函数的时间为1us;CAN总线的波特率为1Mbit/s, 总线上传输一帧数据的时间约为100多us;
如果发送函数连续执行3次(3us执行完),后面两次发送函数执行的时候,第一次写入的数据才刚开始在总线上传输,代码中后面两次发送函数的执行可能不会实际触发数据发送到总线上;
如果使用了TX FIFO,发送函数连续执行3次,发送数据将被存入CAN 控制器中,在完成第一帧数据发送后,CAN控制器硬件会继续向总线上发送TX FIFO中的数据;最终把这3帧数据都发送到总线上;
TX FIFO 使代码中发送函数可以连续多次执行;执行的次数取决于TX FIFO 的深度;
假设应用中接收发送都通过FIFO处理,根据CAN module message RAM的大小,及处理的数据帧的类型(Standard Frame 或 CANFD Frame),MCAN RXFIFO/TX Event FIFO 深度配置限制要遵循以下原则:
- 1. 对于module 0 的4个节点,其message RAM 为32Kbyte,不管处理的数据帧类型,所有的4个CAN node 使用的RX FIFO, TX Event FIFO 的深度都可以配置为最大值,即 RX FIFO深度为64,TX Event FIFO 为32;
- 2. 对于module 1/2 的4个节点,其message RAM 为16Kbyte,RX FIFO, TX Event FIFO 深度的配置要可根据每个节点处理数据帧的类型,以及总线上处理报文的数量,在满足下式的情况下设置合适的值;
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/40407.html