CAN通讯的调试不单是软件上的调试,也须要对硬件进行检查。
原文连接:http://www.javashuo.com/article/p-ojnggxjz-nk.htmlhtml
在调通以前一直有两个疑惑干扰判断:(结论在文末)
1.不一样的CAN芯片是否存在不兼容。
2.不一样型号的STM32是否CAN通讯是否存在差别。函数
STM32F1与STM32F4之间CAN通讯的调试过程(仅以STM32F1做介绍[标准库]):
1.肯定引脚与资源spa
这里咱们使用PB八、PB9来做为CAN通讯引脚,单片机上使用CAN1,注意更改引脚映射。设计
GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
2.肯定波特率
咱们须要获得的波特率为1Mbps,用户手册上波特率的计算方法以下:
这里看起来比较复杂,展开后为:BaudRate=1/((BRP[9:0]+1)*(1+TS1[3:0]+1+TS2[2:0] + 1)*tPCLK);
因为CAN1挂在在APB1上,tPCLK1为APB1的外设周期,须要知道其频率fPCLK1。3d
a.求取频率
若是使用标准库能够采用在main函数加两行代码:调试
RCC_ClocksTypeDef get_rcc_clock; RCC_GetClocksFreq(&get_rcc_clock);
并在调试界面中查看(右键去掉勾选便可查看10进制数)
PCLK1为36MHz即APB1外设频率为36MHz。code
如使用CubeMX生成代码,能够方便查看时钟树配置(强烈建议入门STM32的新人尝试CubeMX,能够直观地理解STM32的时钟树)htm
b.设定波特率blog
在标准库中CAN通讯初始化中有:资源
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler=2;
其中SJW、BS一、BS2分别对应(BRP[9:0]+1)、(TS[3:0]+1)、(TS2[3:0]+1);
当咱们设定BRP[9:0]为0时公式能够简化为,BaudRate=1/((1+TS[3:0]+1+TS2[2:0] + 1)*tPCLK)=1/(1+BS1+BS2)/tPCLK;(这就是为什么SJW一般取CAN_SJW_1tq)
考虑分频系数Pre=fPCLK1/fPCLK,fPCLK为CAN1的频率:
BaudRate=fPCLK1/((1+BS1+BS2)*Pre);前提SJW取CAN_SJW_1tq;
例如:系统主频72MHz、APB1外设时钟频率fPCLK1=32MHz,当我取SJW=CAN_SJW_1tq,BS1=CAN_BS1_9tq,BS2=CAN_BS2_8tq时BaudRate=32/((1+9+8)*2)=1MHz;
关于疑惑:
因为STM32F1的板子是本身设计并选了新的CAN芯片(便宜),因此一开始会怀疑是CAN芯片的问题。若是两个CAN都芯片支持咱们所需求的波特率,实际上都可以通讯的,问题在于个人两个设备CAN芯片都是5V供电,而我在调试时其中一个设备直接使用调试器3.3V供电,致使其没法正常工做,因此一直不能收发信息。固然后来发现这个问题以后,使用电源同时给两个设备供电CAN通讯就成功了。
另外一个关于不一样型号STM32没法进行CAN通讯的疑惑主要来源于网上的某帖子,仅仅依据芯片主频不一致而得出这样的结论,彻底是无稽之谈。通常多个STM32之间CAN通讯,只要硬件没问题,同时保证波特率一致,通讯上不会有太大问题。