|
MIT Mini Cheetah 的驱动器 高帧率can数据会出现丢帧的现象,经排查发现,主函数初始化can.filter的位置以及参数配置有误。导致该配置无效,此时can会接收所有总线上的数据,can会频繁进入接收中断,驱动程序中can中断的优先级较低(如下图所示)。
mbed的can接口中有int CAN::filter(unsigned int id, unsigned int mask, CANFormat format, int handle) API,该函数可以配置can滤波器的参数。
第一个参数id是FilterId :该参数是期望的收到的ID 作用于FxR1寄存器的高11位
第二个参数mask是 FilterMask :该参数表示CAN ID 过滤的ID中的哪些位是需要判断的 作用于FxR2寄存器的高11位
第三个参数format是 can的模式 :enum CANFormat { CANStandard = 0, CANExtended = 1, CANAny = 2}; 数据帧 扩展帧 还是两者均过滤
第四个参数handle是滤波器序号 :can一共有28个滤波器,选择其中的一个滤波器的序号
该函数默认使用32位的屏蔽位模式。
如果我们想直接收该驱动板的CANID相符的can数据,做如下配置即可
can.filter(CAN_ID, 0xFFFF, CANStandard, 0);
原程序中有一个参数载入的函数,含函数主要是载入一些校准参数 canid之类的参数,但我们需要设置的can滤波器使用到了变量CAN_ID ,如果将can.filter置于该函数之后,那么参数CAN_ID将无效.
按照上图修改即可达到直接收与电调canID相关的数据,屏蔽掉其他ID的数据,从而减少进入can中断的次数,避免高帧率下丢帧、can卡死的现象。
|
|