STM32U545有一个CAN收发器,本文将介绍如何配置CAN,然后添加数据收发的功能。
1、新建基于NUCLEO-U545RE开发板的工程(略)
2、由于默认工程把PA11、PA12分配给了USB接口,所以要先禁用usb,再开启FDCAN:
3、修改波特率配置,由于CAN测试最高只支持500K所以按如下配置:
4、添加过滤器的配置代码:
/* USER CODE BEGIN FDCAN1_Init 2 */
FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID; //标准ID
FDCAN1_RXFilter.FilterIndex=0; //滤波器索引
FDCAN1_RXFilter.FilterType=FDCAN_FILTER_RANGE; //滤波器类型
FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0
FDCAN1_RXFilter.FilterID1=0x0000; //32位ID
FDCAN1_RXFilter.FilterID2=0x07ff; //如果FDCAN配置为传统模式的话,这里是32位掩码
if(HAL_FDCAN_ConfigFilter(&hfdcan1,&FDCAN1_RXFilter)!=HAL_OK) //滤波器初始化
{
Error_Handler();
}
HAL_FDCAN_Start(&hfdcan1); //开启FDCAN
HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
/* USER CODE END FDCAN1_Init 2 */
5、添回收发函数如下:
/* USER CODE BEGIN 1 */
//can发送一组数据(固定格式:ID为0x01,标准帧,数据帧)
//len:数据长度(最大为8),可设置为FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8
//msg:数据指针,最大为8个字节
//返回值:0,成功;
// 其他,失败;
uint8_t FDCAN1_Send_Msg(uint8_t* msg)
{
fdcan1_TxHeader.Identifier = 0x001;
fdcan1_TxHeader.IdType = FDCAN_STANDARD_ID;
fdcan1_TxHeader.TxFrameType = FDCAN_DATA_FRAME;
fdcan1_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
fdcan1_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
fdcan1_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
fdcan1_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
fdcan1_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
fdcan1_TxHeader.MessageMarker = 0x52; //由于网上借鉴该函数,我也不太明白为什么是0x52,不过我测试改成0好像也没问题
if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1,&fdcan1_TxHeader,msg)!=HAL_OK) return 1;//发�??
return 0;
}
//can口接收数据查
//buf:数据缓存
//返回0,无数据被收到;
//其他,接收的数据长;
uint8_t FDCAN1_Receive_Msg(uint8_t *buf, uint16_t *Identifier,uint16_t *len)
{
if(HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0,&fdcan1_RxHeader,buf)!=HAL_OK)return 0;//接收数据
*Identifier = fdcan1_RxHeader.Identifier;
*len=fdcan1_RxHeader.DataLength;
return fdcan1_RxHeader.DataLength;
}
/* USER CODE END 1 */
6、在主程序中添加测试代码:
/* USER CODE BEGIN 2 */
uint8_t sen_data[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uint8_t sen_data1[] = {0x01,0x01,0x01,0x01,0x05,0x06,0x07,0x08};
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
rec_sta = FDCAN1_Receive_Msg(rec_buf,&RxHeader,&rec_sta);
if(rec_sta>0)
{
printf("recv data\r\n");
FDCAN1_Send_Msg(rec_buf);
}
else
{
FDCAN1_Send_Msg(sen_data);
HAL_Delay(500);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
【硬件连接】
把CAN转TTL用TX、RX按下图连接:
打开CAN分析仪,采用自动识别,连接成功:
【接收测试】CAN分析仪接收到了开发板发送的数据。
【发送测试】
从CAN分析仪上发送数据,然后成功的接收到了返回的数据
【总结】
stm32U545的FDCAN可实现向下兼容,可以配置为CAN2.0实现数据收发。使用stm32CubeIDE,配置流程简单。
【工程源码】
学习一下,还没用过CAN功能呢
学习一下,自带CAN功能确实很有用