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 协议比较陌生、在实施 CAN 网络时遇到困难、希望能为我的项目提供所有帮助我的目标是设置/配置 CAN 网络的3个节点。 我的节点如下:
1)节点1 =标准 ID 为0x1的 TMS570LS1227、 用于发送的 MSG_OBJ1、用于接收的 MSG_OBJ2和 MSG_OBJ3
2)节点2 = 标准 ID 为0x2的 TMS570LS1227、 用于发送的 MSG_OBJ1、用于接收的 MSG_OBJ2和 MSG_OBJ3
3)节点3 =标准 ID 为0x3的 TM4C123GH6PM、 用于发送的 MSG_OBJ1、用于接收的 MSG_OBJ2和 MSG_OBJ3
我已经研究了 CAN 协议的工作原理、并且知道消息框优先级和消息标识符优先级的工作原理。 每个节点都使用其消息框对象1来发送消息框对象2和3来接收来自其他两个节点的消息。
我使用中断来指示来自其他节点的每个节点上的 TX 和 RX 消息。 我还为每个节点的接收消息框对象设置了0x07FF 的过滤掩码、以使用11位来过滤来自 CAN 总线的消息。
根据我在上面的理解和设置、当我初始化和配置网络上的每个节点时、我希望节点1首先赢得仲裁过程并传输其消息、而节点2和3接收消息。 接下来、我希望节点2赢得针对节点3的仲裁、而节点1和节点3接收仲裁。 最后、节点3发送、其他节点侦听和接收。
以下是我在上述设置中遇到的问题:
1) 1)通信不一致、即我并不总是在每个节点的接收消息对象中包含所有预期消息。 我的意思是:节点3有时会有节点2的已传输消息、但不会有节点1发送的消息、节点2将有节点3发送的消息、但不会有节点1发送的消息、 节点2将具有节点1的消息、但不包含节点3的传输消息- IDK 为什么会发生这种情况。 有什么想法吗?
2) 2)当我查看逻辑分析仪上的 CAN 总线时、我会看到错误、表示存在位填充和 ACK 错误。 如何修复确认错误? 即、如何配置接收节点以确认它们已收到已发送的消息? 我认为 CAN 控制器会处理位填充? 或者我是否被错误告知? 请提供建议。
3) 3)我的当前代码适用于网络中的任意两个节点、但一旦我在网络中拥有全部3个节点、总线的行为就无法预测。
我通读了论坛、试图发现与我类似的问题、但在任何地方都找不到任何有用的东西。 如上所述、这是我第一次使用 CAN、非常感谢我能提供的任何帮助、我很乐意与您分享我的每个节点代码。 期待您的所有回复。 感谢你能抽出时间。
谢谢。
您好!
如果 CAN 总线处于空闲状态、三个 CAN 节点可以随时访问 CAN 总线。 如果3个节点希望同时进行通信、那么具有最高优先级的消息将赢得总线仲裁并获得传输的权利。 作为消息一部分的 CAN 标识符(CAN ID)指示优先级。 CAN ID 的编号越低、优先级越高。 在您的设计中、节点1具有最高优先级、而节点3具有最低优先级。
CAN 总线访问冲突由 CAN ID 的逐位仲裁解决。 所有连接的节点都观察总线电平位对位。 总线电平有两种:显性和隐性。 显性电平会覆盖隐性电平。 在 CAN 的位流中、每个字节的 MSB 首先被发送。
1.是否可以对消息框2和3使用不同的掩码来接收来自不同节点的消息? 例如,Node1-mailbox2将从节点2接收消息,而 mailbox3将从节点3接收消息。 我想知道邮箱中的消息是否 被覆盖。
2、预计会出现位填充错误和 ACK。 在您的设计中、您的使用11位 CAN ID。 对于 Node1/2/3、ID 的5位以上为零。 仲裁的节点不会获得 ACK。
您好 QJ、
感谢你的答复。 实际上、我在每个节点上使用不同的邮箱来接收来自其他节点的消息、即在节点1上、消息对象1用于传输节点1的消息、 报文对象2用于接收节点2的报文、报文对象3用于接收节点3的报文。
尽管为每个节点使用不同的邮箱、并为每个接收邮箱将掩码位设置为0x7FF、 但我仍然无法获取邮箱中的所有消息。
您好!
如果设置了 UMASK,则将使用掩码位进行验收过滤。 如果屏蔽位为0x7FF、则只有 ID 匹配的传入消息才会复制到消息 RAM。
如果节点1 TX 消息 ID 为0x1、如果节点2 RX 消息对象的 ID 不是0x1、则节点2将不会接收此消息。
这是 TX 和 RX 的图:
节点1:MailBox1 ID=1、TX
MailBox2 ID=2,RX --来自节点2
MailBox3 ID=3,RX --来自节点3
节点2:MailBox1 ID=2、TX
MailBox2 ID=1,RX --来自节点1
MailBox3 ID=3,RX --来自节点3
节点3:MailBox1 ID=3、TX
MailBox2 ID=2,RX --来自节点2
MailBox3 ID=1,RX --来自节点1
您的设置看起来不错。 我假设节点2左侧和右侧的 CAN_H/L 来自同一 CAN 收发器、并且三个节点使用相同的波特率。
是的、它们都配置为500K 的波特率。
您是否尝试了较低的波特率(例如50k、100k 等)、因为导线会拾取影响传输的噪声?
我降低了波特率、问题仍然没有得到解决。 这三个节点在同一网络中的传输和接收消息不一致。
我认为该节点大部分时间都可以接收来自其他两个节点的消息、问题只会在某些情况下发生。
如何解决此问题?
我尝试使用2个 TMS570LS1227和一个 TMS570LS1224进行设置-遇到了同样的问题。