你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32U545】实现CAN数据收发

[复制链接]
lugl 发布时间:2023-11-25 13:18

STM32U545有一个CAN收发器,本文将介绍如何配置CAN,然后添加数据收发的功能。

1、新建基于NUCLEO-U545RE开发板的工程(略)

2、由于默认工程把PA11、PA12分配给了USB接口,所以要先禁用usb,再开启FDCAN:

image.png

3、修改波特率配置,由于CAN测试最高只支持500K所以按如下配置:

image.png

4、添加过滤器的配置代码:

/* USER CODE BEGIN FDCAN1_Init 2 */
      FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
      FDCAN1_RXFilter.FilterIndex=0;                                  //滤波器索引
      FDCAN1_RXFilter.FilterType=FDCAN_FILTER_RANGE;                   //滤波器类型
      FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0
      FDCAN1_RXFilter.FilterID1=0x0000;                               //32位ID
      FDCAN1_RXFilter.FilterID2=0x07ff;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
      if(HAL_FDCAN_ConfigFilter(&hfdcan1,&FDCAN1_RXFilter)!=HAL_OK) //滤波器初始化
        {
            Error_Handler();
        }


      HAL_FDCAN_Start(&hfdcan1);                               //开启FDCAN
      HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);

  /* USER CODE END FDCAN1_Init 2 */

5、添回收发函数如下:

/* USER CODE BEGIN 1 */
//can发送一组数据(固定格式:ID为0x01,标准帧,数据帧)
//len:数据长度(最大为8),可设置为FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8
//msg:数据指针,最大为8个字节
//返回值:0,成功;
//       其他,失败;
uint8_t FDCAN1_Send_Msg(uint8_t* msg)
{

  fdcan1_TxHeader.Identifier = 0x001;
  fdcan1_TxHeader.IdType = FDCAN_STANDARD_ID;
  fdcan1_TxHeader.TxFrameType = FDCAN_DATA_FRAME;
  fdcan1_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
  fdcan1_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  fdcan1_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
  fdcan1_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
  fdcan1_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
  fdcan1_TxHeader.MessageMarker = 0x52; //由于网上借鉴该函数,我也不太明白为什么是0x52,不过我测试改成0好像也没问题

  if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1,&fdcan1_TxHeader,msg)!=HAL_OK) return 1;//发�??
    return 0;
}
//can口接收数据查
//buf:数据缓存
//返回0,无数据被收到;
//其他,接收的数据长;
uint8_t FDCAN1_Receive_Msg(uint8_t *buf, uint16_t *Identifier,uint16_t *len)
{

  if(HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0,&fdcan1_RxHeader,buf)!=HAL_OK)return 0;//接收数据
  *Identifier = fdcan1_RxHeader.Identifier;
  *len=fdcan1_RxHeader.DataLength;
  return fdcan1_RxHeader.DataLength;
}

/* USER CODE END 1 */

6、在主程序中添加测试代码:

  /* USER CODE BEGIN 2 */
  uint8_t sen_data[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  uint8_t sen_data1[] = {0x01,0x01,0x01,0x01,0x05,0x06,0x07,0x08};
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      rec_sta = FDCAN1_Receive_Msg(rec_buf,&RxHeader,&rec_sta);
      if(rec_sta>0)
      {
          printf("recv data\r\n");
          FDCAN1_Send_Msg(rec_buf);
      }
      else
      {
          FDCAN1_Send_Msg(sen_data);
          HAL_Delay(500);
      }


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

【硬件连接】

把CAN转TTL用TX、RX按下图连接:

image.png

打开CAN分析仪,采用自动识别,连接成功:

image.png

【接收测试】CAN分析仪接收到了开发板发送的数据。

【发送测试】

从CAN分析仪上发送数据,然后成功的接收到了返回的数据

image.png

【总结】

stm32U545的FDCAN可实现向下兼容,可以配置为CAN2.0实现数据收发。使用stm32CubeIDE,配置流程简单。

【工程源码】U545CAN.zip

收藏 评论2 发布时间:2023-11-25 13:18

举报

2个回答
STMWoodData 回答时间:2023-12-12 10:13:44

学习一下,还没用过CAN功能呢

电子烂人 回答时间:2024-7-15 21:25:52

学习一下,自带CAN功能确实很有用

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版