我有两个 TMS320F28379D 通过 CAN 总线进行通信。
它们在主-从配置中进行设置、这意味着只有当主 MCU 发送数据(数据请求帧)时、从 MCU 才会发回请求的数据。
主器件定期发送数据请求帧(从器件响应)。
这是 CAN 总线的初始化函数。 此同一函数在主 MCU 和从 MCU 上运行
void HAL_setupCAN_CTRL(uint32_t base)
{
//
// Initialize the CAN controllers
//
CAN_initModule(CTRL_BRD_CAN);
//
// CAN bit rate is 500 KHz , derived from the system clock
//
CAN_setBitRate(CTRL_BRD_CAN, DEVICE_SYSCLK_FREQ, 500000, 16);
CAN_disableInterrupt(CTRL_BRD_CAN, CAN_INT_IE0 | CAN_INT_ERROR |
CAN_INT_STATUS);
//
// Start CAN module
CAN_startModule(CTRL_BRD_CAN);
}当主 MCU 和从 MCU 都处于活动状态(同时上电)、然后 CAN 总线正确初始化、一切都正常!、
当 从器件首先加电、然后 主器件第二次加电时、 在 主器件中的 CAN 总线 初始化之后建立通信。!
3.但另一方面,当主器件首先加电 ,然后从器件第二次加电时,从器件不会 再从主器件获得数据请求帧。 在探测主器件的 TXB 引脚时、我没有看到这条线路上有任何活动。 就好像主器件的 CAN 模块尚未初始化一样。 有什么原因会发生这种情况吗?
查看主器件的错误状态、我只看到 CAN_ES 寄存器中的 LEC 位设置为7。

解决此问题的一种方法是、在主器件侧、如果我没有从从 MCU 接收到数据、只需再次初始化 CAN 总线、总线就会开始工作:
//If there is no reception of data for more than 200 ms, reset the can module
if(canReTryCounter > CAN_DELAY(CAN_RETRY_TIME))
{
//Reset the can bus configuration
HAL_setupCAN_CTRL(CTRL_BRD_CAN);
canReTryCounter = 0;
}
是否有更好的方法来检测没有可用的 CAN 总线? 这里我不是在谈论 CAN 错误、而是讨论总线雪崩能力本身。
谢谢。
AK