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 模块时出现以下问题。
它们通过 Tivaware CANMessageSet 设置三个对象(30、31、32)。 但仅传输按摩对象32。
但是、如果它们通过调试或设置等待周期来保留 CANMessageSet 执行之间的间隔、则所有三个按摩对象都将正确发送。
您对此问题有什么建议吗?
这是代码。
(第2条
#define TXOBJECT_ST 30
#define TXOBJECT_END 32
uint8_t g_ui8CAN0TXMsgData[3][8];
tCANMsgObject g_sCAN0TxMessage[3];
int main (空)
{
uint32_t MNO;
uint32_t count、s_count;
uint32_t status;
//按摩初始化
G_sCAN0TxMessage[0].ui32MsgIDMask = 0;
G_sCAN0TxMessage[0]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[0]);
G_sCAN0TxMessage[1].ui32MsgIDMask = 0;
G_sCAN0TxMessage[1].pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[1][0]);
G_sCAN0TxMessage[2]。ui32MsgIDMask = 0;
G_sCAN0TxMessage[2]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[2][0]);
//数据 TX 过程
for (count=0;count<10;count++){
for (s_count=TXOBJECT_ST;s_count <= TXOBJECT_END;s_count++){
MNO = s_count - TXOBJECT_ST;
G_ui8CAN0TXMsgData[MO][0]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][1]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][2]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][3]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][4]=计数*3 + MNO;
G_ui8CAN0TXMsgData[MO][5]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][6]= count*3 + MNO;
G_ui8CAN0TXMsgData[MO][7]= count*3 + MNO;
G_sCAN0TxMessage[MNO].ui32MsgID = 0x10000000 + count*3 + MNO;
G_sCAN0TxMessage[MNO].ui32MsgLen = 8;
CANMessageSet (CAN0_BASE、s_count、&g_sCAN0TxMessage[MNO]、MSG_OBJ_TYPE_TX);
}
while (1){
STATUS =(CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)& 0xE0000000);
if (status =0){
中断;
}
}
}
}
(第2条
谢谢、此致、
Kuerbis
您好、Kuerbis、
我已将您的帖子转发给我们的 CAN 专家。
我无法重现您的问题。 您是否拥有完整的 CAN 网络? 您是否从网络上的另一个节点接收到 ACK?
我获取了您的代码并添加了 CAN 初始化、并创建了一个网络、其中包含一个用作每个消息的接收器的其他节点。 以下是正在发送的 CAN 消息的逻辑分析仪跟踪。
并继续:
我的逻辑分析仪能够在第16个帧从样本存储器中退出之前捕获它的起始值:
我附加了一个包含两个项目的.zip 文件。 "multipleCanMessages"包含您的代码、用于设备发送。 "simple_CAN_Rx"是用于接收器件的。
我查看了 CAN 总线上的信号。
如果设置"CANRetrySet"为 true,则此问题已解决。
但是、如果设置"CANRetrySet"为 false、则此问题尚未解决。
能否在测试环境中设置"CANRetrySet"值为 false?
此致、
Yuzo
如果发送节点在接收节点和 CANRetry 设置为 false 之前启动、则原始消息将丢失。 默认情况下启用重试。 没有理由禁用重试。 CAN 协议具有强大的错误检测和恢复方法。 下面是 CAN 总线的更详细说明、并从第6页开始讨论了错误检查和故障限制。
https://www.ti.com/lit/an/sloa101b/sloa101b.pdf
本周剩余的时间里、我正在度假。 如果您需要紧急帮助、请单击"提出相关问题"按钮以启动新主题。
如果设置"CANRetrySet"为 true、
如果"CANRetrySet"设置为 false、
我无法理解、为什么按摩物体会丢失。
请评论此问题。
此致、
Yuzo
这个黄线是 CANH、 这个绿线是 CANL、这些黄线是来自 CAN 协议分析器的 CANID。
我可以通过禁用自动重试来重现您的问题。 我承认这种行为会使我感到困惑。 CAN 状态机好像未能正确仲裁待发送的报文。 是否有原因必须禁用自动重试?
我需要禁用自动重试、因为我们的系统规格。 我们的系统仅接受一次通过禁用自动重试的应答错误。 我们选择了 TM4C123BH6PM、因为它可以禁用自动重试。 如果不能禁用自动重试,这就令人失望了。
我想确认、如果仅一个对象 CANMessage 用于收发、我可以使用禁用自动重试吗?
当一次只发送一个对象且自动重试被禁用时、TXREQ 位不会被置位。 因此、您无法使用它来确定何时检查错误位或何时重试。 通过添加2ms 软件延迟、我可以发送一个禁用自动重试的单帧、然后检查该帧是否已确认。 以下是发送10帧延迟为2ms 的逻辑分析仪快照。
这是一个放大图、显示了第一个帧的末尾。 缺少的 ACK 位用红色圆圈标出。
CAN_STS 寄存器显示最后一个错误为3、缺少 ACK。 CAN_ERR 显示计数为5个接收错误。
我可以看到在尝试识别未知 CAN 总线的波特率时、这可能是如何使用的、但我不知道它将如何与总线上的其他流量发生回退。
您是说、如果禁用了自动重试功能、则必须对计时器使用固定周期操作吗?
如果是、我想知道。
使用 TXREQ 位校验、我一次只能发送一个对象、同时禁用自动重试。
我使用错误吗?
在禁用自动重试的情况下、我无法使用 TXREQ 位来确定之前的传输是否已发送。
这是代码。
(第2条
#define TXOBJECT_ST 30
#define TXOBJECT_END 32
uint8_t g_ui8CAN0TXMsgData[3][8];
tCANMsgObject g_sCAN0TxMessage[3];
int main (空)
{
uint32_t MNO;
uint32_t count、s_count;
uint32_t status;
//按摩初始化
G_sCAN0TxMessage[0].ui32MsgIDMask = 0;
G_sCAN0TxMessage[0]。pui8MsgData =(uint8_t *)(&g_ui8CAN0TXMsgData[0]);
//数据 TX 过程
for (count=0;count<10;count++){
G_ui8CAN0TXMsgData[0][0]=计数;
G_ui8CAN0TXMsgData[0][1]=计数;
G_ui8CAN0TXMsgData[0][2]=计数;
G_ui8CAN0TXMsgData[0][3]=计数;
G_ui8CAN0TXMsgData[0][4]=计数;
G_ui8CAN0TXMsgData[0][5]=计数;
G_ui8CAN0TXMsgData[0][6]=计数;
G_ui8CAN0TXMsgData[0][7]=计数;
G_sCAN0TxMessage[0]。ui32MsgID = 0x10000000 + count;
G_sCAN0TxMessage[0].ui32MsgLen = 8;
CANMessageSet (CAN0_BASE、TXOBJECT_ST、&g_sCAN0TxMessage[0]、MSG_OBJ_TYPE_TX);
while (1){
STATUS =(CANStatusGet (CAN0_BASE、CAN_STS_TXREQUEST)& 0x20000000);
if (status =0){
中断;
}
否则{
状态= 0;//test
}
}
}
(第2条
这是 CAN 信号和 CANID。
"while (1)"代码是使用 TXREQ 的等待过程。
如果我切断了"while (1)"代码。 CAN 信号和 CANID 就在这里。
因此 、我能够使用 TXREQ 位来确定之前的传输是否已经发送。
您会再检查一次吗?
我仍然无法读取设置的 TXREQUEST 位。 我尝试了不同的优化级别、但没有改变。 这是我的项目。 也许您在 CAN 配置中执行了一些不同的操作。 我已附加我的项目。