我们使用的是自动重传、但它将以无尾的方式发送未确认的消息。 我们在链接中附加了 Peak 品牌 CAN 工具时注意到了这一点。 由于它会干扰我们的电源管理方法(更不用说无限重发送)、因此现在选择了 DAR (禁用自动传输)。
现在、我们需要在发送下一条消息时处理 TX 消息重试(获取仲裁丢失状态并重新请求调度程序再次尝试)。 我发现“newdat”标志只能以非常低的速率(时间<95%)清除。 根据 TRM、成功传输也将清除 newdat 标志(除了 TxREQ 标志)。 如果知道、返回这些仲裁丢失指示的相同系统似乎能够完美地进行通信、这一点可能会有所帮助。
不管怎样, 这里是我们返回“不良状态”的功能,也许您可以帮助我们解决问题。 谢谢!! 弗兰克
volatile bool MsgBox_TX_FAILED = false;
bool mcal_ca_transmit 就绪(mcal_ca_message_t * CAN_message)
{
mcal_ca_base_t * ca_reg_n =空;
uint32_t TX_STATUS_INDEX;
uint32_t TX_BUSY_BIT;
uint32_t MsgBox_newdat_bit;
mcal_ca_link_enum_t ca_link;
bool CAN_TX_READY = false;
MsgBox_TX_FAILED = false;
//验证 CAN 设备是否存在
CAN_LINK = CAN_MESSAGE -> message_route.can_link;
IF (CAN_LINK >= MCAL_NUM_CAN_CHANNELS)
{
mcal_can_status.invalid_channel_req = true;
}
其他
{
CAN_REG_n = mcal_CAN_register_list[ CAN_link ];
TX_STATUS_INDEX =(CAN_MESSAGE->message_route.can_stream - 1U)>> 5U;
TX_BUSY_BIT = 1U <<(CAN_MESSAGE->message_route.can_stream - 1U)& 0x1f);
MsgBox_newdat_bit = 1U <<(CAN_message->message_route.can_stream - 1U)和0x1f);
//验证有效的邮箱
if ((CAN_message->message_route.can_stream >= MAX_VALID 邮箱)||
(CAN_message->message_route.can_stream =0)
{
mcal_can_status.invalid_mailbox_id = true;
}
如果((CAN_REG_n->txrq[TX_STATUS_index]和 TX_BUSY_BIT)== 0U 则为其他值
{
CAN_TX_READY = true;
if ((CAN_REG_n->msgval[TX_STATUS_index]和 MsgBox_newdat_bit)!= 0U)
{
MsgBox_TX_FAILED = true;
}
}
}
返回 CAN_TX_READY;
}