CAN通信的快速上手实战开发--以STM32F103ZET6基础型产品为例(理论+实操举例)

1、了解什么是CAN通信?CAN通信的用途和主要特点?

CAN(Controller Area Network,控制器局域网络)是一种广泛应用在汽车、工业控制、自动化设备以及其他嵌入式系统中的现场总线标准,由德国博世公司(Bosch)在1983年开发。它是一种用于实时应用的串行通信协议,特别设计用于在各种电子控制单元(ECUs)之间实现可靠的数据交换,这些单元可能分布在车辆、工厂或设备的不同部分。

特点:

多主架构:CAN网络中没有明确的主控设备,任何连接到总线上的节点都可以在适当的时候发起通信,实现了真正的多点对多点通信。

差分信号:CAN总线使用差分信号传输,即两条信号线CAN_High和CAN_Low,提高了抗干扰能力和信号质量。

非破坏性仲裁当多个节点同时尝试发送数据时,CAN协议通过比较报文的标识符(ID)来进行非破坏性的仲裁,具有更高优先级(ID数值小)的报文获得总线使用权,这保证了关键信息的优先传输。

错误检测与校正:CAN协议内置了多项错误检测机制,如位错误、填充错误、CRC错误、形式错误和应答错误检测,以及错误计数和错误通告帧,有助于维护网络的稳定性和可靠性。

数据帧结构:CAN报文包括标识符(用于优先级排序和报文识别)、数据长度代码(DLC)、数据字段(最多8字节)、远程传输请求位(RTR)和错误检测域(如CRC)等部分。

灵活的数据速率:CAN总线支持不同的数据传输速率,从几kbps到几Mbps(如CAN FD技术可支持高达几兆比特每秒),以适应不同应用场景的需求。

2、CAN通信的工作原理

概括:应用程序通过寄存器设置将数据包组装成符合规范的数据帧格式,将其放入发送邮箱(发送FIFO)内。在邮箱内等待发送(称为挂起状态),直到当前邮箱成为了优先级最高的,该邮箱才会将报文发送至总线上,进行仲裁。接收方接收到该报文的时候,首先会通过过滤器组,报文如果含有符合要求的标识符,那么该数据包将会被接收到接收邮箱里(接受FIFO)

以下我们按照发送处理、仲裁机制、帧格式、标识符过滤、接收管理的顺序来详细讲解:

(1)发送处理

应用程序选择空置的邮箱(3个发送邮箱),设置标识符、数据长度和待发送数据,置位发送请求为1(此时不能修改邮箱寄存器)此时称为挂起状态,等待发送状态。发送成功以后,在TSR寄存器产生标志位:请求完成和发送成功,表明一次发送成功。

这里对于发送来说,还会有重传、邮箱优先级,中止发送的问题。

重传可以在寄存器中选择是否在发送失败的时候重传。

邮箱优先级可以根据CAN_MCR寄存器的TXFP位选择是根据标识符的优先级还是发送请求的顺序来发送

(2)仲裁机制

当一条总线上多个结点开始发送报文的时候,需要对发送的先后顺序进行仲裁,不可能允许所有人都在同一时间发送数据,否则势必会造成混乱。(信号处理的基本要求)

这里需要知道对于总线上的电平分为  显性电平(电平 -- 0)和隐性电平(电平 --1)  对于同一条总线,显性电平的级别是高于隐性电平的。(可以理解为 电路中的1碰到0,结果还是0)

在一条总线上如果有2个结点同时想要发送数据,根据前面所述,我们知道一个完整的数据帧里面,会有标识符字段(仲裁段),用以辅助优先级的判断。(优先级数字越小,优先级越高

仲裁段中的ID是主要的判决标准,主要有标准格式和拓展格式(只是位数不同,因为实际的ID数量要求不一样)

标准格式的 ID 11 个位。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)扩展格 式的 ID 有 29 个位。基本 ID ID28 ID18,扩展 ID ID17 ID0 表示。

基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)

仲裁的时候,两个结点发送数据的ID字段部分并不一样。一位一位不断发送的时候,结点1发送隐形电平,结点2也发送隐性电平,则双方无法判断大小;当结点1发送隐性电平,而结点2发送显性电平的时候,这时候结点1显然比较大,那么就退出了发送的优先权仲裁过程

(3)帧格式

如果你熟悉计算机网络这门课程的话,对于帧格式这一说,可能就会比较熟悉。

主要分为帧起始、仲裁段、控制段、数据段、CRC校验段、ACK确认段、帧结束

RTR:是否是远程帧  SRR同;

IDE:标识符选择位 拓展标识符(1)或者标准标识符(0)

r0、r1保留位:显性电平发送(r1在拓展格式里)

DLC:数据长度,最长8个字节;

至于CRC校验和ACK确认,这里不作赘述,只需了解其功能即可。

以上各位都可以在寄存器内进行调整。

(4)标识符过滤(大家最容易懵逼的地方,我在学习的时候也是很懵逼)

我所使用的是STM32F103ZET6  基础型产品,2个接收邮箱共享14个过滤器组;

可变的位宽:每个过滤器组分为标识符寄存器和屏蔽寄存器,每个寄存器实际上都是32位的,但是可以拆分成两种模式:2个16位和1个32位

过滤模式:屏蔽模式和寄存器列表模式

屏蔽模式:1个标识符寄存器和1个屏蔽位寄存器组合使用 (根据上面,可以是2个寄存器都拆成16位的,两两一组,这样就有两组屏蔽模式的过滤器)

其中屏蔽位寄存器的每一位按照 必须匹配 或 无需关心 两种方式来决定上一个标识符寄存器的位(无需关心 就是对这位没有要求  必须匹配就是得一模一样  概念参考掩码)

标识符列表模式:两个寄存器都作为标识符寄存器 (根据上面,如果你都拆分成两个16位寄存器,那就是有4个16位标识符寄存器,不拆分的话,就是2个32位标识符寄存器)

整个寄存器都作为标识符寄存器,每一位都遵循 必须匹配 的原则,实际匹配的时候只要满足其中一个标识符要求即可;

显然,屏蔽模式通过掩码能过滤出一组符合要求的标识符,标识符寄存器列表模式只能过滤出一个标识符

以STM32F103ZET6基础型产品为例,过滤器组的两个寄存器分别是CAN_FxR1   和 CAN_FxR2,这里你可能感到疑惑的是:哪个是屏蔽寄存器,哪个是标识符寄存器

以上这张图很好的展示了在不同的拆分模式下,ID标识符列表寄存器和屏蔽寄存器是如何分配的。

(5)接收管理

1、只有当报文通过了过滤器后才会被接收,否则会被抛弃;

这里有疑惑的地方是报文是按照什么顺序通过过滤器的?

如果过滤器组有优先级配置,那显然是根据优先级;

如果没有,首先是按照匹配标识符,其次是匹配屏蔽模式,相同模式情况下,逐位仲裁,一位一位匹配标识符,首先不符合要求的过滤器将先退出仲裁。

2、以STM基础性产品(与之相对的还有互联型产品,CAN资源更丰富)为例,有2个3级深度的FIFO邮箱(3级深度的意思就是每个邮箱最多可以接收3个报文)

我们以其中一个接收寄存器来看,接收的时候,3级深度的邮箱类似于堆栈,接收的时候需要释放邮箱一次才能访问下一个报文

3、实战开发

关于CAN的寄存器主要分为3类寄存器:1-CAN控制和状态寄存器、2-CAN邮箱寄存器、3-CAN过滤器寄存器;

需要注意的是,CAN相关的寄存器1和3在进行初始化的时候,需要设置先进入初始化模式

下面根据寄存器名称来举例无中断发送状态情况下配置寄存器 的思路:(发送邮箱有3个,我们用邮箱1)

CAN_MCR:先初始化请求;允许自动重传;允许接收溢出;发送优先级根据标识符的优先级来;

CAN_MSR:确认进入初始化模式;CAN模式调整为发送模式;

CAN_TI1R:使用标准标识符、数据帧模式;

CAN_TDT1R:不发送时间戳、发送数据长度为4个字节;

CAN_TDL1R:发送的数据字节低4个字节,填写数据;

CAN_TI1R:请求发送数据;

CAN_TSR(发送状态寄存器,还没发送当然没状态产生)等待发送状态产生,用来确认发送成功;

下面根据寄存器名称举例无中断接收状态下配置寄存器的思路:(接收邮箱有2个,每个可以收3个报文,读取的时候需要读一次释放一次)

CAN_MCR:初始化请求;

CAN_MSR:确认进入初始化模式;CAN模式调整为接收模式;

CAN_RL1R:接收邮箱使用标准标识符、无时间戳;

CAN_RD1R:接收邮箱的接收数据长度位3个字节;

CAN_FMR:过滤器初始化模式;

CAN_FM1R:设置过滤器组0、1、2工作在屏蔽位模式;

CAN_FS1R:过滤器调整为2个16位; (这时候每个32位寄存器单独成16位标识符标识符寄存器和16位屏蔽寄存器)

CAN_FFA1R:将过滤器组关联至FIFO1;

CAN_FiRX:调整过滤器的显性隐性要求,注意这里分屏蔽位和标识符位;(根据上面要求;i=0、1、2,x = 1、2)

CAN_RF1R:查看接收报文树木,选择是否要多次读取。有多个报文或者报文溢出的话,读取需要释放邮箱;

4、总结和个人想法

类似于这种通信其实本质上都是计算机网络这门科目的拓展,其他全靠你会看芯片手册和实操经验;非常推荐各位自学,而不是等待企业的项目经验,能力的提升或许不是一蹴而就,但是一定是日积月累的,以后有机会还会继续更新一些常见接口和嵌入式系统的使用情况,谢谢关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

弃梓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值