目录
CAN通讯:
主要应用功能:
多主机一总线:
一条总线上每个节点都可独立的收发,并且自带仲裁机制,谁优先级高谁先通讯
数据异常校验(自动):
can控制器会自动对要传输的数据进行计算添加crc,对要接收的数据校验crc
高传输速度:
高达1Mbps
高抗干扰:
使用差分信号传输
超长通讯距离:
低速10公里,高速40米
参考资料:
CAN控制器
CAN控制器是CAN通信的“协议处理器”,负责执行CAN协议的相关操作。其主要功能包括:
- 数据帧处理:构建、解析和校验数据帧。
- 仲裁:控制多个节点对总线的访问,优先级较高的节点会先发送数据。
- 错误检测与处理:通过CRC、位错误检测等确保数据的完整性。
- 数据传输控制:发送数据帧和接收数据帧,管理FIFO缓存。
主要任务:生成、解析数据帧,处理协议层的逻辑,包括错误检测、仲裁等。
CAN收发器
CAN收发器负责物理层信号的转换。其功能包括:
- 信号转换:将CAN控制器发送的数字信号转换为差分信号,发送到CAN总线上;将接收到的差分信号转换为数字信号,交给CAN控制器。
- 总线驱动:驱动CAN总线的电平信号,保证信号稳定传输。
- 电平监测:监测CAN总线的状态,确保电平正常,支持高速传输。
主要任务:进行数字信号与差分信号之间的转换,确保数据可靠传输。
数据帧
数据帧用于发送实际的数据,是CAN总线中最常用的帧类型。
字段名称 | 长度 | 描述 |
---|---|---|
起始位(SOF) | 1 位 | 通知总线开始发送数据,所有节点同步检测此位。 |
标识符(ID) | 11 位(标准帧)或 29 位(扩展帧) | 决定消息的优先级(ID越小优先级越高)。 |
控制字段 | 6 位 | 包括帧类型(数据帧)及数据长度代码(DLC)。 |
数据字段 | 0-8 字节 | 实际发送的数据内容(标准CAN最多8字节)。 |
CRC 校验字段 | 15 位 | 用于错误检测,包括 CRC 段(14 位)和 CRC 定界符(1 位)。 |
确认字段(ACK) | 2 位 | 由接收方发送确认信号:1 位 ACK 槽,1 位 ACK 定界符。 |
结束位(EOF) | 7 位 | 固定为隐性位,表示帧结束。 |
间隔段(IFS) | 可变(3 位) | 帧间间隔段,用于节点复位和准备发送下一帧。 |
示例
假设数据帧发送以下内容:
标识符:0x123(标准帧,优先级高)。
数据字段:0xDE, 0xAD, 0xBE, 0xEF
(4 字节)。
数据长度:4 字节(DLC = 4)。
字段名称 | 示例值 | 长度 |
---|---|---|
起始位(SOF) | 0 | 1 位 |
标识符(ID) | 0b000100100011 | 11 位 |
控制字段 | 0b00000100 | 6 位 |
数据字段 | 0xDEADBEEF | 32 位 |
CRC 校验字段 | 0xABCDE | 15 位 |
确认字段(ACK) | 0b10 | 2 位 |
结束位(EOF) | 0b1111111 | 7 位 |
远程帧
远程帧用于请求其他节点发送指定标识符的数据。
字段名称 | 长度 | 描述 |
---|---|---|
起始位(SOF) | 1 位 | 通知总线开始发送远程帧。 |
标识符(ID) | 11 位(标准帧)或 29 位(扩展帧) | 请求数据的消息标识符。 |
控制字段 | 6 位 | 包括帧类型(远程帧)和请求的数据长度代码(DLC)。 |
数据字段 | 0 字节 | 无实际数据内容(远程帧的数据字段为空)。 |
CRC 校验字段 | 15 位 | 用于检测帧传输中的错误。 |
确认字段(ACK) | 2 位 | 与数据帧相同,由接收方发送确认信号。 |
结束位(EOF) | 7 位 | 固定为隐性位,标志远程帧的结束。 |
间隔段(IFS) | 可变(3 位) | 帧间间隔段,用于节点复位和准备。 |
示例
假设远程帧发送以下内容:
标识符:0x456(标准帧)。
请求数据长度:4 字节(DLC = 4)。
数据字段为空。
字段名称 | 示例值 | 长度 |
---|---|---|
起始位(SOF) | 0 | 1 位 |
标识符(ID) | 0b010001010110 | 11 位 |
控制字段 | 0b00001100 | 6 位 |
数据字段 | 空 | 0 位 |
CRC 校验字段 | 0x12345 | 15 位 |
确认字段(ACK) | 0b10 | 2 位 |
结束位(EOF) | 0b1111111 | 7 位 |
错误帧
错误帧由检测到错误的节点发送,用于通知总线上的所有节点发生了错误。
字段名称 | 长度 | 描述 |
---|---|---|
错误标志 | 6 位(主动)或 6 位隐性(被动) | 表示发生错误的节点状态。 |
错误定界符 | 8 位 | 隐性位,用于分隔错误标志与后续字段。 |
示例
假设发送一个主动错误帧:
错误标志:6 位显性位。
错误定界符:8 位隐性位。
字段名称 | 示例值 | 长度 |
---|---|---|
错误标志 | 0b111111 | 6 位 |
错误定界符 | 0b11111111 | 8 位 |
过载帧
过载帧用于通知总线当前节点无法处理接收数据。
字段名称 | 长度 | 描述 |
---|---|---|
过载标志 | 6 位 | 连续显性位,标志总线过载状态。 |
过载定界符 | 8 位 | 隐性位,用于分隔过载帧与其他帧。 |
示例
假设发送一个过载帧:
过载标志:6 位显性位。
过载定界符:8 位隐性位。
字段名称 | 示例值 | 长度 |
---|---|---|
过载标志 | 0b111111 | 6 位 |
过载定界符 | 0b11111111 | 8 位 |
基本初始化可配置选项
-
波特率(Prescaler):
- 决定CAN总线的数据传输速率,通常为125kbps、250kbps、500kbps或1Mbps。
- 通过时钟频率和分频器计算得到,可根据需要调整。
-
工作模式(Mode):
- 正常模式:普通通信模式,节点可正常发送和接收数据。
- 回环模式:自检模式,数据不会发送到总线,而是回传到自身接收。
- 静默模式:监听模式,只接收数据,不发送帧或参与仲裁。
- 静默回环模式:结合回环和静默模式,用于自检和测试。
-
同步跳跃宽度(SyncJumpWidth):
- 定义CAN控制器在时钟不同步时允许的时间调整范围,用于提升总线的抗干扰能力。
- 常见值为1个或2个时间量子(TQ)。
-
时间分段(TimeSeg1和TimeSeg2):
- 决定CAN帧的采样点位置。
- 时间段1(TimeSeg1):采样点之前的信号处理时间,通常较长。
- 时间段2(TimeSeg2):采样点之后的信号处理时间,通常较短。
-
自动功能:
- 自动关闭总线(AutoBusOff):当节点错误过多时,自动从总线中断开,避免影响其他节点。
- 自动唤醒(AutoWakeUp):当总线恢复活动时,节点可自动恢复工作。
- 自动重传(AutoRetransmission):发送失败时自动重试,直到发送成功或达到限制。
过滤器可配置选项
过滤器用于筛选接收的CAN帧,只接收感兴趣的消息,以减少CPU的处理负担。
-
过滤器标识符(Filter ID):
- 定义需要接收的消息标识符,通常为11位(标准帧)或29位(扩展帧)。
-
过滤器掩码(Filter Mask):
- 定义标识符中哪些位需要精确匹配,哪些位可以忽略。
-
过滤器模式:
- 掩码模式:通过掩码选择性接收消息,灵活性较高。
- 列表模式:仅接收明确列出的标识符,精确但范围受限。
-
过滤器位宽:
- 16位过滤器:用于较小标识符范围的筛选(如标准帧)。
- 32位过滤器:用于更大范围或扩展帧的筛选。
-
FIFO分配:
- 定义接收的消息存储在哪个FIFO缓冲区(FIFO0或FIFO1),便于分类处理。
数据帧和发送可配置选项
发送CAN帧时需要设置帧头信息和数据字段。
-
标识符类型:
- 标准标识符(Std ID):11位长度,适合简单网络。
- 扩展标识符(Ext ID):29位长度,适合更复杂的网络拓扑。
-
帧类型:
- 数据帧:用于发送实际数据。
- 远程帧:用于请求其他节点发送指定标识符的数据。
-
数据长度代码(DLC):
- 定义数据字段的字节数,范围为0~8字节(标准CAN)。
-
发送优先级:
- 通过标识符的数值控制优先级,值越小优先级越高。
接收可配置选项
接收帧时,CAN控制器会将帧解析后存入FIFO缓冲区,用户可根据需要进行处理。
-
接收FIFO:
- CAN控制器有两个接收FIFO(FIFO0和FIFO1),可以根据过滤器分配消息存储到不同FIFO中。
-
FIFO模式:
- 锁定模式:FIFO满时丢弃新数据,保留旧数据。
- 覆盖模式:FIFO满时覆盖旧数据,接收新数据。
错误处理可配置选项
CAN总线具有完善的错误检测和处理机制,可以配置相关选项以提高系统可靠性。
-
错误类型检测:
- 位错误:数据位和期望值不符。
- 填充错误:数据填充规则被破坏。
- CRC错误:接收到的数据CRC校验失败。
- 确认错误:未收到其他节点的ACK确认。
-
总线关闭:
- 当节点错误过多时自动关闭,避免影响总线。
-
错误恢复:
- 错误清除后节点可以自动恢复工作。
工作模式扩展功能选项
CAN的基本功能可以通过配置实现更多扩展功能。
-
时间戳:
- 在发送或接收帧时记录时间信息,用于同步或调试。
-
远程帧响应:
- 节点自动响应远程帧请求,发送对应标识符的数据帧。
-
回环自检:
- 配置回环模式进行自测试,检查CAN硬件功能是否正常。
CAN通信协议工作原理
数据帧的构造与发送
CAN总线采用的是非破坏性仲裁和基于优先级的消息传递。其数据帧由多个部分组成,包括起始位、标识符、控制字段、数据字段、CRC校验、ACK确认等。数据帧从控制器发出时,经过CAN收发器驱动到CAN总线上。
发送数据帧的过程简述如下:
- 数据准备:上层应用将数据送入CAN控制器,CAN控制器构建CAN帧(包括标识符、数据字段等)。
- 仲裁阶段:多个节点同时请求发送数据时,CAN协议会根据标识符的优先级进行仲裁。优先级越高(标识符数值越小)的节点可以优先发送数据。
- 发送过程:一旦仲裁成功,CAN控制器将数据帧发送到总线上。数据通过CAN收发器转换为差分信号,在总线上传输。
总线仲裁
在多节点的CAN网络中,多个节点可能同时尝试发送数据。CAN采用非破坏性仲裁机制来避免冲突。
- 每个数据帧的标识符包含优先级信息,标识符越小,优先级越高。
- 当多个节点同时发送数据时,它们会从标识符的高位开始比较。低优先级的节点在发现自己发送的标识符较大的时候,会立即停止发送,从而避免冲突。
- 由于CAN总线的仲裁是基于位的(bit-wise arbitration),这使得数据传输不会丢失,也不会破坏总线的其他通信。
错误检测与处理
CAN总线采用多种错误检测机制,确保数据传输的可靠性:
- 位错误检测:通过检测每一位的值是否符合预期来发现错误。
- 填充错误检测:用于检测数据传输过程中是否违反了位填充规则(连续5个相同的位时,必须插入反向的填充位)。
- CRC校验:通过对数据帧进行CRC校验,检测传输过程中是否发生错误。
- 确认错误检测:接收节点在成功接收数据后通过ACK位进行确认。如果发送节点没有收到确认,表明数据发送失败。
在出现错误时,CAN控制器会通过错误标志告知上层应用,并根据配置执行错误处理,如重新发送数据、关闭总线等。
总线通信的典型工作流程
数据发送
- 数据生成:应用层或上层协议生成需要发送的数据,送入CAN控制器。
- 帧构建:CAN控制器将数据封装成CAN帧,包括起始位、标识符、数据、CRC校验等。
- 仲裁:如果多个节点同时请求发送,CAN控制器进行标识符优先级仲裁,优先级低的节点退让。
- 数据传输:数据帧经过CAN控制器驱动,通过CAN收发器转换为差分信号在总线上传播。
- 确认接收:接收节点解析数据帧,并发送ACK确认帧。如果未收到ACK确认,则重新发送数据。
数据接收
- 信号接收:CAN收发器接收总线上的差分信号并转换为数字信号。
- 帧解析:CAN控制器对接收到的数据进行解析,提取标识符、数据字段等。
- 错误检测:CAN控制器对接收到的数据进行CRC校验、位错误检查等,确保数据的完整性。
- 数据传递:如果数据帧有效,CAN控制器将数据传递给上层应用处理。
注意点:
CAN通讯的竞争,优先级等先进的功能是通过CAN控制器完成的,我们难以撰写底层的驱动程序,我们是根据芯片厂家提供的sdk寻找CAN通讯配置示例,按照同样的方式去配置CAN控制器,数据收发都是通过can控制器直接传递到芯片内存中。要注意是,这个和串口通讯是不太一样的,串口通讯或许我们还能通过配置内部的寄存器调整波特率,校验位等,但CAN通讯太复杂了,一般只能依靠厂家的写好的CAN驱动去使用,无法配置寄存器,厂家一般也不给这部分的寄存器信息。配置好CAN控制器后,我们需要收发的数据会直接出现在你设定的内存位置上面。