stm32之CAN

简介: stm32之CAN

一、can的五种帧:


1.数据帧,包括七段,帧起始,仲裁段,控制段,数据段,校验段,ACK段,结束段。


2.遥控帧,只发送ID,不发送数据,请求对方回复数据。


3.错误帧


4.过载帧


5.帧间隔


注:显性电平对应逻辑0,CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1,CAN_H和CAN_L之差为0V


数据帧和遥控帧有标准帧和扩张帧两种格式,一个11位,一个29位。


二、CAN波特率设置


位速率:由发送单元在非同步时发送的每秒钟的位数。


一个位可以分为四段,同步段,传播时间段,相位缓冲段1,相位缓冲段2,这些段有可以由可称为Tq的若干最小时间段构成。1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。


1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。STM32把传播时间段和相位缓冲段1(STM32称之为时间段1)合并了,所以STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。STM32的BS1段可以设置为1~16个时间单元,刚好等于我们上面介绍的传播时间段和相位缓冲段1之和。STM32的CAN位时序如图3所示:


image.png

image.png

image.png

三、CAN总线屏蔽滤波


STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(互联型),但是STM32F103ZET6只有14个(增强型),每个滤波器组x由2个32为寄存器,CAN_FxR1和CAN_FxR2组成。


STM32每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

● 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位

● 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

此外过滤器可配置为,屏蔽位模式和标识符列表模式。


在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。


而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。


滤波过程举例:

现有ID号为001,002,003,004的4个CAN,他们都能发送、接收广播报文。站在CAN002号角度看,它所能接受到报文的ID是通过滤波器滤波后的ID号,即这里将过滤方式分两种,一是002号能接收多个ID报文(屏蔽滤波模式),二是002号只能接收一个ID报文(标识符列表模式)。


屏蔽滤波模式:

标识符寄存器:0 0 1

屏蔽寄存器: 1 0 1

报文ID号: 0 0/1 1

如果设置标识符寄存器和屏蔽寄存器为001和101;屏蔽滤波模式的作用是如果屏蔽寄存器某位上出现了1,则报文ID号对应的那位要与标识符寄存器那位一致,即“必须匹配”原则,所以标识符寄存器第一位0,报文ID号第一位也必须为0,因为屏蔽寄存器第一位为1,类似的第三位也是这样。如果屏蔽寄存器某位上出现了0,则报文ID号对应的那位可与标识符寄存器那位不一致也可以一致,即“不用关心”原则,第二位由于屏蔽寄存器上为0,所以报文ID号可以与标识符寄存器上的0一致也可以不一致,故报文ID号第二位为0/1。所以002号(010)可以接受来自001号(001)和003号(011)的报文。


标识符列表模式:将设置的屏蔽寄存器改为标识符寄存器

标识符寄存器:0 0 1

标识符寄存器: 0 0 1

报文ID号: 0 0 1

如果设置2个标识符寄存器为001和001;报文ID号必须与这两个标识符寄存器所对应的位相等。所以002号CAN只能接受001号的报文。


下图5是CAN_FMR寄存器,可以配置过滤器组的寄存器位数16还是32位,工作模式以及它和标准帧、扩展帧位数的对应关系,方便我们在不同的帧模式(标准数据帧、扩展数据帧、标准远程帧、扩展远程帧)下对报文ID进行过滤。


image.png

四 CAN的发送与接收流程


4.1CAN 发送流程

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符、数据长度和待发送数据;然后CAN_TIxR寄存器的TXRQ位置1,来请求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。当CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。邮箱中的报文被成功发送后,它马上变为空邮箱,硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,此时可以设置发送中断(入口地址:USB_HP_CAN_TX_IRQChannel()),进入中断置can_tx_flag_success=1,来表明一次成功发送。


4.2CAN接收流程


接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。接收相关的中断条件:


一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求,可以进入接收中断读取接收的数据(入口地址:USB_LP_CAN_RX0_IRQChannel())。


当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。

在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求。

目录
相关文章
|
数据安全/隐私保护
STM32的HAL库开发系列 - CAN通信实例
STM32的HAL库开发系列 - CAN通信实例
921 0
STM32的HAL库开发系列 - CAN通信筛选器
STM32的HAL库开发系列 - CAN通信筛选器
428 0
|
存储 开发工具 IDE
stm32之CAN发送、接收详解
CAN接收报文并过滤之标识符过滤:(重点、难点)   在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
1874 0
|
数据安全/隐私保护 网络架构
stm32之CAN总线基础
can总线协议概述:   CAN是Controller Area Network的缩写,由德国博世公司开发;CAN通过ISO11891以及ISO11519进行了标准化;        CAN总线的特点:     1、多主控制       在总线空闲时,所有单元都可以开始发送消息(多主控制);       最先访问总线的单元获得发送权(辨别方式:“CSMA/CA方式”);       多个单元同时开始发送时,发送高优先级ID消息的单元可获得发送权;     2、消息的发送       在can协议中,所有消息都是以固定格式发送。
1517 0
|
存储 编解码 调度
stm32内部的CAN总线
功能概述:   bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B;它的设计目标是以最小的CPU负载来高效处理大量的报文。它也支持报文发送的优先级要求(优先级可软件配置)。
1234 0
|
2月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
305 0
|
3月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
204 2
|
4月前
|
传感器
|
3月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
377 4
|
3月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
109 1