【前言】
【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来使用,可以成功的完成了发送与接收的测试。