STM32学习笔记【35.CAN】

📅 2026/7/13 15:11:40
STM32学习笔记【35.CAN】
提示❗️前面学到串口、I2C、SPI三种通信协议这三种通信协议较简单本文CAN通信协议难度大大增加所以主要讲述主要的、常用的内容在实际工作中运用到CAN可结合技术文档再去学习。文章目录一、CAN介绍二、CAN物理层介绍1. 总线拓扑图2. 电平标准3. CAN控制器与收发器三、CAN协议层介绍1. CAN帧种类介绍2. CAN数据帧介绍3. CAN位时序4. CAN仲裁机制四、STM32 CAN 控制器介绍1. CAN控制器介绍2. CAN控制器模式3. CAN控制器框图4. CAN控制器位时序五、CAN寄存器介绍5.1 CAN控制和状态寄存器1. CAN主控制寄存器 (CAN_MCR)2. CAN发送状态寄存器 (CAN_TSR)3. CAN位时序寄存器 (CAN_BTR)5.2 CAN邮箱寄存器1. 发送邮箱标识符寄存器 (CAN_TIxR) (x0..2)2. 发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x0..2)3. 发送邮箱低字节数据寄存器 (CAN_TDLxR) (x0..2)4. 发送邮箱高字节数据寄存器 (CAN_TDHxR) (x0..2)5.3 CAN过滤器寄存器CAN 过滤器模式寄存器 (CAN_FM1R)六、CAN库函数七、 CAN基本驱动流程总结一、CAN介绍CAN协议全称为Controller Area Network控制器局域网络是一种广泛应用的串行通信协议最出由德国BOSCH公司开发并成为国际标准。低速CANISO11519通信速率10~125Kbps总线长度可达1000米。高速CANIOS11898通信速率125Kbps~1Mbps总线长度≤40米。定义CAN协议是一种基于差分信号的异步串行通信协议采用双绞线作为传输介质具有高性能、高可靠性和独特的设计特点。⚠️差分信号用两根线的差值代表信息通过“相减”把共同的干扰消掉从而跑得更快、更稳、更远。特点-多主控制支持多主方式即任何一个节点都可以在总线上发送数据其它节点根据需要进行接收。当两个以上的节点同时开始发送数据时会根据标识符ID决定优先级。-系统柔软性与总线相连的单元没有类似于“地址”的信息因此在总线上增加单元时连接在总线上的其它单元的软硬件及应用层都不需要改变。-通信速度快、距离远数据传输速率较高标准速率为125kbps扩展速率可达1Mbps且通信距离远最远可达10KM速率低于5Kbps。-错误检测与恢复具有错误检测、错误通知和错误恢复功能能够确保数据传输的可靠性。-故障封闭功能能够判断出错误的类型并将引起故障的单元从总线上隔离出去。CAN协议因其高效、可靠的特点被广泛应用于多个领域汽车领域用于实现车辆中各个控制单元ECU之间的通信如发送机控制、车身控制、传动系统控制灯。工业自动化用于机器人、物流设备、生产线灯各种设备之间的通信与控制。航空航天用于飞机中的各种子系统之间的数据通信如飞行控制系统、引擎控制系统、仪表盘、通信系统灯。船舶领域用于实现船舶各种设备的可靠通信包括远程控制、安全监测、航程分析、巡回检测等系统。智能家居连接各种智能设备如照明设备、空调系统、安防系统等实现设备的互联互通。智能医疗连接医疗设备如监护仪、呼吸机等实现设备间的快速通信。二、CAN物理层介绍CAN网络通常由CAN控制器、CAN收发器和双绞线组成。CAN控制器负责处理数据的收发和协议转换。CAN收发器负责将控制器的数字信号转换为差分信号进行传输同时也负责将总线上的差分信号转换为数字信号供控制器处理。终端电阻在高速CAN总线的两端分别连接一个电阻称为终端电阻。终端电阻的主要作用是匹配总线阻抗提高信号质量减少回波反射。一般来说终端电阻的阻值为120Ω。1. 总线拓扑图2. 电平标准CAN使用差分信号进行数据传输根据CAN_H和CAN_L上的电位差来判断总线电平。显性电平表示逻辑0通常CAN_H和CAN_L有2V的压差隐形电平表示逻辑1通常CAN_H和CAN_L有0V的压差。❗️注意通常是显性为1而这里显性电平表示逻辑0.显性电平在通信中具有优先权能够覆盖隐性电平确保数据的正常传输。隐性电平则作为总线的空闲或监听状态存在等待有节点发送数据。3. CAN控制器与收发器TJA1050收发器实物图这里TX与RX不需要交叉接线三、CAN协议层介绍⚠️帧在数字通信中比如以太网、串口、CAN总线数据是一连串的0和1比特流。为了能正确理解这些0和1收发双方必须约定一种格式把比特流切成一个个有意义的段落。这个有完整格式的段落就是帧。⭐可以理解为一个带“带标签”的包裹。你寄一本书用户数据不能直接贴上邮票扔出去得先装进纸箱封装成帧在箱子上写明收件人地址、发件人地址、货物类型帧头信息有时还要在箱底垫上防震泡沫帧尾校验最后才能交给快递公司物理层传输。1. CAN帧种类介绍数据帧Data Frame数据帧是CAN总线上用于传输用户数据的帧包括必要的帧头、标识符、控制位、数据长度代码、数据域、CRC校验码和应答域等部分是CAN通信中最基本和最重要的帧类型。遥控帧Remote Frame遥控帧用于向总线上的其他节点请求发送具有相同标识符的数据帧它没有数据域仅通过标识符来指定所需的数据。遥控帧的帧结构域数据帧相似但缺少数据部分。错误帧Error Frame当CAN总线上的任何节点检测到通信错误时会发送错误帧来通知其他节点。错误帧包含错误标志和错误界定符用于指示错误的存在和类型。过载帧Overload Frame过载帧用于在连续的数据帧或远程帧之间提供额外的延时以指示接收节点尚未准备好接收下一帧。当接收节点因内部条件限制而无法立即接收数据时会发送过载帧来请求发送节点暂停发送。帧间隔Interframe Space帧间隔用于隔离数据帧与前面的帧确保他们之间的时间间隔足够长以避免总线上的冲突和数据丢失。帧间隔包括连续三个隐性位间隔段和可能存在的空闲段用于将数据帧或远程帧与前面的帧分隔开来。2. CAN数据帧介绍数据帧由7段组成。数据帧又分为标准帧CAN2.0A和扩展帧CAN2.0B主要体现在仲裁段和控制段。帧起始Frame Start功能表示数据帧的开始特点由一个显性位Dominant Bit构成此时CAN_H为高电平如3.5VCAN_H为低电平如1.5V二者之间的电位差形成信号。仲裁段Arbitration Field功能确定发送优先级并包含标识符Identifier用于唯一标识发送者和接收者之间的通信关系。组成1. 标准数据帧的仲裁场由11位ID和1位RTR位远程发送请求位组成。RTR位用于区分数据帧显性电平和遥控帧隐性电平。2. 扩展数据帧中还包括SRR位Substituted Remote Request替代的远程请求和IDE位Identifier Extension标识符扩展。SRR位用于指示发送方是否发送了远程请求帧IDE位用于指示标识符字段是否使用了扩展格式29位。控制段Control Field功能包含数据长度代码DLC用于定义数据帧中数据域的长度。特点DLC占4位其取值范围为0到8个字节表示数据帧中包含的数据字节数。数据段Data Field功能包含要传输的数据是数据帧的主体部分。特点数据域的长度可以根据DLC字段的值从0到8个字节不等数据从高位MSB开始传输。CRC段CRC Field功能用于检测数据帧的传输错误。特点CRC循环冗余校验是一种通过对数据进行计算生成的校验码发送方在发送数据帧时会根据数据计算出CRC值并将其添加到数据帧的CRC段中。接收方在接收到数据帧后会重新计算CRC值并与接收到的CRC值进行比较以确认数据在传输过程中是否发生错误。应答段ACK Field功能用来确认数据帧的正常接收组成由ACK槽ACK Slot和ACK界定符两个位构成。当接收节点成功解析了数据帧并确认无误后会在ACK槽中发送一个显性位作为应答信号。帧结束Frame End功能表示数据帧的结束特点由7个连续的隐性位构成标志着数据帧的传输完成。第一个CRC界定符给从机留够充足时间让从机发送应答位否则没有释放总线从机无法发送数据。CRC发送完之后总线控制权放开交给从机从机接手控制权发送显性信号0主机知道数据被接收。第二个CRC界定符同理留出充足空间释放总线主机拿到控制权发来帧结束位发来7个1。扩展格式原来11位标准格式不够用所以扩展成29位。原来的SRR位变成RTR位SRR永远等于1。标准格式比扩展格式优先级高。3. CAN位时序对于计算机来说如何知道波形的某一段是0还是1以一个固定时间去采样看0还是1。固定时间就是位同步机制。CAN总线以“位同步”机制实现对电平的正确采样。位数据都由四段组成同步段SS、传播时间段PTS、相位缓冲段1PBS1和相位缓冲段2PBS2每段又由多个位时序Tq组成。所谓采样点是读取总线电平并将读到的电平作为位值的点。位置在PBS1结束处。CAN总线通过时钟同步机制来确保各个节点在通信过程中保持同步。时钟同步机制包括硬同步和再同步两种硬同步硬同步只在帧的起始位SOF处进行当接收节点检测到帧起始位的下降沿时会将其与自身的位时间进行对齐从而实现同步。CAN总线硬同步只同步一次后面的表也可能会出现错误所以用“再同步”再同步再同步在帧的后续数据位中进行。如果接收节点检测到数据位的跳变沿不在自身的同步段内则会通过延长或缩短相位缓冲段的时间来调整自身的位时间以重新获得同步。再同步时PBS1和PBS2中增加或减少的时间被称为“再同步补偿宽度SJW”其范围1~4 Tq。4. CAN仲裁机制如果有两条数据帧同时发送但只有一个总线那么就需要CAN仲裁机制。CAN总线处于空闲状态最先开始发送消息的单元获得发送权。多个单元同时开始发送时从仲裁段报文ID的第一位开始进行仲裁。仲裁原路如下标识符优先级CAN总线中传输的数据帧的起始部分为数据的标识符ID。这个标识符不仅用于区分消息还表示消息的优先级。在CAN 2.0标准中标识符可以是11位或29位对于扩展帧。标识符的数值越小优先级越高。例如在11位标识符的情况下ID为0x000的消息具有最高优先级而ID为0x7FF的消息具有最低优先级。逐位仲裁当两个或两个以上的节点同时开始传送报文时就会产生总线访问冲突。此时各节点会按照标识符的位顺序逐位进行仲裁。在仲裁过程中每个节点都会将自己发送的电平与总线上的电平进行比较。如果电平相同则节点继续发送下一位如果电平不同则优先级低的节点停止发送而优先级高的节点继续发送。这种仲裁方式是非破坏性的即优先级低的节点在仲裁过程中不会破坏总线上已经存在的数据。显性电平优先在CAN总线上显性电平逻辑0的优先级高于隐性电平逻辑1。因此在仲裁过程中如果某个节点发送的是隐性电平但检测到总线上存在显性电平那么该节点就会知道有更高优先级的消息正在发送并主动停止发送。四、STM32 CAN 控制器介绍1. CAN控制器介绍STM32的bxCAN即基本扩展CANBasic Extend CAN是STM32微控制器系列中的CAN控制器模块。协议支持支持CAN协议2.0A和2.0B的主动模式。高波特率波特率最高可达1Mbit/s。时间触发通信支持时间触发通信功能CAN的硬件内部定时器可以在TX/RX的帧起始位的采样点位置生成时间戳。发送功能具有3个发送邮箱发送报文的优先级特性可软件配置记录发送SOFStart Of Frame帧起始时刻的时间。接收功能具有3级深度的2个FIFOFirst In First Out先进先出队列每个FIFO都可以存放3个完整的报文完全由硬件管理。共有14个位宽可变的过滤器组部分STM32型号可能支持更多由整个CAN共享用于筛选有效报文。记录接收SOF时刻的时间。支持禁止自动重传模式。2. CAN控制器模式CAN控制器的工作模式有三种睡眠模式、初始化模式和正常模式。睡眠模式在睡眠模式下CAN控制器的时钟停止以降低功耗。但软件仍然可以访问邮箱寄存器。初始化模式在初始化模式下禁止报文的接收和发送并且CANTX引脚输出隐性位高电平。此时可以对CAN控制器的相关寄存器进行配置如位时间特性CAN_BTR和控制CAN_MCR等。正常模式作为总线的正常节点可以向总线发送或接收数据。CAN控制器的测试模式有三种静默模式、环回模式和环回静默模式主要用于特定的测试或调试目的以确保CAN控制器的功能正常。1. 静默模式特点在静默模式下CAN控制器可以正常地接收数据帧和远程帧但只能发出隐性位而不能真正发送报文。这意味着虽然CAN控制器在尝试发送数据但实际上它并没有在CAN总线上产生任何显性位因此不会对总线上的其他节点产生影响。应用场景静默模式通常用于分析CAN总线的活动而不会对总线上的其他通信造成干扰。开发人员可以使用此模式来观察总线上的数据流而无需担心他们的测试设备会发送出不必要的报文。2. 环回模式特点在环回模式下CAN控制器会把发送的报文当作接收的报文并保存如果可以通过接收过滤。这意味着当CAN控制器发送一个报文时它会立即在自己的接收缓冲区中看到这个报文就像它是从总线上接收到的一样。应用场景环回模式通常用于自测试以验证CAN控制器的发送和接收功能是否正常。通过发送一个报文并检查它是否被正确接收开发人员可以确保CAN控制器的硬件和固件都按预期工作。3. 环回静默模式特点环回静默模式结合了静默模式和环回模式的特点。在该模式下CANRX引脚与CAN总线断开同时CANTX引脚被驱动到隐性位状态。这意味着虽然CAN控制器在尝试发送报文但它实际上并没有在CAN总线上产生任何显性位并且它会将发送的报文视为接收到的报文。应用场景环回静默模式通常用于“热自测试”即可以在不影响CANTX和CANRX所连接的整个CAN系统的情况下进行测试。这种模式允许开发人员在不干扰总线上的其他通信的情况下验证CAN控制器的发送和接收功能。3. CAN控制器框图CAN空置内核包含各种空置/状态/配置寄存器用于配置CAN控制器的模式、波特率等参数。发送邮箱Transmit Mailbox用来缓存待发送的CAN报文。STM32等微控制器通常具有多个发送邮箱如3个以支持同时缓存多个报文。接收FIFOFirst In First Out缓存接收到的有效CAN报文。CAN控制器通常具有多个接收FIFO如2个以提高接收效率。接收过滤器Receive Filter筛选接收到的CAN报文只将符合特定条件的报文保存到接收FIFO中。这有助于减少CPU的处理负担提高系统的响应速度。STM32两路CAN有主从之分吗bxCAN对外上在CAN总线上是多主模式从来就不是主从模式。STM32有2个bxCAN外设即CAN1、CAN2这两个CAN外设格子都有自己的发送邮箱接收FIFO0和FIFO1但是CAN除了这个之外还有接收过滤器而CAN2没有但是在实际工作中这个接受过滤器时只需要一个并不是两路CAN各自都需要因此CAN2完全可以共享CAN1的接受过滤器CAN1与CAN2共享的512个字节的SRAM只不过在芯片内部通过CAN1的存储器读写控制器间接的访问。上图解释发送调度根据邮箱优先级、报文优先级、报文先后顺序进行发送接收滤波器总线上挂了N个节点每个节点都有数据有些数据不是我们想要的通过接收滤波器有选择性的接收数据。14个发送处理工程接收处理过程有效报文指的是数据帧直到EOF段的最后一位都没有错误且通过过滤器组队标识符过滤。接收过滤器当总线上报文数据量很大时总线上的设备会频繁获取报文占用CPU。过滤器的存在选择性接收有效报文减轻系统负担。STM32的CAN控制器支持配置过滤器组每个过滤器组包含2个32位的寄存器CAN_FxR1和CAN_FxR2用于存储要筛选的ID或掩码。对于STM32C8T6如果只有一个CAN控制器则可以配置14个过滤器组对应的编号为0~13.过滤器可以配置为不同的位宽以适应不同长度的CAN ID。常见的位宽包括16位用于标准帧和32位用于扩展帧。选择模式可设置屏蔽位模式或标识符列表模式寄存器内容的功能就有所区别。屏蔽位模式可以选择出一组符合条件的报文。寄存器内容功能相当于是否符合条件。标识符列表模式可以选择出几个特定ID的报文。寄存器内容功能就是标识符本身。4. CAN控制器位时序注意通信双方波特率需要一致才能通信成功。五、CAN寄存器介绍5.1 CAN控制和状态寄存器1. CAN主控制寄存器 (CAN_MCR)关注INRQ位 初始化请求。软件对该位清’0’可使CAN从初始化模式进入正常工作模式当CAN在接收引脚检测到连续的11个隐性位后CAN就达到同步并为接收和发送数据作好准备了。为此硬件相应地对CAN_MSR寄存器的INAK位清’0’。2. CAN发送状态寄存器 (CAN_TSR)TME2: 发送邮箱2空当邮箱2中没有等待发送的报文时硬件对该位置’1’。TME1: 发送邮箱1空当邮箱1中没有等待发送的报文时硬件对该位置’1’。TME0: 发送邮箱0空。当邮箱0中没有等待发送的报文时硬件对该位置’1’。3. CAN位时序寄存器 (CAN_BTR)SILM: 静默模式(用于调试)LBKM: 环回模式SJW[1:0]: 重新同步跳跃宽度配置位时序的位TS2[2:0]: 时间段2TS1[3:0]: 时间段1BRP[9:0]: 波特率分频器5.2 CAN邮箱寄存器1. 发送邮箱标识符寄存器 (CAN_TIxR) (x0…2)(x0…2)因为有3个邮箱IDE: 标识符选择。该位决定发送邮箱中报文使用的标识符类型。0使用标准标识符1使用扩展标识符。RTR: 远程发送请求0数据帧1远程帧。TXRQ: 发送数据请求由软件对其置’1’来请求发送邮箱的数据。当数据发送完成邮箱为空时硬件对其清’0’。2. 发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x0…2)DLC[15:0]: 发送数据长度该域指定了数据报文的数据长度或者远程帧请求的数据长度。1个报文包含0到8个字节数据而这由DLC决定。3. 发送邮箱低字节数据寄存器 (CAN_TDLxR) (x0…2)一个寄存器保存4个字节也就是32位4. 发送邮箱高字节数据寄存器 (CAN_TDHxR) (x0…2)接收寄存器同理。5.3 CAN过滤器寄存器CAN 过滤器模式寄存器 (CAN_FM1R)注 只有在设置CAN_FMR(FINIT1)使过滤器处于初始化模式下才能对该寄存器写入。FBMx : 过滤器模式过滤器组x的工作模式。0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式1: 过滤器组x的2个32位寄存器工作在标识符列表模式。注位27:14只出现在互联型产品中其它产品为保留位。六、CAN库函数HAL_CAN_Init();// 配置过滤器HAL_CAN_ConfigFilter();HAL_CAN_Start();// 收发数据HAL_CAN_AddTxMessage(); // 发送HAL_CAN_GetRxMessage(); // 接收// 等待发送完成HAL_CAN_GetTxMailboxesFreeLevel();// 等待接收完成HAL_CAN_GetRxFifoFillLevel();七、 CAN基本驱动流程总结前三节主要讲述CAN通信协议的理论知识第四节讲述CAN协议要利用控制器来驱动。第5节和第6节是具体实现要用到的寄存器、库函数以及驱动流程。重点要了解CAN协议层内容为后面实验做准备。