【前言】
【STM32F373】1、CAN驱动-电子产品世界论坛 (eepw.com.cn)
这一篇我分享了F373的CAN驱动,为了实现上位机,STM32H750板载了FDCAN,但是为了匹配也配置为普通的CAN来驱动,实现与STM32F373的互相通信。
【CAN的配置】
从原理图上找到开发板上使用FDCAN1外接IO为PB8、PB9。

因此配置FDCAN1如下:

参数配置如下:

从图形化配置中我们可以看到通为500K与F373的CAN总线速度一致。
同时开启RX0的接收中断。

【配置过滤器】
如下的配置,接收所有的ID
//配置RX滤波器
FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID; //标准ID
FDCAN1_RXFilter.FilterIndex=0; //滤波器索引
FDCAN1_RXFilter.FilterType=FDCAN_FILTER_MASK; //滤波器类型
FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0; //过滤器0关联到FIFO0
FDCAN1_RXFilter.FilterID1=0x0000; //32位ID
FDCAN1_RXFilter.FilterID2=0x0000; //如果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);编写收到数据的中断回调函数如下:
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
int i;
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
printf("recv data\r\n");
HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &fdcan1_RxHeader, RxData);
printf("recv data:%d data:",fdcan1_RxHeader.DataLength);
for(i=0;i<fdcan1_RxHeader.DataLength; i++)
{
printf("0x%02x ",RxData[i]);
}
printf("\r\n");
}
}【测试】
在任务函数中定时发送数据:
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint8_t msg[2]={0x01,0xff};
for(;;)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
osDelay(500);
FDCAN1_Send_Msg(msg,2);
}
/* USER CODE END StartDefaultTask */
}打开CAN分析仪,可以自动匹配到500K的CAN总线,同时接收到数据:

发送数据后,可以在串口中看到接收的数据是对的:

【总结】
此次为FDCAN作为普通CAN来使用,可以成功的完成了发送与接收的测试。
我要赚赏金
