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通信连线
![1741493099749441.png D(RX3AW_%`{9IH09]1WKO)A.png](http://uphotos.eepw.com.cn/1709346044/pics/1741493099749441.png)
从引脚配置图找到CAN通信接口绑定的引脚情况
![1741493476200084.png ]LM8]K9NB[2P8AXTCX)]WQA.png](http://uphotos.eepw.com.cn/1709346044/pics/1741493476200084.png)
3.3、测试结果
使用CAN分析仪上位机分析,上位机的CAN速率务必和实际CAN通信速率移植,否则协议解码是错误的。

下位机每隔500毫秒发送长度为8的数据包,可以看到上位机解析的数据与程序发送的数据一致

我要赚赏金
