简介
在野火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