STM32G431收发CAN

1.硬件连接

PB8作为CAN_RX,PB9作为CAN_TX,连接一个CAN收发器TJA1051T/3

2. CubeMX里配置CAN


设置连接FDCAN1的参数,使用1个标准过滤器,波特率位500K

使能FDCAN1的中断

3 自动生成代码

3.1 初始化

c 复制代码
static void MX_FDCAN1_Init(void)
{

  /* USER CODE BEGIN FDCAN1_Init 0 */
	__HAL_RCC_FDCAN_CLK_ENABLE();
  /* USER CODE END FDCAN1_Init 0 */

  /* USER CODE BEGIN FDCAN1_Init 1 */

  /* USER CODE END FDCAN1_Init 1 */
  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV2;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan1.Init.AutoRetransmission = DISABLE;
  hfdcan1.Init.TransmitPause = DISABLE;
  hfdcan1.Init.ProtocolException = DISABLE;
  hfdcan1.Init.NominalPrescaler = 2;
  hfdcan1.Init.NominalSyncJumpWidth = 1;
  hfdcan1.Init.NominalTimeSeg1 = 14;
  hfdcan1.Init.NominalTimeSeg2 = 3;
  hfdcan1.Init.DataPrescaler = 1;
  hfdcan1.Init.DataSyncJumpWidth = 1;
  hfdcan1.Init.DataTimeSeg1 = 1;
  hfdcan1.Init.DataTimeSeg2 = 1;
  hfdcan1.Init.StdFiltersNbr = 1;
  hfdcan1.Init.ExtFiltersNbr = 0;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN1_Init 2 */
	  CAN_SetFilter();

  	  HAL_FDCAN_Start(&hfdcan1);
  	  // Activate notifications
      HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY,0);
      HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
  /* USER CODE END FDCAN1_Init 2 */

}

手工增加:

  • FDCAN时钟使能 __HAL_RCC_FDCAN_CLK_ENABLE();
  • 过滤器设置 CAN_SetFilter();
  • 激活中断信号,发送完成和FIFO0收到新消息
  • 启动 HAL_FDCAN_Start(&hfdcan1);

3.2 过滤器设置

c 复制代码
/* USER CODE BEGIN 4 */
void CAN_SetFilter()
{
	FDCAN_FilterTypeDef sFilterConfig;

	// 初始化过滤器配置结构
	sFilterConfig.IdType=FDCAN_STANDARD_ID;
	sFilterConfig.FilterIndex=0;
	sFilterConfig.FilterType=FDCAN_FILTER_DUAL;
	sFilterConfig.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;
	sFilterConfig.FilterID1=0x11;
	sFilterConfig.FilterID2=0x22;

	if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
	{
	    // 处理错误
		  Error_Handler();
	}

	//全局过滤器设置,如果包含上述条件的帧则通过
	HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
}
  • 采用一个标准过滤器,过滤器号:0, 过滤类型FDCAN_FILTER_DUAL,就是把FilterID1和FilterID2当成2个CAN ID,过滤器配置为FDCAN_FILTER_TO_RXFIFO0,即把那两个CANID的消息存入RX FIFO0
  • 记得进行全局过滤设置,其函数原型如下:

  • 本例中拒绝不匹配的标准帧,拒绝不匹配的扩展帧,接收过滤后的标准远程帧,接收过滤后的扩展远程帧。

3.3 中断处理

c 复制代码
void FDCAN1_IT0_IRQHandler(void)
{
  /* USER CODE BEGIN FDCAN1_IT0_IRQn 0 */
	CAN_Rcv_IR();
  /* USER CODE END FDCAN1_IT0_IRQn 0 */
  HAL_FDCAN_IRQHandler(&hfdcan1);
  /* USER CODE BEGIN FDCAN1_IT0_IRQn 1 */

  /* USER CODE END FDCAN1_IT0_IRQn 1 */
}

加入接收中断处理函数:CAN_Rcv_IR();

c 复制代码
void CAN_Rcv_IR()
{
	if (__HAL_FDCAN_GET_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE))
	    {	       
			FDCAN_RxHeaderTypeDef pHeader;
			uint8_t pData[64];
	        // 循环处理新消息
	        while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1,FDCAN_RX_FIFO0 ) > 0)
	        {
	            // 从Rx FIFO 0中读取消�?
	            if(HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0 ,&pHeader,pData)== HAL_OK)
	            {
	            	TxData[4]=pHeader.RxTimestamp & 0xFF;
	            	TxData[5]=pHeader.DataLength & 0xFF;
	            	TxData[6]=pHeader.Identifier & 0xFF;
	            	TxData[7]=pData[0];
	            	counter++;
	            	CAN_Send();
	            }
	            else
	            {
	                // 处理读取消息时的错误
	            	  Error_Handler();
	            }

	        }
	        // 清除Rx FIFO 0新消息标志
	        __HAL_FDCAN_CLEAR_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE);
	    }
}

如果检测到FIFO0新消息标志:FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE

则循环处理FIFO0中的消息

相关推荐
Horn Still Sounds8 小时前
51单片机入门:硬件基础、位运算、数码管动态显示完整梳理
嵌入式硬件·mongodb·51单片机
三佛科技-187366133979 小时前
24W-48W隔离双绕组非标自供电芯片LP3718CD(电路原理图)
单片机·嵌入式硬件
糖糖单片机设计11 小时前
基于 STM32 的小型鸟类宠物繁殖系统
stm32·嵌入式硬件·宠物
电子元器件选型哥12 小时前
一文讲清LLC谐振电路工作原理
单片机·嵌入式硬件·硬件工程师·电子元器件·器件选型
HUI-47413 小时前
EG1162|SOP‑16 高压同步整流降压控制器,最高 600V 输入,大电流 5V 输出优选
嵌入式硬件·硬件工程
POMAGTOR13 小时前
【5G 通讯 POGOPIN 弹簧顶针连接器解决方案】
网络·嵌入式硬件·5g
ZLG_zhiyuan13 小时前
测试方案 | 从“000”到“111”,高效完成100BASE-TX以太网眼图测试
单片机·嵌入式硬件
恒锐丰科技林技术员13 小时前
EG1198:120V 宽压内置 MOS 降压 DC‑DC 电源芯片解析
经验分享·嵌入式硬件·硬件工程
数字新视界14 小时前
能耗管理系统的综合方案与优化实战解析
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
深圳市恒锐丰科技杨生15 小时前
EG3525S 推挽 / 半桥 PWM 控制器|屹晶 EGmicro
嵌入式硬件·硬件工程