由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。
首先我们要明确几个概念:
波特率:can 1s传输的位数,其单位为bps。
Time-quantum(简称TQ):意思是一个时钟周期(1/时钟周期),1位数据由若干个TQ组成。
波特率的计算公式为,CAN波特率 = APB总线频率/BRP分频器/(1+tBS1+tBS2)
由于公式中涉及到CAN的时钟,所以我们首先需要了解CAN挂载在哪条总线下,并且该总线的时钟频率是多少。此处采用STM32F103进行举例,从下图中的用户手册中的系统架构可知,基本扩展CAN总线bxCAN挂载在APB1总线,从下下图中的用户手册中的时钟树可知APB1总线的时钟频率为36MHz。
以下面的STM32F103的代码为例,其CAN时钟频率为APB1=36MHz,BRP分频器设置为CAN_Prescaler=4,tBS1=CAN_BS1=BS1_5tq,tBS2=CAN_BS2=BS2_3tq
所以通过公式可以计算得出波特率=36000000/4/(1+5+3)=1000000=1 MBsp
/* ss=1 bs1=5 bs2=3 位时间宽度为(1+5+3) 波特率即为时钟周期tq*(1+3+5) */
CAN_InitStructure.CAN_BS1=CAN_BS1_5tq; //BTR-TS1 时间段1 占用了5个时间单元
CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; //BTR-TS1 时间段2 占用了3个时间单元
/* CAN Baudrate=36/4/(1+5+3)=1MBps (1MBps已为stm32的CAN最高速率) (CAN时钟频率为APB1 = 36 MHz) */
CAN_InitStructure.CAN_Prescaler =4; //BTR-BRP 波特率分频器 定义了时间单元的时间长度