CAN总线工作原理

本文介绍了CAN总线的基本概念,详细解析了CAN报文的标准格式与扩展格式,包括帧起始、标识符、控制场、数据场等内容,并给出了描述CAN消息的数据结构示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    CAN是控制器局域网络(Controller Area Network, CAN)的简称。CAN总线有两条信号线构成,分别是CANL和CANH。相比于RS485总线构成的网络,CAN总线构成的网络更有优势。
CAN的报文格式
    在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。
    在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位 (RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。
    控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。
    应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。
    报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

   

如上图所示,帧格式包括扩展帧和标准帧两种。帧类型包括数据帧和远程帧。数据部分最大长度共8个字节。在编程时,如下的数据结构可以用来描述一个CAN消息:

typedef struct 
{
    uint32_t id;            /**< 29 bit identifier, it depend on "format" value
                                 - if format = STD_ID_FORMAT, id should be 11 bit identifier
                                 - if format = EXT_ID_FORMAT, id should be 29 bit identifier
                             */
    uint8_t dataA[4];       /**< Data field A */
    uint8_t dataB[4];       /**< Data field B */
    uint8_t len;            /**< Length of data field in bytes, should be:
                                 - 0000b-0111b: 0-7 bytes
                                 - 1xxxb: 8 bytes
                            */
    uint8_t format;         /**< Identifier Format, should be:
                                 - STD_ID_FORMAT: Standard ID - 11 bit format
                                 - EXT_ID_FORMAT: Extended ID - 29 bit format
                            */
    uint8_t type;           /**< Remote Frame transmission, should be:
                                 - DATA_FRAME: the number of data bytes called out by the DLC
                                 field are send from the CANxTDA and CANxTDB registers
                                 - REMOTE_FRAME: Remote Frame is sent
                            */
} CAN_MSG_Type;


另外,还有如下图所示的参数可以进行设置。如CAN总线的波特率,工作模式,过滤器里的内容等。














### CAN 总线工作原理 控制器局域网(Controller Area Network,简称 CAN)是一种用于嵌入式系统的串行通信协议,最初由 Bosch 开发并广泛应用于汽车工业中。以下是关于其工作原理的详细介绍: #### 1. 基本概念 CAN 是一种多主总线系统,允许多个节点连接到同一条总线上,并支持实时数据传输。它通过两条差分信号线(CAN_H 和 CAN_L)实现物理层的数据交换[^5]。 #### 2. 数据帧结构 CAN 协议定义了几种不同的消息帧类型来满足各种需求: - **标准帧**:具有 11 位标识符。 - **扩展帧**:提供更长的 29 位标识符以增加地址空间。 每条消息都包含以下几个部分: - 标识符字段:表示优先级以及目标设备地址。 - 控制字段:指定数据长度码 (DLC),指示有效载荷大小。 - 数据字段:实际要发送的信息内容。 - CRC 字段:循环冗余校验用来检测错误。 - ACK 字段:接收方确认机制确保成功传递给定包[^6]。 #### 3. 工作模式 在正常操作期间,任何能够访问共享介质上的资源都可以主动发起通讯请求;然而,在仲裁过程中如果两个或者更多节点试图同时传送,则较高优先权的消息会获得使用权而不会丢失信息完整性因为较低级别者会被自动抑制直到前者完成为止这种特性称为非破坏性逐位仲裁技术[^7]。 #### 4. 错误处理与恢复策略 为了提高可靠性,当发现异常情况比如短路开路过压欠流等问题发生时,内置诊断功能允许快速定位故障源头并通过重新同步过程恢复正常运作状态即使某些组件已经失效也能继续维持整体网络运行不受影响[^8]。 ```python class CanMessage: def __init__(self, identifier, data_length_code, payload): self.identifier = identifier # Message ID / Priority level self.data_length_code = data_length_code # Number of bytes in message body self.payload = payload # Actual transmitted information def send(self): pass # Simulate sending over CAN bus @staticmethod def receive(): return None # Placeholder for receiving messages from CAN bus ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值