最近在调试H7 的CAN问题时发现有不少的问题。
例如在使用Cubemx配置时一定要给每个fifo分配邮箱。否则会导致CAN无法发送
丢包问题
在使用CAN连续发送时发现只发送了第一次的数据后面的数据根本没有发送出来。下面进行代码分析
/* CAN 发送一帧数据 */
void FDCAN_Send_Message(uint32_t id,uint8_t *buf,uint8_t len)
{
FDCAN_TxHeaderTypeDef TxHeader;
/* 配置Tx缓冲区消息 */
TxHeader.Identifier = id; /* 报文ID */
TxHeader.IdType = FDCAN_EXTENDED_ID; /* 扩展ID模式 */
TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */
#if defined (CLASSIC_CAN)
if(len >= 8)
len = 8;
uint32_t CAN_FRAME_DL = len<<16;
#else
uint32_t CAN_FRAME_DL = FDCAN_DLC_BYTES_64; /* FDCAN 默认使用64*/
#endif
TxHeader.DataLength = CAN_FRAME_DL; /* 数据帧长度 */
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /*发送节点错误 */
TxHeader.BitRateSwitch = FDCAN_BRS_OFF; /* 无波特率切换 */
TxHeader.FDFormat = CAN_MODE; /* CAN模式*/
TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
TxHeader.MessageMarker = 0x01;
/* 发送缓冲区消息 */
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, buf);
while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=2);/*等待发送完成*/
}
其中
`while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=2);/*等待发送完成*/`
没有这个函数则会导致丢包 !!!
而在F407中则是
while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1)!=3)
之前在F407中移植到H743中的时候导致一直卡在这里 发现level不同!!!
注意在使用CAN前一定要启动CAN
/* 启动FDCAN模块 */
HAL_FDCAN_Start(&hfdcan1);