stm32 can


原文链接: stm32 can

基于STM32的CAN总线通信学习笔记_网络_Qrsleizhipeng的博客-CSDN博客

编程调试心得(总结一些知识要点)

1 对CAN_RX_data的函数定义

如果函数定义成形式:char CAN_RX_data(CanRxMsg* RecieveData , uint8_t *RXdata);会出现如下反应:
i:如果 CanRxMsg RecieveMess; 放在CAN_RX_data函数外,即主函数里,将会多打印出一字符:”接收到数据:AED9i8ua”(会多接收到一个的乱码)
ii:如果 CanRxMsg RecieveMess; 放在函数内,显示正常:”接收到数据:AED9i8ua”

如果函数定义成形式:char CAN_RX_data(CanRxMsg RecieveData , uint8_t *RXdata);,即:RecieveData为非指针。
无论CanRxMsg RecieveMess; 在函数内还是函数外不影响。

分析原因:和形参的指针有关(形参应该为非指针形式)。具体详细原因未解。

2 知识难点(针对过滤器(筛选器)的理解与配置):

如果是接收的数据是标准帧格式:
标准帧ID占用位数为11位, 在发送函数中设置的标准帧ID(StdId)只需为低11位赋值即可,另外高5位可任意。

过滤器的ID号与接收的标准帧ID是左对齐形式(即32位与11位的左对齐),因此过滤器的ID号的高11位有过滤的效果,其他位可设任意值。

举例,如:发送函数配置的标志帧ID:StdId=0xFA8B;则标准帧ID= 010 1000 1011(取最低的11位)
如果在掩码模式的所有位都在检测的情况下,那么过滤器ID号高11位和标准帧ID应该一样,
可以取:CAN_FilterIdHigh=0x516F=010 1000 1011 01111 ( CAN_FilterIdLow 任意)

同理,如果是接收的数据是扩展帧格式:
标准帧ID占用位数为29位,只需对ExtId的低29位赋值即可。
过滤时和过滤ID好也是左对齐,因此过滤器的ID号的高29位有过滤的效果,其他位可设任意值。

3 对过滤器(筛选器)配置方法的改进:

改进:由于以上给帧ID和过滤器ID赋值格式不统一,也不容易计算。为了统一并方便观察,
对取标准/扩展帧ID和过滤器ID的赋值进行如下改进。(最严格情况:掩码模式对所有位都要关心)

举例(标准帧),如程序可设置标准帧ID宏定义为:0xABC(取前11位,最后一位必须取0,不作为标准ID位)。但是,将其写入StdId时,需右移动一位,取出高11位作为有效位:
StdId = 0xABC>>1; //(取出11位)
CAN_FilterIdHigh= 0xABC<<4; //11个有效位移动到最左端(使32位过滤ID与11位标准帧的左对齐)

举例(扩展帧):如程序可设置扩展帧ID宏定义为:0xABCDEF98(取前29位,最后3位必须取0,不作为标准ID位),但是,将其写入ExtId为时,需右移动3位,取出高29位作为有效位:
ExtId = 0xABCDEF98>>3;(取出29位)
CAN_FilterIdHigh = 0xABCDEF98>>16;
CAN_FilterIdLow = 0xABCDEF98&0x0000FFF8 ;//29个有效位移到最高位(使32位过滤ID与29位标准帧的左对齐)

需要注意:
在标准帧下,对于32位的过滤器,设置掩码ID只能关心高11位,后25位不能关心。(掩码ID:0表不关心此位,1表关心此位)
在扩展帧下,设置掩码ID只能关心高29位,后3位不能关心。

`