STM32CubeMX系列教程12:控制器局域网络(CAN)
在main.c文件前面添加变量,sFilterConfig为CAN滤波器结构体变量,TxMessage,RxMessage分别存储CAN发送和接收的消息。
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ CAN_FilterConfTypeDef sFilterConfig; static CanTxMsgTypeDef TxMessage; static CanRxMsgTypeDef RxMessage; /* USER CODE END PV */
在main函数中,初始化发送消息邮箱,设置为标准数据帧,数据长度为8个字节,数据为“CAN Test"。设置滤波器。
/* USER CODE BEGIN 2 */
hcan2.pTxMsg = &TxMessage;
hcan1.pRxMsg = &RxMessage;
printf("**** This is CAN test program ****\r\n\r\n");
/*##-1- Configure CAN2 Transmission Massage #####################################*/
hcan2.pTxMsg->StdId = 0x123;
hcan2.pTxMsg->RTR = CAN_RTR_DATA;
hcan2.pTxMsg->IDE = CAN_ID_STD;
hcan2.pTxMsg->DLC = 8;
hcan2.pTxMsg->Data[0] = 'C';
hcan2.pTxMsg->Data[1] = 'A';
hcan2.pTxMsg->Data[2] = 'N';
hcan2.pTxMsg->Data[3] = ' ';
hcan2.pTxMsg->Data[4] = 'T';
hcan2.pTxMsg->Data[5] = 'e';
hcan2.pTxMsg->Data[6] = 's';
hcan2.pTxMsg->Data[7] = 't';
/*##-2- Configure the CAN1 Filter ###########################################*/
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = 0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
/* USER CODE END 2 */在while循环中添加应用程序,CAN2发送信息给CAN1接收,正确接收到信息后打印输出。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/*##-3- Start the CAN2 Transmission process #####################################*/
if(HAL_CAN_Transmit(&hcan2, 10) != HAL_OK)
{
/* Transmition Error */
Error_Handler();
}
if(HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY)
{
Error_Handler();
}
/*##-4- Start the CAN1 Reception process ########################################*/
if(HAL_CAN_Receive(&hcan1, CAN_FIFO0,10) != HAL_OK)
{
/* Reception Error */
Error_Handler();
}
if(HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY)
{
Error_Handler();
}
printf("StdId : %x\r\n",hcan1.pRxMsg->StdId);
printf("RxMsg : %s",hcan1.pRxMsg->Data);
printf("\r\n\r\n");
HAL_Delay(1000);
}
/* USER CODE END 3 */





















支付宝打赏
微信打赏 


