You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:21:00