十九冶成都建设有限公司网站帝国cms做的网站
十九冶成都建设有限公司网站,帝国cms做的网站,上海建设部网站,网站文章列表模板CAN总线概述
CAN总线#xff08;Controller Area Network#xff0c;控制器局域网络#xff09;是多主控、串行通信的总线标准#xff0c;由德国博世#xff08;Bosch#xff09;公司于1980年代为汽车电子系统研发#xff0c;初衷是解决汽车内部各控制单元#xff08;发…CAN总线概述CAN总线Controller Area Network控制器局域网络是多主控、串行通信的总线标准由德国博世Bosch公司于1980年代为汽车电子系统研发初衷是解决汽车内部各控制单元发动机、刹车、空调等间布线复杂、通信低效的问题核心优势是高可靠性、强实时性、低成本。目前除汽车电子外已广泛应用于工业自动化、楼宇控制、医疗设备、轨道交通、船舶电子等领域核心实现多节点通过单一总线完成实时数据共享。CAN总线协议规范CAN协议分为物理层和数据链路层物理层定义底层硬件传输规则数据链路层定义数据帧格式、仲裁、错误处理等逻辑规则是CAN通信的核心。物理层物理层是CAN总线的硬件基础定义了传输介质、信号电平、拓扑结构、通信速率等关键参数确保数据在物理总线上的可靠传输。传输介质CAN总线首选带屏蔽层的双绞线也可使用光纤、同轴电缆三者核心区别如下双绞线的CAN_H、CAN_L传输差分信号是抗干扰的核心设计传输介质特点适用场景备注双绞线推荐带屏蔽层双线路传输差分信号抗干扰能力强汽车电子、工业控制等常规CAN网络总线两端需接120Ω终端电阻匹配特性阻抗光纤抗电磁干扰极强传输距离远信号衰减小强电磁干扰环境工厂电机、高压设备区需专用光纤收发器成本较高同轴电缆单芯屏蔽结构特性阻抗50Ω/75Ω抗干扰中等特定工业场景、早期CAN应用传输速率/距离介于双绞线与光纤之间信号电平CAN总线通过CAN_H高电平线和CAN_L低电平线的差分电压判断逻辑电平仅分为显性电平逻辑0和隐性电平逻辑1显性电平可强制覆盖隐性电平优先级更高高速CAN的电平标准为逻辑状态CAN_H电压CAN_L电压差分电压总线状态显性电平03.5V1.5V2V有节点主动发送数据隐性电平12.5V2.5V0V总线空闲/低优先级节点发送拓扑结构CAN总线采用总线型拓扑所有节点并联在主干总线上分支线长度≤0.3米避免信号反射理论支持110个节点实际建议≤30个保证可靠性高速CAN和低速CAN的拓扑设计不同高速CANISO 11898闭环结构总线两端接120Ω终端电阻吸收信号反射防止波形失真适用于对速率要求高的场景如发动机控制低速CANISO 11519-2开环结构总线两端接2.2kΩ终端电阻搭建简便、成本低适用于对速率要求低的场景如车身灯光、电动窗。通信速率CAN总线的通信速率由ISO标准界定ISO 11898高速为125kbps~1Mbps实际推荐最高500kbps保证可靠性ISO 11519-2低速为125kbps以下速率与总线最大长度成反比速率越高传输距离越短。汽车领域按速率将CAN分为四类应用适配不同系统需求ISO标准核心区别ISO 11898高速和ISO 11519-2低速在数据链路层定义一致物理层差异显著核心参数区别如下专用驱动IC高速CAN和低速CAN因物理层规格不同需搭配专用驱动IC收发器核心配套型号如下标准对应驱动ICISO 11898高速HA13721RPJE、PCA82C250、Si9200、CF15ISO 11519-2低速PCA82C252、TJA1053、SN65LBC032数据链路层数据链路层是CAN总线的逻辑核心定义了帧结构、仲裁机制、时序分析、同步方式、错误处理等规则核心是将数据打包为帧进行传输确保多节点通信的有序、可靠。帧的类型CAN总线通过5种基本帧类型实现节点间通信协调其中数据帧、遥控帧有11位ID标准帧和29位ID扩展帧两种格式5种帧的核心作用和特点如下帧类型核心作用关键特点数据帧发送节点向接收节点传输实际数据CAN核心帧含数据段分标准/扩展格式遥控帧接收节点向目标节点请求数据无数据段ID需与目标数据帧一致RTR位为1错误帧节点检测到传输错误时通知其他节点无ID/数据段分主动/被动强制中断异常传输过载帧接收节点因忙碌缓冲区满通知发送节点延迟传输流量控制机制非错误处理仅在帧间隔发送帧间隔分隔连续的数据帧/遥控帧为接收节点预留处理时间避免帧冲突数据帧用于传输实际数据的核心帧标准格式11位ID的字段结构为7个部分扩展格式仅仲裁段增加18位扩展ID其余字段一致标准格式字段详情字段名称位数功能描述帧起始SOF1单个显性位0标志帧传输开始实现节点同步仲裁段1211位ID越小优先级越高MSB1位RTR位固定0区分遥控帧控制段61位IDE位0标准帧1位保留位4位DLC位0~8指示数据字节数数据段0~64传输的有效数据长度由DLC决定最大8字节CRC段1615位CRC校验码1位隐性界定符检测传输错误ACK段2包含1位ACK槽发送节点发送隐性位1接收节点正确接收后发送显性位0应答和1位ACK界定符隐性位1帧结束EOF77个连续隐性位1标志帧传输结束帧起始结构固定为1 个位的显性电平逻辑 0是数据帧传输的起始标志核心作用实现总线上所有节点的通信同步让所有节点统一识别帧传输的开始时刻总线逻辑CAN 总线执行 逻辑线 “与”规则显性电平具有绝对优先级—— 只要有一个节点输出显性电平总线整体即为显性电平仅当所有节点都输出隐性电平时总线才为隐性电平逻辑 1。仲裁段核心作用定义数据帧的优先级解决 CAN 多主通信模式下多节点同时发送的总线冲突采用非破坏性仲裁机制仲裁失利节点仅停止发送不破坏已传输数据无数据丢失格式差异标准格式共 12 位包含11 位 ID1 位 RTR 位远程发送请求位数据帧固定为 0显性电平扩展格式共 32 位包含 11 位基本 ID1 位 SRR 位 1 位 IDE 位 18 位扩展 ID1 位 RTR 位整体为 29 位 ID3 位控制位仲裁规则位逐位比较显性位0优先于隐性位1ID 值越小显性位占比越高优先级越高扩展格式仲裁时先比较 11 位基本 ID基本 ID 相同时再比较 18 位扩展 ID确保优先级唯一标准格式 11 位 ID 有硬性规定高 7 位禁止全为隐性电平1即禁止 ID1111111XXXX避免 ID 识别混淆保障数据传输的有效性特殊仲裁同 ID 的数据帧与遥控帧竞争时数据帧 RTR0显性优先于遥控帧 RTR1隐性。控制段结构固定为6 个位标准格式与扩展格式的构成略有差异核心包含IDE 位标识符扩展位、保留位r0/r1、DLC 位数据长度码各子位规则IDE 位标准格式固定为 0显性扩展格式固定为 1隐性用于区分帧格式保留位标准格式为 r0扩展格式为 r0r1发送方必须以显性电平发送接收方可接收显性、隐性或任意组合电平为协议后续扩展预留DLC 位占4 个位是数据长度码用于指示数据段的有效字节数仅支持0~8 字节接收方对 DLC9~15 的情况不视为错误仅按实际数据字节数解析核心作用传递帧格式标识、数据段长度信息为协议扩展预留空间是数据帧与后续数据段的 “衔接字段”。数据段结构长度为0~8 字节0~64 位由 DLC 位的数值决定0 字节表示无有效数据传输核心作用承载 CAN 总线传输的实际有效数据如传感器采集的数值、设备的控制指令、状态信息等传输规则数据传输遵循MSB最高位优先原则即从数据的最高位开始依次发送。特点是数据帧的核心载荷段也是 CAN 总线通信的最终数据载体字节长度灵活适配不同场景的传输需求。CRC 段结构固定为16 个位包含15 位 CRC 顺序CRC 校验码1 位 CRC 界定符固定为隐性电平 1核心作用检测帧传输过程中的错误如信号干扰、位翻转等是 CAN 总线的核心检错机制校验规则采用15 位 CRC 多项式进行计算生成多项式为x15x14x10x8x7x4x31CRC 校验码的计算范围包含帧起始、仲裁段、控制段、数据段的所有位流发送方按上述规则计算 CRC 值并随帧发送接收方以相同算法重新计算若二者不一致接收方判定传输错误并立即发送错误帧。CRC 界定符固定为隐性电平用于分隔 CRC 校验码与后续的 ACK 段避免字段混淆。ACK 段结构固定为2 个位包含1 位 ACK 槽1 位 ACK 界定符固定为隐性电平 1核心作用确认数据帧是否被正确接收是 CAN 总线的核心应答机制保障数据传输的可靠性应答规则发送方在 ACK 段的两个位均发送隐性电平1总线上所有接收到正确帧无 CRC 错误、格式错误等的节点在ACK 槽发送显性电平0通过显性电平覆盖发送方的隐性电平完成 “应答”若发送方在 ACK 槽检测到的是隐性电平说明无节点正确接收该帧判定传输失败触发自动重发机制ACK 界定符固定为隐性电平用于分隔 ACK 槽与后续的帧结束段标志应答过程结束。帧结束结构固定为7 个连续的隐性电平1是数据帧传输的结束标志核心作用明确界定单帧数据的传输边界避免相邻帧的数据混淆、错误拼接降低通信错误概率为接收节点预留短暂的处理时间让接收节点完成当前帧的解析、存储后再准备接收下一帧特点7 个连续隐性电平是数据帧的固定结束标识总线上所有节点检测到该字段后判定当前帧传输完成总线进入帧间隔阶段。遥控帧用于请求数据无数据段标准格式字段与数据帧基本一致核心差异为RTR位固定1DLC位需与目标数据帧一致指示期望接收的字节数传输流程接收节点发送遥控帧指定ID和DLC经总线仲裁后目标发送节点收到请求发送节点发送同ID、同DLC的数据帧接收节点解析数据帧完成数据获取。字段名称位数功能描述帧起始SOF1单个显性位0标志帧传输开始与数据帧相同仲裁段12包含1) 11位ID与目标数据帧的ID一致用于指定请求的数据对象2) 1位RTR位远程发送请求位遥控帧固定为1与数据帧的RTR0形成区分控制段6包含1) 1位IDE位标识符扩展位标准格式固定为02) 1位r0位保留位固定为03) 4位DLC位数据长度码需与请求的数据帧DLC一致指示期望接收的数据字节数CRC段1615位CRC校验码 1位CRC界定符隐性位1与数据帧结构相同ACK段21位ACK槽接收节点应答显性位0 1位ACK界定符隐性位1与数据帧相同帧结束EOF77个连续隐性位1标志帧传输结束与数据帧相同错误帧节点检测到传输错误时发送由错误标志和错误界定符组成总长度14位。主动错误帧字段结构表字段名称位数功能描述主动错误标志66个连续的显性位0强制打断当前传输通知其他节点“检测到错误”错误界定符88个连续的隐性位1用于结束错误帧使总线恢复到空闲状态被动错误帧字段结构表字段名称位数功能描述被动错误标志66个连续的隐性位1无法主动打断总线传输仅在总线空闲时发送错误界定符8同主动错误帧8个隐性位1用于结束错误帧CAN总线定义5种核心错误类型节点检测到任意错误即发送错误帧位错误、填充错误、CRC错误、格式错误、ACK错误。过载帧用于流量控制由过载标志6个显性位和过载界定符8个隐性位组成总长度14位仅在帧间隔期间发送通知发送节点延迟传输避免数据丢失。字段名称位数功能描述过载标志66个连续的显性位0用于通知总线节点“接收节点暂时忙碌”过载界定符88个连续的隐性位1用于结束过载帧使总线恢复同步帧间隔分隔数据帧/遥控帧的时间间隔由间歇段2个隐性位和总线空闲段≥1个隐性位组成核心作用是为接收节点预留数据处理时间错误帧、过载帧前不插入帧间隔。字段名称位数功能描述间歇场2位固定为2个隐性位1所有节点在此期间禁止发送新帧确保接收节点完成当前帧处理总线空闲场≥1位连续的隐性位1长度不固定。若总线空闲场持续1位以上发送节点可开始发送新帧若插入过载帧此场会被延长仲裁机制CAN总线是多主控总线所有节点均可主动发数据需通过仲裁机制解决多节点同时发送的冲突核心为非破坏性仲裁仲裁失败的节点仅停止发送不破坏已传输数据总线无数据丢失核心规则总线空闲时最先发送的节点获得发送权多节点同时发送时从仲裁段第一位开始逐位比较显性位0优先于隐性位1连续输出显性位最多的节点继续发送ID值越小优先级越高MSB同ID的数据帧与遥控帧仲裁时数据帧RTR0显性优先于遥控帧RTR1隐性同ID的标准帧与扩展帧仲裁时标准帧优先级更高。时序分析CAN总线为异步通信无时钟信号线通过位时序补偿节点间的时钟偏差和信号传播延迟确保所有节点同步采样总线电平。时间量子TQ位时序的最小单位由CAN控制器系统时钟分频得到位时间单个逻辑位的传输时间由4个段组成总长度为8~25个TQ可自定义配置采样点SP读取总线电平的时刻位于位时间的60%~80%处信号最稳定采样值即为该位的逻辑值。位时间的4个段核心作用段名称英文缩写位数TQ核心作用同步段SS1实现节点时序同步信号跳变沿最好出现在此段传播时间段PTS1~8吸收信号的物理延迟发送/接收/总线传播延迟相位缓冲段1PBS11~8补偿信号跳变沿的误差重同步时可延长相位缓冲段2PBS22~8补偿时钟累积误差重同步时可缩短同步跳转宽度SJW1~4TQ定义了重同步时的最大调整范围通过延长PS1或缩短PS2来校准位时间,超过了SJW就会被强制按总线的“标准时间”对齐,避免节点时钟偏差过大导致采样错误。通信速率计算CAN 总线为异步通信无专用时钟线总线上所有通讯节点需统一约定两个核心参数即可唯一确定 CAN 通讯的波特率单个 时间量子Tq 的时间长度由 CAN 控制器系统时钟分频得到每个数据位所占的 Tq 总数即位时间由 SSPTSPS1PS2 的 Tq 数之和构成。波特率配置示例8MHz 系统时钟1Mbps 波特率基础参数计算系统时钟8 MHz分频系数64 分频单个 Tq 时间长度Tq8MHz/64125ns位时间占用 Tq 数8 Tq总位时间8×125ns1μs对应波特率1/1μs1Mbps位时序各段 Tq 分配8Tq 总长度表格位时序段英文缩写分配 Tq 数对应时间功能说明同步段SS1 Tq125ns实现节点时序同步信号跳变沿优选此段传播时间段PTS1 Tq125ns补偿短距离总线的物理延迟发送 / 接收 / 传播延迟相位缓冲段 1PS14 Tq500ns补偿信号跳变沿误差重同步时可延长相位缓冲段 2PS22 Tq250ns补偿时钟累积误差重同步时可缩短同步跳转宽度SJW配置SJW 分配1 Tq最大调整时间125ns采样点位置位于 PS1 结束处即第 6 TqSSPTSPS1占位时间的 75%确保信号稳定后采样。同步方式CAN总线通过两种同步方式确保所有节点的采样点对齐保障异步通信的可靠性硬同步仅在帧起始SOF处触发强制将本地时钟的同步段与总线跳变沿对齐复位时间段计数器用于帧传输的初始同步再同步帧传输过程中若检测到总线跳变沿与本地时钟偏差超过SJW通过延长PBS1或缩短PBS2实现动态同步每次调整量≤SJW用于补偿通信过程中的时钟偏差。STM32中bxCAN控制器的应用STM32芯片内置bxCANBasic Extended CAN控制器支持CAN 2.0A/B协议可高效实现CAN总线通信核心用于管理CAN报文的发送/接收降低CPU负载。bxCAN控制器基本特性框图bxCAN环回模式环回模式是bxCAN的调试模式通过将CAN_BTR寄存器的LBKM位置1开启核心特点控制器将自身发送的报文经验收筛选后作为接收报文存储到接收邮箱无需外接CAN收发器和物理总线可直接测试CAN控制器的发送/接收功能适用于前期程序调试验证报文配置、发送/接收逻辑的正确性。CAN总线轮询测试程序环回模式基于STM32标准库实现环回模式下的CAN报文轮询发送/接收核心功能为配置CAN→发送指定报文→接收报文→验证报文一致性测试通过则点亮指定LED。/* Private define ------------------------------------------------------------*//* Private typedef -----------------------------------------------------------*/typedefenum{FAILED0,PASSED!FAILED}TestStatus;/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/__IOuint32_tret0;/* for return of the interrupt handling */volatileTestStatus TestRx;/* Private function prototypes -----------------------------------------------*/TestStatusCAN_Polling(void);/** * brief 配置CAN控制器通过轮询方式进行发送和接收测试 * param None * retval PASSED - 接收数据验证成功, FAILED - 接收数据验证失败 */TestStatusCAN_Polling(void){CAN_InitTypeDef CAN_InitStructure;// CAN初始化结构体CAN_FilterInitTypeDef CAN_FilterInitStructure;// CAN过滤器初始化结构体CanTxMsg TxMessage;// CAN发送消息结构体CanRxMsg RxMessage;// CAN接收消息结构体uint32_tuwCounter0;// 超时计数器uint8_tTransmitMailbox0;// 发送邮箱编号(0-2)/* 使能CAN总线的时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);/* 复位CAN外设寄存器到默认值 */CAN_DeInit(CAN1);/*--------------------- CAN基本参数配置 ---------------------*/CAN_InitStructure.CAN_TTCMDISABLE;// 禁用时间触发通信模式CAN_InitStructure.CAN_ABOMDISABLE;// 禁用自动离线管理CAN_InitStructure.CAN_AWUMDISABLE;// 禁用自动唤醒模式CAN_InitStructure.CAN_NARTDISABLE;// 启用自动重传(禁用非自动重传)CAN_InitStructure.CAN_RFLMDISABLE;// 禁用接收FIFO锁定模式(新消息覆盖旧消息)CAN_InitStructure.CAN_TXFPDISABLE;// 禁用发送FIFO优先级(按ID优先级发送)CAN_InitStructure.CAN_ModeCAN_Mode_LoopBack;// 设置为环回模式(自发自收)CAN_InitStructure.CAN_SJWCAN_SJW_1tq;// 同步跳转宽度 1个时间量子/*--------------------- CAN波特率配置 ---------------------*//* 在42MHz CAN时钟下配置175kbps波特率 */CAN_InitStructure.CAN_BS1CAN_BS1_6tq;// 时间段1 6个时间量子CAN_InitStructure.CAN_BS2CAN_BS2_8tq;// 时间段2 8个时间量子CAN_InitStructure.CAN_Prescaler16;// 预分频值CAN_Init(CAN1,CAN_InitStructure);// 应用CAN配置/*--------------------- CAN过滤器配置 ---------------------*/CAN_FilterInitStructure.CAN_FilterNumber0;// 使用过滤器组0CAN_FilterInitStructure.CAN_FilterModeCAN_FilterMode_IdMask;// 标识符屏蔽模式CAN_FilterInitStructure.CAN_FilterScaleCAN_FilterScale_32bit;// 32位过滤器// 设置过滤器ID(全0表示接收任意ID)CAN_FilterInitStructure.CAN_FilterIdHigh0x0000;// 过滤器ID高16位CAN_FilterInitStructure.CAN_FilterIdLow0x0000;// 过滤器ID低16位// 设置过滤器屏蔽位(全0表示不屏蔽任何位)CAN_FilterInitStructure.CAN_FilterMaskIdHigh0x0000;// 屏蔽位高16位CAN_FilterInitStructure.CAN_FilterMaskIdLow0x0000;// 屏蔽位低16位CAN_FilterInitStructure.CAN_FilterFIFOAssignment0;// 接收到的消息分配到FIFO0CAN_FilterInitStructure.CAN_FilterActivationENABLE;// 激活过滤器CAN_FilterInit(CAN_FilterInitStructure);// 应用过滤器配置/*--------------------- 发送CAN消息 ---------------------*/// 配置发送消息TxMessage.StdId0x11;// 标准标识符 0x11TxMessage.RTRCAN_RTR_DATA;// 数据帧(非远程帧)TxMessage.IDECAN_ID_STD;// 标准标识符(非扩展标识符)TxMessage.DLC2;// 数据长度 2字节TxMessage.Data[0]0xCA;// 数据字节0 0xCATxMessage.Data[1]0xFE;// 数据字节1 0xFE// 发送消息并获取使用的邮箱编号(0,1或2)TransmitMailboxCAN_Transmit(CAN1,TxMessage);/* 等待消息发送完成(带超时保护) */uwCounter0;while((CAN_TransmitStatus(CAN1,TransmitMailbox)!CANTXOK)(uwCounter!0xFFFF)){uwCounter;}/* 检查是否发送超时 */if(uwCounter0xFFFF){returnFAILED;// 发送失败}/*--------------------- 等待接收CAN消息 ---------------------*/uwCounter0;// 等待FIFO0中至少有1条消息(带超时保护)while((CAN_MessagePending(CAN1,CAN_FIFO0)1)(uwCounter!0xFFFF)){uwCounter;}/* 检查是否接收超时 */if(uwCounter0xFFFF){returnFAILED;// 接收超时}/*--------------------- 接收并解析CAN消息 ---------------------*/// 初始化接收消息结构体RxMessage.StdId0x00;// 预设标准标识符 0RxMessage.IDECAN_ID_STD;// 预设为标准标识符RxMessage.DLC0;// 预设数据长度 0RxMessage.Data[0]0x00;// 预设数据字节0 0RxMessage.Data[1]0x00;// 预设数据字节1 0// 从FIFO0接收消息CAN_Receive(CAN1,CAN_FIFO0,RxMessage);/*--------------------- 验证接收到的消息 ---------------------*/// 检查标识符是否匹配if(RxMessage.StdId!0x11){returnFAILED;// 标识符不匹配}// 检查帧类型是否匹配(标准帧)if(RxMessage.IDE!CAN_ID_STD){returnFAILED;// 帧类型不匹配}// 检查数据长度是否匹配if(RxMessage.DLC!2){returnFAILED;// 数据长度不匹配}// 检查数据内容是否匹配(组合两个字节为16位值)if((RxMessage.Data[0]8|RxMessage.Data[1])!0xCAFE){returnFAILED;// 数据内容不匹配}// 所有验证通过返回测试成功returnPASSED;}intmain(){LED_Init();/* CAN transmit at 125Kb/s and receive by polling in loopback mode */TestRxCAN_Polling();if(TestRx!FAILED){/* OK *//* Turn on LED1 */GPIO_ResetBits(GPIOF,GPIO_Pin_9);//输出低电平}else{/* KO *//* Turn on LED2 */GPIO_ResetBits(GPIOE,GPIO_Pin_14);//输出低电平}while(1){}}