This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我的 CAN 总线在 TM4C129XNCZAD (15个份额/位、TSeg1、TSeg2、SJW = 13、1、 1 (寄存器值+1))和一个单端(TXSPG、RXSPG)的 SN65HVD230DR 以及一个 LM3S2793 (10个份额/位、TSeg1、TSeg2、SJW = 8、1、 1 (寄存器值+1))和另一端(TXTCU、RXTCU)的 SN65HVD230DR。 我正在监控 RX 和 TX 引脚、因此我不加载总线。 这是一条长总线;我发现500ns 和600ns 总环路延迟(从 Tx 到 Rx)也存在同样的问题。
下面是显示错误的消息、然后在下一次尝试时成功传输:
这是第一个数据包末尾的缩放:
TXSPG 的 CRC 定界符的末尾非常接近屏幕中心。 就在屏幕中间、TXTCU 用一个 ACK 进行响应、该 ACK 在沿传输线路向下行驶后被 RXSPG 检测到、然后 TXSPG 在同一位时间内抛出活动错误。 为什么?
根据博世标准,我看到以下内容:
这是一个位时间太早、不能成为 Ack 错误(标志从下一位开始、而不是在 Ack 时隙期间)。
这两个位太早、不能成为 CRC 错误(标志从 Ack 分界符后面的位开始)
在仲裁和 Ack 期间、位错误有一个例外、因此它不是这样。
CRC 中的先前位为0b10110110 (0xd6)、因此它不是填充错误。
这只会导致格式错误(SOF、EOF、ACK 定界符和 CRC 定界符、符合 sloa101b.pdf)。 SOF 之前有很多位、ACK 和 EOF 仍在未来、因此时序使其看起来像是 CRC 形式错误、但我看不到它。
我缺少什么?
TM4C129的 LEC 中设置了什么错误代码?
问得好。 数据表中有一些有趣的措辞:
' LEC 位域保存的代码表示 CAN 总线上最后一次发生的错误的类型。 这种情况
当一个消息被无错误地传输(接收或发送)时、此位域被清除。 。
CPU 可以写入未使用的错误代码0x7来手动将该域设置为无效错误
以便稍后可以检查它是否有更改。"
在上面的示例中、左侧数据包有错误、右侧数据包无错误地传输。 粗体语句是否意味着我必须在右边的数据包传输之前检查 LEC? 这意味着我需要在 LEC 上设置一个中断来检查这一点。
使用"最后一个错误代码"的名称、似乎该错误将是静态的、直到它被0x7读取和覆盖。
作为示例、中的寄存器列表 显示了 LEC 值0x5。 是在中断上捕获的吗?
似乎是时候拉出调试器了!
是的、它需要启用 CAN 状态中断并在状态发生变化时检查 LEC。
查看您的逻辑分析仪图片、您会发现来自 TCU 的 ACK 到达 SPG 的时间太晚。 SPG 会将其视为表单错误。 这是最坏情况下的时序路径、因为延迟加倍。 帧开始时从 SPG 到 TCU 的延迟、由于频率差异而累积的误差、然后从 TCU 返回 SPG 进行确认的延迟。 您的巴士是否超过30米?
谢谢。
我在20m、25m 和30m 总线上看到了这一点、这是两个器件之间的点对点。 我已将控制寄存器设置为长延迟(15个份额/位、TSeg1、TSeg2、SJW = 13、1、 1 (寄存器值+1)。 我将最早采样点置于800ns 的计算结果。 在最坏的情况下、通过收发器和总线向下的总延迟低于660ns (我的100 Ω 传输线路慢于5ns/m)。 我应该有超过140ns 的裕度、但性能仍然是间歇性的、如图所示。
TM4C129XNCZAD 和 LM3S2793器件中增加了多长时间的延迟? 我尝试通过发送单个显性位来进行量化、并希望稍后6位的有效误差帧加上内部延迟、但我无法获得一致的结果(我希望外设设置会干扰此测试)。 此技术在博世 PDF 的第9页上进行了介绍,该 PDF 的标题为“CAN 位定时配置”。
如果通过收发器并向下传输总线的最坏情况为660nS、则对于确认位、最坏的延迟为1320nS。 接收器时序与发送器时序相距660nS (帧开始到达接收器的时间)、另一个660nS 的响应信号返回发送器。 TM4C 和 LM3S 的接收引脚上都存在时钟同步延迟。 它是一个系统时钟周期。
抱歉、回路时序低于660ns、因此在总线下每条线路的时间为320ns。 这显示为从 RxTCU 到 RxSPG 或反之(减去一遍通过 HVD230接收器的时间延迟、~44ns)。 。
一个系统时钟意味着我增加了29ns (1/120MHz + 1/50MHz)。 我应该还有很好的裕度。
哪个器件(TM4C129或 LM3S)是 SPG、哪个是 TCU? 从您的逻辑分析仪屏幕截图可以看到、来自 TCU 的确认将在确认窗口中达到 SPG 约60%。 TCU 正在传输、SPG 正在发送确认信号时、您是否遇到过错误?
是的、TM4C129位于 SPG 端。 60%是正确的、这就是为什么我将 CANBIT 参数设置为如此高(15个份额/位、TSeg1、TSeg2、SJW = 13、1、 1 (寄存器值+ 1))、因此我将以80%的采样率进行采样。 我不确定我是否还有来自 Stellaris 端的错误。 TM4C129偶尔会遇到足够的错误、以至于它会使发送器脱离总线、这正是我集中精力的地方。
您能否提供配置后 TM4C129 CAN 寄存器的屏幕截图?
不幸的是、此问题的优先级有所提高、因此我不会再回到这个问题上一段时间。 当我有更多数据时、我可以启动一个新线程。 感谢你的所有帮助。