目录
1.CAN总线介绍
1.闭环特点:速度快,距离短(40m)
2.开环特点:速度慢,距离长(1000m)
2.STM32中CAN总线配置
stm32的can总线分为5个部分
1.控制部分(配置CAN总线的工作模式)
2.邮箱发送部分(发送3个报文)
3.FIFO存储功能(每个FIFO存储3个报文)
4.筛选器(筛选需要接收的数据)
5.CAN2(使用CAN2时,必须要使能CAN1)
(1)CAN总线结构体
(2)CAN发送结构体
(3)CAN筛选器结构体
3.HALL库实验
第一步:在STM32cube中配置时钟
第二步:配置CAN总线
第三步:编写业务程序,因为STM32cube仅能完成CAN的初始化配置,发送/接收数据需要自己编写,使能CAN总线的传输功能(需要自行添加HAL_CAN_Start(&hcan))
(1)接收数据:筛选器筛选设备ID=0x1314的CAN设备的信息,放入FIFO0
(2)CAN总线发送数据:ID=1314的CAN设备发送数据
4.CAN总线发送数据不成功(已解决)
在CAN总线调试的过程中,发现数据怎么也发出不出去,这个时候有一个很好的解决方法,来判断CAN总线卡在哪一步了,定义一个HAL_StatusTypeDef类型的变量,使用串口打印信息,可以很好的判断程序哪个地方初始化有问题。
HAL_StatusTypeDef Can_Config(void)
{
Init_TxMes();
CAN_Fileter_Config();
if(HAL_CAN_ConfigFilter(&hcan, &CAN_FilterInitStruct) != HAL_OK)
{
printf("[can.c] error filter");
return HAL_ERROR;
}
if(HAL_CAN_Start(&hcan) == HAL_OK) //Æô¶¯CAN
{
printf("[can.c] CAN start OK! ");
return HAL_ERROR;
}
if(HAL_CAN_Start(&hcan) != HAL_OK) //Æô¶¯CAN
{
printf("[can.c] error start ");
return HAL_ERROR;
}
if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//¼¤»î½ÓÊÕÖжÏ
{
printf("[can.c] CAN reserve it OK! ");
return HAL_ERROR;
}
return HAL_OK;
}
程序运行部分,也使用串口打印信息,判断是否卡在某一步了。 发送信息不成功大部分都是自己编写的结构体初始化的问题,对照自己的发送数据结构体检查一下是否有问题,或是某个函数变量给错了,无法执行,花时间仔细比对一下,问题就解决了。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_CAN_AddTxMessage(&hcan, &CAN_HandleTxMsg, temp, &pTxMailbox) != HAL_OK)
{
printf("[main] info Tx Fail\r\n");
}
HAL_Delay(500);
printf("[main] info Sent success\r\n");
if(Flag_Rx)
{
Flag_Rx = 0;
printf("Rx:%d %d %d %d\r\n",RxData[0],RxData[1],RxData[2],RxData[3]);
}
}