Teensy 4.1与Arduino Nano CAN通信发送中断且Nano无接收问题求助
Teensy 4.1与Arduino Nano CAN通信故障排查方案
你遇到的「Teensy发送17次后停止、Nano无接收」是典型的CAN总线无ACK应答导致发送缓冲区满的现象,ACAN_T4默认发送缓冲区深度为16~17帧,没有收到接收端的ACK应答时,已发送的帧会一直占用缓冲区,满了之后tryToSend就会返回失败,停止发送。
可按以下优先级排查:
1. 检查CAN总线终端电阻
CAN总线两端必须各接一个120Ω终端电阻,这是差分信号正常传输的必要条件:
- Teensy侧TJA1050的CAN_H和CAN_L之间直接焊接120Ω电阻
- Nano侧MCP2515模块如果有终端电阻跳线,直接跳到ON档位即可
你之前两个Nano可以正常通信,就是因为两个MCP2515模块都接了终端电阻,Teensy侧没加就会导致信号反射、ACK无法正常传输。
2. 检查硬件接线错误
- 收发器交叉接线:TJA1050的
TX引脚接Teensy的CAN_RX引脚(CAN1对应引脚23),TJA1050的RX引脚接Teensy的CAN_TX引脚(CAN1对应引脚22),不要直连 - CAN总线接线:TJA1050的
CAN_H接MCP2515的CAN_H,CAN_L接CAN_L,不要接反 - 供电匹配:TJA1050使用3.3V供电(匹配Teensy电平),不要接5V
3. 统一位时序参数
光设置波特率相同无法保证通信正常,必须保证两端的位时序参数完全一致,你可以手动指定两端的参数,不要用库的自动计算值:
Teensy侧修改配置:
ACAN_T4_Settings settings (125 * 1000) ; // 125 kbit/s // 取消以下参数的注释,手动设置统一值 settings.mBitRatePrescaler = 6; settings.mPropagationSegment = 5; settings.mPhaseSegment1 = 5; settings.mPhaseSegment2 = 5; settings.mRJW = 2;
Nano侧修改配置:
ACAN2515Settings settings (QUARTZ_FREQUENCY, 125UL * 1000UL) ; // CAN bit rate 125 kb/s settings.mBitRatePrescaler = 6; settings.mPropagationSegment = 5; settings.mPhaseSegment1 = 5; settings.mPhaseSegment2 = 5; settings.mSJW = 2; settings.mRequestedMode = ACAN2515Settings::NormalMode ;
配置完成后对比两边串口打印的实际波特率、采样点数值,必须完全一致。
4. 补全CAN帧配置
你Teensy代码里注释了CAN ID设置,库默认值可能是扩展帧或者ID为0,建议明确指定帧类型和ID:
void loop () { CANMessage message ; message.id = 0x542 ; // 取消注释,指定标准帧ID message.ext = false; // 明确使用标准帧,关闭扩展帧 message.len = 8; message.data[0] = 127; message.data[1] = 43; message.data[2] = 1; // 原有发送逻辑不变 }
内容的提问来源于stack exchange,提问作者Rishita Jaiswal
相关产品推荐
相关产品推荐

