CAN总线波特率计算方法(AHB:72MHz/APB1:36MHz)CAN外设挂载在APB1 上
CAN位时序(波特率计算方法)总结
Q 时间量子数
QT 时间量子
SS 同步段
TPS 传播时间段
Tpbs1 相位缓冲段1
Tpbs2 相位缓冲段2
TBS1 Tpbs1 + TPS //因为编程时ST库中的结构体把Tpbs1和TPS加在一起作为TBS1
BRP CAN的预分频系数
FCLK CAN挂载总线时钟
Baudrate 想要的CAN波特率
Q * BRP(未知)=FCLK / Baudrate(已知)
Q = TBS1 (Tpbs1+TPS) + Tpbs2+SS (1QT)
采样点 = (TBS1 + SS) / Q
注:采样点最好在80%左右(500K---80%),波特率增大比例降低,CIA推荐采样点85%-90%。
期望在SS段切换电平,若电平切换提前则增长PBS1段,若电平切换延后则缩短上一帧的PBS2。
2022年3月9日20:50:54
帧格式
RTR 0是数据帧,1是遥控帧
IDE 0是标准帧,1是扩展帧
R0和R1 接收位(保留位),默认显性电平
一位显性电平0起始,7位隐性电平1结束
bxCAN :扩展的基本模式CAN
SOF :帧起始
标准标识符:11位
扩展标识符:29位
FIFO:先入先出存储器,有六个脚分别是读使能、写使能、数据入、数据出、FIFO满、FIFO空。
CAN2 的开始滤波器编号 n 是通过写入CAN FMR 寄存器的 CAN2SB[5:0]配置的。
BxCAN模式
工作模式
初始化模式
INRQ:软置一入
INAK:硬一,入成功
ACK:硬一,请求入的响应
正常模式
SYNC:硬检测11连隐(总线空闲),可入正常
睡眠模式
SLEEP:软置一入
SLAK:硬一,入成功
ACK:硬一,请求入的响应
若AWUM=1则硬件检测总线活动硬件将SLEEP清0入正常(AWUM硬件唤醒允许位)
总结:!SLEEP+!INRQ+SYNC(硬)则入正常,SLEEP+!INRQ+ACK(硬)则入睡眠,!SLEEP+INRQ+ACK(硬)则入初始化。
测试模式
回环模式
CAN_BTR_LBKM=1入回环,可发不可收,有回环,RX断
静默模式
CAN_BTR_SILM=1入静默,可收不可发,有回环,TX隐
回环静默模式
CAN_BTR_SILM=1&&CAN_BTR_LBKM=1入,不可收不可发,有回环,RX断TX隐
发送流程
有三个邮箱,两个3级深度接收FIFO(一个邮箱存一报文,一级深度存一个报文)
- 选择一个空的邮箱把报文ID、数据长度、数据放进去(software)
- CAN_TIXR_TXRQ = 1,发送请求(software)
- 邮箱挂号,等待成为最高优先级(hardware)
- 成为最高优先级,预定(hardware)
- CANBus空闲(11连隐)发送,邮箱空(hardware)
- -------------------------------------------------------------------------------------------------------
- 发送成功RQCP&&TXOK = 1,RQCP只要流程执行完就为1(不管成功失败),TXOK只有成功发送才为1。(hardware)
- 若总线仲裁引发失败:CAN_TSR_ALST = 1(可设置自动重发)
- 若发送错误引起失败:CAN_TSR_TERP = 1(可设置自动重发)
- 发送优先级:CAN_MCR_TXFP = 0,ID小的先发,ID相同低邮箱先发
- 发送优先级:CAN_MCR_TXFP = 1,位FIFO模式邮箱,先放入邮箱的先发出
- 邮箱空标志位:TME = 1,邮箱空(hardware)
- 终止发送请求:ABRQ = 1,若邮箱处于挂号或预定状态则直接清空邮箱TXOK = 0,RQCP =1,若邮箱处于发送状态并且发送成功则TXOK = 1,RQCP =1,自动清空邮箱。不管怎样只要将中止位置1,邮箱都会被清空。
- 自动重传:NART = 1(禁止自动重传)
-
接收邮箱空标志:FOVR = 0为空,FOVR = 1为邮箱中存在有效报文。
接收报文数量标志位:CAN_RFR_FMP[1:0]中存储接收邮箱中报文数量。
邮箱释放标志:RFOM = 1释放最深处的邮箱。
禁用FIFO锁定:CAN_MCR_RFLM = 0,引发溢出的那条消息会覆盖最后接受的消息。
启用FIFO锁定:CAN_MCR_RFLM = 0,引发溢出的那条消息会被丢弃。