🗒初墨
🍊Hello,各位好,我是面包!
想让汽车、机器人、甚至智能工厂的机器们“听懂彼此”?CAN总线协议就是它们的“神经语言”!从汽车电子到工业控制,这套诞生于德国Bosch的通信协议,用两根双绞线编织出一张高效可靠的通信网。今天,我们化身“通信翻译官”,揭秘CAN协议的帧结构魔法与数学奥秘!
一、CAN协议:从汽车“线束地狱”到工业“万能语”
1. 诞生趣史
1986年,Bosch工程师们受够了汽车里蜘蛛网般的线束——宝马7系的线缆总长突破2公里!于是CAN协议横空出世,用两根线统一通信,线束直接砍掉70%,从此汽车电子迈入“文艺复兴”时代🎉。
2. 核心优势
- 多主控制:所有设备平等,随时“抢麦发言”(仲裁机制)
- 抗干扰王者:差分信号(CAN_H - CAN_L)无视电磁干扰
- 错误自愈:CRC校验 + 自动重传,误码率低至10⁻¹¹(比中彩票还难!)
CAN采用的是“差分信号”,即通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,总线电平分为显性电平和隐性电平。 CAN总线采用两种互补的逻辑数值"显性"和"隐性"。"显性"数值表示逻辑"0",而"隐性"表示逻辑"1"。当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。
二、帧结构拆解:CAN的“语言语法”
CAN数据帧就像一封精密电报,由7个字段组成,总长度44~128位(标准帧)。我们来一场“位级解剖”:
1. 帧起始(SOF) - 电报的开场铃
- 1位显性电平(0):大喊一声“注意!我要发报了!”
2. 仲裁段 - 优先级Battle擂台
- 标准帧:11位ID + 1位RTR
- ID值越小越优先:比如刹车信号(ID=0x01)碾压空调控制(ID=0x100)
- 仲裁黑科技:显性位(0)覆盖隐性位(1),败者自动闭嘴,无需重发
CAN的仲裁机制正好利用了差分信号的特性,即显性电平覆盖隐形电平的特性,如果出现多个设备同时发送的情况,则先输出隐形电平的设备会失去对总线的占有权。下图中D为显性电平,R为隐形电平,通过该图可以很容易地理解CAN的仲裁机制。
3. 控制段 - 数据属性标签
- IDE位:0=标准帧,1=扩展帧(29位ID,支持18亿个设备!)
- DLC(4位):数据长度(0~8字节),但DLC=9也按8字节算(祖传设计😂)
4. 数据段 - 真正的信息包
- 0~8字节自由发挥:比如发送车速
0x64(100km/h),或是控制机械臂的坐标
5. CRC段 - 数据保镖
- 15位CRC校验码:用多项式 生成
- 1位界定符:隐性电平(1)表示CRC结束
6. ACK段 - 确认回执
- 发送端发0,接收端改1:类似微信群里的“收到请回复”
- 若无人应答:发送端自动重传(最多128次)
7. 帧结束(EOF) - 优雅退场
- 7位隐性电平(1):深藏功与名
三、硬核公式:CAN的“数学咒语”
1. 波特率计算:速度与距离的平衡术
- 示例:,=6,=13,=2
2. 抗干扰密码:差分电压
- 显性电平:CAN_H=3.5V,CAN_L=1.5V → 压差2V(稳如泰山)
- 隐性电平:CAN_H=2.5V,CAN_L=2.5V → 压差0V(节能模式)
四、实战开发:STM32发报员养成记
1. 硬件配置
- 大疆C板(主控STM32F407,内置CAN收发器)
- C610电调
- M2006电机
- ST-Link烧录器
TIP
大疆C板的所有接口都高度封装,必须采用大疆标配的数据线才能引出杜邦线形式与ST-Link相连
2. STM32CUBEMX配置
时钟配置
168MHz

CAN1配置
- CAN 总线波特率
- tq (Time Quantum)
- tBS1 (Time Quanta in Bit Segment 1)
- tBS2 (Time Quanta in Bit Segment 1)
- 在 cubeMX 中,我们配置的 Time Quanta in Bit Segment 的值对应的就是 (TS1+1)和(TS2+1)

3. 关键代码-使用大疆C板驱动M2006电机
// 初始化CAN(1Mbps)
void CAN_Init() {
CAN_InitTypeDef CAN_InitStruct;
CAN_InitStruct.CAN_Prescaler = 6; // 45MHz → 7.5MHz
CAN_InitStruct.CAN_BS1 = CAN_BS1_13tq;
CAN_InitStruct.CAN_BS2 = CAN_BS2_2tq;
CAN_Init(CAN1, &CAN_InitStruct);
}
// 发送车速数据(ID=0x123,数据=100km/h)
CanTxMsg TxMsg;
TxMsg.StdId = 0x123; // 11位ID
TxMsg.Data[0] = 0x64; // 数据:100 → 0x64
TxMsg.DLC = 1; // 数据长度1字节
CAN_Transmit(CAN1, &TxMsg); // 发送!4. 调试黑科技
- 逻辑分析仪:抓取CAN波形,检查位时序
- CAN总线分析仪:直接解析ID和数据(淘宝500元搞定)
五、CAN的星辰大海:从燃油车到火星车
- CAN FD:速度飙至5Mbps,数据包扩容至64字节(特斯拉已用上)
- CAN XL:带宽10Mbps,融合以太网(工业4.0主力)
- 太空应用:好奇号火星车的机械臂控制(真空环境抗辐射!)
六、总结:为什么CAN是工程师的真爱?
- 高可靠:CRC+ACK+重传,比男朋友还靠谱
- 低成本:两根线组网,告别天价线束
- 易扩展:新设备随时加入,无需网络改造
下次当你坐进汽车或看到工厂机器人,不妨想象——无数CAN数据帧正在设备间飞速穿梭,编织出智能世界的隐形神经网络!🎇
资源包:
CAN协议标准文档
STM32 CAN开发指南
嘉立创开源CAN分析仪(搜索“CAN Sniffer”)
https://blog.csdn.net/weixin_74923758/article/details/141116482
