文章目录
CAN 学习笔记
一. 例子说明
使用的是 spark-1\sdk-bsp-stm32f407-spark\projects\03_driver_can下的工程
二. 实物连接
二块星火一号开发板的CAN_L与CAN_L相连,CAN_H与CAN_H相连,如下图所示:
三. 实验现象
一个开发板在shell中调输入 can_sample_send 开启发送线程
can_sample_send
一个开发板在shell中输入 can_sample_receive 开启接收线程
can_sample_receive
可以看到开启接收线程那块开发板的串口一直打印接收到的数据,如下图,符合预期。
四. can 报文一些关键位
标识 | 说明 |
---|---|
ID: | 标准ID :11位,扩展ID : 28 位 |
RTR: | 0 : 数据帧,1:遥控帧 |
IDE : | 0: 标准帧,1:扩展帧 |
DLC: | 表示数据长度 (0~8字节) |
五. can 波特率
位时序:
波特率 = APB1时钟频率 / 分频系数 / (1*tq + tbs1 + tbs2)
六. can 通信流程
6.1 can 发送数据----底层原理
-
配置主控制寄存器(CAN_MCR):can 工作模式 和 位时序寄存器(CAN_BTR) : 位时序及波特率
-
配置发送邮箱:
寄存器 内容 标识符寄存器(CAN_TIxR) 存储发送的报文ID、拓展ID、IDE位、RTR位 数据长度控制寄存器(CAN_TDTxR) DLC段 低位数据寄存器(CAN_TDLxR) 存储发送的报文数据段的Data0-Data3 四字节内容 高位数据寄存器 (CAN_TDHxR) 存储发送的Data4-Data7 四字节内容 -
can控制器将数据传入can收发器→数字信号转为为物理信号→发送
6.2 can 发送数据----rt-thread中发送流程
6.3 can 接收数据----底层原理
-
can收发器将收到物理信号转为数字信号→can控制器
-
筛选器进行过滤 → FIFO邮箱
FIFO邮箱:
寄存器 内容 标识符寄存器(CAN_RIxR) 存储收到的报文ID、拓展ID、IDE位、RTR位 数据长度控制寄存器(CAN_RDTxR) DLC段 低位数据寄存器(CAN_RDLxR) 存储收到的的报文数据段的Data0-Data3 四字节内容 高位数据寄存器 (CAN_RDHxR) 存储收到的的Data4-Data7 四字节内容 -
筛选器:
模式 说明 32位掩码模式 CAN_FxR1存储ID,CAN_FxR2存储哪个位必须与CAN_FxR1中ID一致,2个寄存器表示一组掩码 32位标识符模式 CAN_FxR1和CAN_FxR2各存储一个ID,2个寄存器表示2个筛选的ID 16位掩码模式 CAN_FxR1高16位存储ID,低16位存储的哪个位必须要与高16位的ID一致;CAN_FxR2高16位存储ID,低16位存储哪个位必须要与高16位ID一致;2个寄存器表示2组掩码 16位标识符模式 CAN_FxR1和CAN_FxR2各存储2个ID,2个寄存器表示4个筛选的ID -
读取数据:app读取FIFO邮箱对应寄存器,获取数据