rt-thread下CAN通信

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 发送数据----底层原理

  1. 配置主控制寄存器(CAN_MCR):can 工作模式 和 位时序寄存器(CAN_BTR) : 位时序及波特率

  2. 配置发送邮箱:

    寄存器内容
    标识符寄存器(CAN_TIxR)存储发送的报文ID、拓展ID、IDE位、RTR位
    数据长度控制寄存器(CAN_TDTxR)DLC段
    低位数据寄存器(CAN_TDLxR)存储发送的报文数据段的Data0-Data3 四字节内容
    高位数据寄存器 (CAN_TDHxR)存储发送的Data4-Data7 四字节内容
  3. can控制器将数据传入can收发器→数字信号转为为物理信号→发送

6.2 can 发送数据----rt-thread中发送流程

在这里插入图片描述

6.3 can 接收数据----底层原理

  1. can收发器将收到物理信号转为数字信号→can控制器

  2. 筛选器进行过滤 → FIFO邮箱

    FIFO邮箱:

    寄存器内容
    标识符寄存器(CAN_RIxR)存储收到的报文ID、拓展ID、IDE位、RTR位
    数据长度控制寄存器(CAN_RDTxR)DLC段
    低位数据寄存器(CAN_RDLxR)存储收到的的报文数据段的Data0-Data3 四字节内容
    高位数据寄存器 (CAN_RDHxR)存储收到的的Data4-Data7 四字节内容
  3. 筛选器:
    在这里插入图片描述

    模式说明
    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
  4. 读取数据:app读取FIFO邮箱对应寄存器,获取数据

6.4 can接收数据----rt-thread中接收流程

在这里插入图片描述

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VersionGod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值