1、简介
CAN(Controller Area Network)通信是一种用于汽车和工业环境中的多主机通信协议。它是由德国Bosch公司于1980年代开发,旨在降低汽车中电子控制单元(ECU)之间的通信复杂性。CAN总线允许不同ECU之间进行有效、可靠的数据交换。
CAN通信广泛应用于汽车行业,它允许车辆的各个控制系统(如引擎管理、动力总成、底盘控制、车身电子等)之间进行通信。此外,CAN也被用于工业自动化、医疗设备、机器人技术等领域,因为它提供了高效率和高度可靠的数据通信方式。
在物理层面上,CAN总线通常使用两根线(CAN高和CAN低)形成一个差分信号,这样可以在高电磁干扰环境下保持通信的稳定性。随着技术的发展,CAN协议也不断更新,比如CAN FD(CAN with Flexible Data-Rate)就是CAN协议的一个扩展,它支持更高的数据传输速率和更长的数据字段。
2、准备工具
带CAN通信外设的开发板一套,这里以STM32L431RCT6主控板为例;
CAN逻辑分析仪1个;
CAN PHY模块1个。
实物图片
3、CubeMX配置
以下将CAN通信速率设为500Kbit/s,通信模式为Normal双向通信,选择生成MDK工程
3.1、Keil测试代码
在can.c文件添加CAN滤波器配置
/* USER CODE BEGIN 1 */ void Configure_Filter(void) { CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterIdHigh=0X0000; sFilterConfig.FilterIdLow=0X0000; sFilterConfig.FilterMaskIdHigh=0X0000; sFilterConfig.FilterMaskIdLow=0X0000; sFilterConfig.FilterFIFOAssignment=CAN_FILTER_FIFO0; sFilterConfig.FilterBank=1; sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT; sFilterConfig.FilterActivation=ENABLE; sFilterConfig.SlaveStartFilterBank=14; if(HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig)!=HAL_OK) { Error_Handler(); } } /* USER CODE END 1 */
main.c文件
int main(void) { /* USER CODE BEGIN 1 */ CAN_TxHeaderTypeDef Can_Tx; static uint8_t txdata[8] = {0x03,0x11,0x03,0x42,0x77,0x0a,0x07,0x08}; uint32_t pTxMailbox = 0; Can_Tx.StdId = 0x122; // Can_Tx.ExtId = 0x123; Can_Tx.IDE = 0; Can_Tx.RTR = 0; Can_Tx.DLC = 8; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_CAN1_Init(); /* USER CODE BEGIN 2 */ Configure_Filter(); HAL_CAN_Start(&hcan1); HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); HAL_CAN_AddTxMessage(&hcan1,&Can_Tx,txdata,&pTxMailbox); HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
3.2、CAN通信连线
从引脚配置图找到CAN通信接口绑定的引脚情况
3.3、测试结果
使用CAN分析仪上位机分析,上位机的CAN速率务必和实际CAN通信速率移植,否则协议解码是错误的。
下位机每隔500毫秒发送长度为8的数据包,可以看到上位机解析的数据与程序发送的数据一致