STM32cubeIDE CAN回环模式

发布时间 2023-06-13 19:46:26作者: 虎啸岳林

配置如下

 

经过分频,选择位段1和位段2之后波特率回自己计算

CAN总线的频率实在PCLK上

CAN是有接收和发送中断的但是需要在STM32CUBEIDE中自己加入滤波器。


void
CAN_Config(void) { CAN_FilterTypeDef sFilterConfig; /*配置CAN过滤�??*/ sFilterConfig.FilterBank = 0; //过滤器 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; //32位ID sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; //32位MASK sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//通过过滤器关联到FIFO0 sFilterConfig.FilterActivation = ENABLE; //过滤器使能 sFilterConfig.SlaveStartFilterBank = 14; //区块 //过滤器配置 if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { Error_Handler(); } HAL_CAN_Start(&hcan);//以轮训的方式开始 HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);//开启中断 }

然后是CAN端口的发送函数,CAN是以包的形式发送的所以要配置好对应的结构体

CAN_FilterTypeDef sFilterConfig;
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;


uint8_t CAN_Send_Msg(uint8_t* msg ,uint8_t len,uint32_t std_id) { uint32_t TxMailbox = CAN_TX_MAILBOX0;//对应的邮箱 TxHeader.StdId = std_id;//标准标识符 TxHeader.ExtId = std_id;//拓展标识符 TxHeader.IDE = CAN_ID_STD;//使用标准帧 TxHeader.RTR = CAN_RTR_DATA;//数据帧 TxHeader.TransmitGlobalTime = ENABLE; TxHeader.DLC = len;
  //if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, msg,CAN_TX_MAILBOX0) ==HAL_OK)//这个是错误的因为hal库对应的邮箱不是地址,所以需要定义一个变量转一下
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, msg, &TxMailbox) ==HAL_OK)//HAL库发送函数  
{
return 1;
}
else return 0;
}

然后是接收函数通过中断接收,回环模式可以自检,发的什么可以自己收到什么,一个板子可以搞定自发自收。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
{
Error_Handler();
}
}
进入接收中断开始接收数据