简介
在野火STM32F103ZET6开发板上基于HAL库实现了CAN回环测试,并通过PCAN客户端工具和串口打印的方式,分别验证了CAN数据发送成功和CAN数据中断接收成功。
STM32F1开发板测试
STM32测试程序
发送函数
/*
 * 函数名:CAN_SetMsg
 * 描述  :CAN通信报文内容设置,设置一个数据内容为0-7的数据包
 * 输入  :发送报文结构体
 * 输出  : 无
 * 调用  :外部调用
 */	 
void CAN_SetMsg(void)
{	  
	uint32_t TxMailbox = 0;
	
#if CAN_STD
	TxHeader.StdId = 0x13;				//使用的标准ID
	TxHeader.IDE   = CAN_ID_STD;		//标准模式
#else
 	TxHeader.ExtId = 0x1314;			//使用的扩展ID
	TxHeader.IDE   = CAN_ID_EXT;		//扩展模式
#endif
	TxHeader.RTR = CAN_RTR_DATA;		//发送的是数据
	TxHeader.DLC = 2;					//数据长度为8字节
	TxHeader.TransmitGlobalTime = DISABLE;//是否发送时间戳
	
	TxData[0] = 0xAB;
	TxData[1] = 0xCD;
	
	/* 发送消息 */
	if (HAL_OK != HAL_CAN_AddTxMessage(&Can_Handle, &TxHeader, TxData, &TxMailbox)){
		printf("HAL_CAN_AddTxMessage is err\r\n");
		Error_Handler();
	}
}
void CAN_Test(void)
{		
		/* 装载一帧数据 */
		CAN_SetMsg();
		HAL_Delay(3000);
	
		if (can_flag) {				
				printf("\r\n CAN rece data: \r\n");	
				CAN_DEBUG_ARRAY(RxData, 2); 			
				can_flag = 0;
				HAL_Delay(1000);
		}	
}
 
中断函数
void USB_LP_CAN1_RX0_IRQHandler(void)
{
	HAL_CAN_IRQHandler(&Can_Handle);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)//接受邮箱0挂起中断回调函数
{
	if(hcan->Instance == CAN1)
	{
		can_flag = 1;//接收成功
		HAL_CAN_GetRxMessage(&Can_Handle, CAN_RX_FIFO0, &RxHeader, RxData);	//获取数据
	}
	else
	{
		can_flag = 0; //接收失败
	}
}
 
完整代码见: https://download.csdn.net/download/liuxu324/89470865
串口工具输出

PCAN-View输出
标准帧

扩展帧




















