一.CAN简介
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。
CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,总线电平分为显性电平和隐性电平。
CAN总线采用两种互补的逻辑数值"显性"和"隐性"。"显性"数值表示逻辑"0",而"隐性"表示逻辑"1"。当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。
0
|
|
|
|
CAN1,CNA2只需配置时间参数,波特率为500KHz,其他为默认不作修改。
|
|
|
|
|
生成报告以及代码,编译程序。在can.c文件中可以看到CAN初始化函数。在stm327xx_hal_can.h文件后面可以看到CAN操作函数。
在main.c文件前面添加变量,sFilterConfig为CAN滤波器结构体变量,TxMessage,RxMessage分别存储CAN发送和接收的消息。
1 | /* USER CODE BEGIN PV */ |
2 | /* Private variables ---------------------------------------------------------*/ |
3 | CAN_FilterConfTypeDef sFilterConfig; |
4 | static CanTxMsgTypeDef TxMessage; |
5 | static CanRxMsgTypeDef RxMessage; |
|
|
|
|
|
在main函数中,初始化发送消息邮箱,设置为标准数据帧,数据长度为8个字节,数据为“CAN Test"。设置滤波器。
01 | /* USER CODE BEGIN 2 */ |
02 | hcan2.pTxMsg = &TxMessage; |
03 | hcan1.pRxMsg = &RxMessage; |
05 | printf("**** This is CAN test program ****rnrn"); |
07 | /*##-1- Configure CAN2 Transmission Massage #####################################*/ |
08 | hcan2.pTxMsg->StdId = 0x123; |
09 | hcan2.pTxMsg->RTR = CAN_RTR_DATA; |
10 | hcan2.pTxMsg->IDE = CAN_ID_STD; |
11 | hcan2.pTxMsg->DLC = 8; |
12 | hcan2.pTxMsg->Data[0] = 'C'; |
13 | hcan2.pTxMsg->Data[1] = 'A'; |
14 | hcan2.pTxMsg->Data[2] = 'N'; |
15 | hcan2.pTxMsg->Data[3] = ' '; |
16 | hcan2.pTxMsg->Data[4] = 'T'; |
17 | hcan2.pTxMsg->Data[5] = 'e'; |
18 | hcan2.pTxMsg->Data[6] = 's'; |
19 | hcan2.pTxMsg->Data[7] = 't'; |
21 | /*##-2- Configure the CAN1 Filter ###########################################*/ |
22 | sFilterConfig.FilterNumber = 0; |
23 | sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; |
24 | sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; |
25 | sFilterConfig.FilterIdHigh = 0x0000; |
26 | sFilterConfig.FilterIdLow = 0x0000; |
27 | sFilterConfig.FilterMaskIdHigh = 0x0000; |
28 | sFilterConfig.FilterMaskIdLow = 0x0000; |
29 | sFilterConfig.FilterFIFOAssignment = 0; |
30 | sFilterConfig.FilterActivation = ENABLE; |
31 | sFilterConfig.BankNumber = 14; |
32 | HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig); |
|
|
|
|
|
在while循环中添加应用程序,CAN2发送信息给CAN1接收,正确接收到信息后打印输出。
01 | /* USER CODE BEGIN WHILE */ |
04 | /* USER CODE END WHILE */ |
06 | /* USER CODE BEGIN 3 */ |
07 | /*##-3- Start the CAN2 Transmission process #####################################*/ |
08 | if(HAL_CAN_Transmit(&hcan2, 10) != HAL_OK) |
10 | /* Transmition Error */ |
13 | if(HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY) |
18 | /*##-4- Start the CAN1 Reception process ########################################*/ |
19 | if(HAL_CAN_Receive(&hcan1, CAN_FIFO0,10) != HAL_OK) |
24 | if(HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY) |
28 | printf("StdId : %xrn",hcan1.pRxMsg->StdId); |
29 | printf("RxMsg : %s",hcan1.pRxMsg->Data); |
编译程序并下载到开发板。将两个 SN65HVD230 CAN Board模块分别连接到板上的 CAN1 和 CAN2 接口。 用杜邦线连接两个 CAN 模块(CANL -> CANL, CANH -> CANH)。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。
|
|
|
|
|