微控制器如何与CAN总线连接


微控制器(MCU)与CAN总线的连接是工业控制、汽车电子、物联网等领域的核心技术。以下是详细的连接方法、硬件设计、软件配置及调试技巧,确保通信稳定可靠。
一、CAN总线连接基础
CAN总线特性
物理层:差分信号(CAN_H和CAN_L),抗干扰能力强,适合长距离传输。
通信速率:10kbps~1Mbps(速率越高,传输距离越短)。
拓扑结构:总线型,支持多节点(最多110个,视总线长度和负载而定)。
微控制器与CAN总线的接口
集成CAN控制器:部分MCU内置CAN控制器(如STM32、NXP S32K、Microchip SAM系列),只需外接物理层收发器。
外接CAN控制器:若MCU无内置CAN控制器,需外接CAN控制器芯片(如MCP2515)和收发器。
二、硬件连接步骤
1. 典型连接方案(内置CAN控制器的MCU)
所需元件:
MCU(如STM32F103C8T6,内置CAN控制器)。
CAN收发器(如TJA1050、MCP2551)。
终端电阻(120Ω,两端各一个)。
共模电感(可选,抑制EMI)。
连接图:
关键点:
MCU的CAN_TX和CAN_RX分别连接收发器的TXD和RXD。
收发器的CAN_H和CAN_L接总线,两端加120Ω终端电阻。
收发器的供电电压需与MCU一致(3.3V或5V)。
2. 外接CAN控制器的连接方案
所需元件:
MCU(如STM32F030,无内置CAN控制器)。
CAN控制器芯片(如MCP2515,SPI接口)。
CAN收发器(如TJA1050)。
终端电阻(120Ω)。
连接图:
MCU (SPI接口) MCP2515 (CAN控制器) TJA1050 (收发器) CAN总线 ------------------------- ------------------------ ---------------------- ---------------- SPI_SCK -----> SCK SCK (不直接连接) (不连接) SPI_MOSI -----> SI SI (不直接连接) (不连接) SPI_MISO <----- SO SO (不直接连接) (不连接) SPI_CS -----> CS CS (不直接连接) (不连接) INT <----- INT INT (不直接连接) (不连接) GND <----- GND GND CAN_GND VCC <----- 3.3V VCC (3.3V) (不连接) TXD -----> TXD RXD <----- RXD CAN_H -----> CAN_H CAN_L <----- CAN_L
关键点:
MCU通过SPI接口与MCP2515通信,MCP2515的TXD和RXD连接收发器。
终端电阻仍需接在总线两端。
三、软件配置要点
1. 内置CAN控制器的MCU配置(以STM32为例)
步骤:
根据总线速率计算BRP、TS1、TS2等参数。
示例:500kbps(APB1时钟48MHz):
启用CAN外设时钟(如
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE)
)。配置CAN_TX为复用推挽输出,CAN_RX为浮空输入。
初始化GPIO:
配置CAN时钟:
设置波特率:
CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; CAN_InitStructure.CAN_Prescaler = 6; // 波特率 = 48MHz / (6 * (13 + 2 + 1)) = 500kbps
调用
CAN_Init()
函数启用CAN控制器。设置接收滤波器,只接收特定ID的消息。
配置滤波器:
启用CAN:
示例代码(发送数据):
2. 外接CAN控制器的MCU配置(以MCP2515为例)
步骤:
设置CNF1、CNF2、CNF3寄存器。
示例:500kbps(16MHz晶振):
通过SPI发送复位指令(
0xC0
)。配置SPI时钟、模式(CPOL=0, CPHA=0)、数据位(8位)。
初始化SPI接口:
复位MCP2515:
配置波特率:
设置CANCTRL寄存器为正常模式(
0x80
)。设置RXF0SIDH、RXM0SIDH等寄存器。
配置滤波器:
启用MCP2515:
示例代码(发送数据):
四、调试与常见问题
通信失败排查
确认波特率一致(所有节点需相同)。
检查滤波器配置(确保未误过滤有效消息)。
用示波器测量CAN_H和CAN_L的差分电压(正常为2V~3V)。
确认终端电阻已连接(总线两端各120Ω)。
检查收发器供电电压是否正确。
检查硬件:
检查软件:
电磁干扰(EMI)问题
使用双绞线(如AWG24),线长<100m(500kbps时)。
在CAN_H和CAN_L之间增加共模电感(如B82793S0131N101)。
避免总线与电源线平行布线。
解决方案:
数据丢失问题
增加中断处理程序,及时读取接收缓冲区。
降低总线速率或优化通信协议。
缓冲区溢出(未及时处理接收数据)。
总线负载过高(超过总线容量)。
原因:
解决方案:
五、推荐配置与选型
内置CAN控制器的MCU推荐
SAM D21(低功耗,内置CAN控制器)。
S32K144(汽车级,支持CAN FD)。
STM32F103C8T6(低成本,内置CAN控制器)。
STM32F407VGT6(高性能,支持CAN FD)。
STM32系列:
NXP S32K系列:
Microchip SAM系列:
外接CAN控制器推荐
支持CAN FD,高速率(5Mbps)。
SPI接口,支持标准CAN 2.0A/B。
MCP2515:
TJA1042T:
CAN收发器推荐
工业级,支持-40℃~+125℃。
高速CAN,支持1Mbps,抗干扰能力强。
TJA1050:
MCP2551:
六、总结
连接步骤:
内置CAN控制器的MCU:MCU的CAN_TX/RX接收发器的TXD/RXD,收发器CAN_H/CAN_L接总线并加终端电阻。
外接CAN控制器的MCU:MCU通过SPI/UART等接口连接CAN控制器,CAN控制器再连接收发器。
关键点:
波特率必须一致。
终端电阻和共模电感不可省略。
软件滤波器需合理配置。
调试工具:
示波器(测量差分电压和总线阻抗)。
CAN分析仪(监控通信数据,如Peak PCAN-USB)。
直接建议:
优先选择内置CAN控制器的MCU(如STM32F103),简化设计。
波特率500kbps是工业常用值,兼容性好。
用示波器验证差分电压(2V~3V)和总线阻抗(60Ω±10%)。
最终结论:
硬件连接:MCU的CAN_TX→收发器TXD,CAN_RX←收发器RXD,收发器CAN_H/CAN_L接总线并加终端电阻。
软件配置:正确设置波特率、滤波器,并启用中断处理接收数据。
调试工具:示波器(测量差分电压)、CAN分析仪(监控通信数据)。
建议:参考具体MCU和收发器的官方文档(如《STM32F103参考手册》《TJA1050数据手册》)进行详细配置。
责任编辑:Pan'
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。