STM32配置FDCAN通讯

这篇具有很好参考价值的文章主要介绍了STM32配置FDCAN通讯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32配置FDCAN通讯

由于总线上有设备不支持FDCAN,为了保持兼容性,将本机FDCAN配置为传统CAN运行。

CubeMX配置

开启SW调试接口
开启FDCAN2
开启外部时钟
STM32配置FDCAN通讯
外部晶振为12M,主频480M,FDCAN时钟来自PLL1Q
STM32配置FDCAN通讯
STM32配置FDCAN通讯
FDCAN2参数设置,参数设置的说明,在代码中有注释,
在此强调2点:
1 配置为传统CAN模式时要关闭自动重传,原子哥建议,不知为何,有待测试,CAN标准是支持自动重传的。
2 FDCAN支持仲裁段与数据段波特率不同,而传统模式二者相同,所以若配置为传统CAN时(如本例),数据段可以不配,即Data开始的4个参数可以采用默认值
波特率说明: 前面配置的FDCAN时钟频率为20MHz,Seg1+Seg2+1=40,20MHz/40=500KHz,为保持一致性,Data段配置也和仲裁段(Nominal)配成一样了。
STM32配置FDCAN通讯
开启中断
STM32配置FDCAN通讯

最后点Generate,生成工程

Keil代码

首先是定义变量

FDCAN_RxHeaderTypeDef RxHeader;
FDCAN_TxHeaderTypeDef TxHeader;
u8 RxData[8];
u8 TxData[8] = {'L', 'a', 'o', 'L', 'i', '1', '2', '3'};

下面这一段是CubeMX生成的CAN配置参数,我做了备注

void MX_FDCAN2_Init(void)
{
  /* USER CODE BEGIN FDCAN2_Init 0 */
  /* USER CODE END FDCAN2_Init 0 */

  /* USER CODE BEGIN FDCAN2_Init 1 */
  hfdcan2.Instance = FDCAN2;                      //用FDCAN2
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; //配置为传统模式
  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;          //正常工作状态
  hfdcan2.Init.AutoRetransmission = DISABLE;      //关闭自动重传, 传统模式下需关闭
  hfdcan2.Init.TransmitPause = DISABLE;           //关闭传输暂停
  hfdcan2.Init.ProtocolException = DISABLE;       //关闭协议异常处理
  hfdcan2.Init.NominalPrescaler = 1;              //仲裁段时钟分频  FDCAN时钟基准为20MHz  传统CAN模式时只设置这一段即可
  hfdcan2.Init.NominalSyncJumpWidth = 8;          //同步跳转段的宽度 8
                                                  //时钟频率20M / (1 + TSG1 + TSG2) = CAN波特率
  hfdcan2.Init.NominalTimeSeg1 = 31;              //时间段1    31
  hfdcan2.Init.NominalTimeSeg2 = 8;               //时间段2    8
  
  hfdcan2.Init.DataPrescaler = 1;                 //数据段时钟分频,若工作于传统模式,不需要设置数据段参数
                                                  //                若工作于FDCAN模式,允许数据段与仲裁段波特率不同
  hfdcan2.Init.DataSyncJumpWidth = 8;             //8
  hfdcan2.Init.DataTimeSeg1 = 31;                 //31
  hfdcan2.Init.DataTimeSeg2 = 8;                  //8

  hfdcan2.Init.MessageRAMOffset = 0;              //消息偏移
  hfdcan2.Init.StdFiltersNbr = 1;                 //标准帧使用滤波器1
  hfdcan2.Init.ExtFiltersNbr = 1;                 //扩展帧使用滤波器1
  hfdcan2.Init.RxFifo0ElmtsNbr = 1;                   //接收FIFO0的元素编号1
  hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;  //接收FIFO0的元素长度8
  hfdcan2.Init.RxFifo1ElmtsNbr = 1;                   //接收FIFO1的元素编号1
  hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;  //接收FIFO1的元素长度8
  hfdcan2.Init.RxBuffersNbr = 1;                      //接收缓冲区编号1
  hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;     //接收缓冲区长度
  hfdcan2.Init.TxEventsNbr = 2;                       //发送事件编号
  hfdcan2.Init.TxBuffersNbr = 1;                      //发送缓冲区编号
  hfdcan2.Init.TxFifoQueueElmtsNbr = 2;               //发送FIFO队列元素编号
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; //发送模式 先入先出
  hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;       //发送元素长度8
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN2_Init 2 */
  /* USER CODE END FDCAN2_Init 2 */

CAN滤波器的设置,本函数要自己写,然后放到自己的初始化代码中,在CubeMX生成的初始化代码的后面。

void FDCAN2_Config(void)
{
  FDCAN_FilterTypeDef sFilterConfig;
  
  HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
  
  sFilterConfig.IdType = FDCAN_STANDARD_ID;   //  配置为过滤标准帧
  sFilterConfig.FilterIndex = 0;              //  过滤器的索引号
  sFilterConfig.FilterType = FDCAN_FILTER_RANGE;  //  过滤方式为范围,即从FilterID1~FilterID2之间的值
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  sFilterConfig.FilterID1 = 0x0000;
  sFilterConfig.FilterID2 = 0x07ff;           //  标准帧为11位ID,即0x7ff,本例配置为接收所有帧
  if(HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    Error_Handler();
  
  sFilterConfig.IdType = FDCAN_EXTENDED_ID;   //  配置为过滤扩展帧
  sFilterConfig.FilterIndex = 0;              //  过滤器的索引号
  sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;  //  过滤方式为范围,即从FilterID1~FilterID2之间的值
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
  sFilterConfig.FilterID1 = 0x00000000;
  sFilterConfig.FilterID2 = 0x01ffffff;       //  扩展帧为29位ID,即0x1fffffff,本例配置为接收所有帧
  HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
  
  TxHeader.Identifier = 0x123;
  TxHeader.IdType = FDCAN_STANDARD_ID;
  TxHeader.TxFrameType = FDCAN_DATA_FRAME;
  TxHeader.DataLength = FDCAN_DLC_BYTES_8;
  TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
  TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
  TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
  TxHeader.MessageMarker = 0x52;

  HAL_FDCAN_Start(&hfdcan2);
}

然后是发送代码,这个简单,即每延时200ms,发送一次数据

  while (1)
  {
    HAL_Delay(200);
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

接收采用中断的方式,在FDCAN2_IT0中断内写入一句

void FDCAN2_IT0_IRQHandler(void)
{
  /* USER CODE BEGIN FDCAN2_IT0_IRQn 0 */

  /* USER CODE END FDCAN2_IT0_IRQn 0 */
  HAL_FDCAN_IRQHandler(&hfdcan2);
  /* USER CODE BEGIN FDCAN2_IT0_IRQn 1 */
  HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO0, &RxHeader, RxData);

  /* USER CODE END FDCAN2_IT0_IRQn 1 */
}

代码验证

打开CAN分析仪的界面,可以看到接收到的数据帧
STM32配置FDCAN通讯
在CAN分析仪发送数据后,可以在中断内接收到发来的数据
STM32配置FDCAN通讯
STM32配置FDCAN通讯

完整代码下载

https://download.csdn.net/download/13011803189/85054662文章来源地址https://www.toymoban.com/news/detail-401126.html

到了这里,关于STM32配置FDCAN通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32——CAN通讯

    can通讯传输的是一种 差分信号 ,关于具体的硬件电路略。 1、发送流程 前置工作:如 时钟的开启、引脚的配置; CAN邮箱和模式等配置 参考下面或HAL库选择 选择一个 空置 的邮箱(判断空置:CAN_TSR的TMEx位); 在这个空置邮箱中按数据帧格式设置ID、数据长度以及要发送的数

    2024年03月09日
    浏览(49)
  • STM32CubeMX串口通讯

    根据通讯使用的电平标准不同, 串口通讯可分为 TTL 标准及 RS-232 标准 。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。 讲到串口,我们还需要具备这些基础概念。 单工通讯 (1)单工通讯特点很简单,就是只有一个发送端,一个接收端。 从一

    2024年02月02日
    浏览(72)
  • STM32 I2C通讯+MPU6050通讯演示

    1.I2C通讯简介 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线; 两根通信线:SCL(Serial Clock)、SDA(Serial Data); 同步,半双工,带数据应答; 支持总线挂载多设备(一主多从、多主多从) 2.硬件电路 所有I2C设备的SCL连在一起,SDA连在一起; 设备的SCL和SDA均要配置

    2024年01月21日
    浏览(73)
  • STM32 CAN通讯实验程序

    目录 STM32 CAN通讯实验 CAN硬件原理图 CAN外设原理图 TJA1050T硬件描述 实验线路图 回环实验 CAN头文件配置  CAN_GPIO_Config初始化 CAN初始化结构体 CAN筛选器结构体  接收中断优先级配置 接收中断函数 main文件 实验现象 补充 CAN外设原理图 野火STM32F103ZET6霸道板载原理图 我们的开发

    2024年02月15日
    浏览(38)
  • STM32-I2C通讯

    I2C( Inter-Integrated Circuit )是一种通用的总线协议。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种 简单的双向两线制 总线协议标准。 I2C有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。 支持同步,半双工,带数据应答,

    2024年03月14日
    浏览(45)
  • STM32学习----RS232串口通讯

    一、RS232相关概念        RS ==Recommend Standard ==推荐标准;         232==标识号,第232号;         时间:1962年         地点:美国         人物:美国电子工业协会 == Electronic Industries Association ==(美国)电子工业协会         事件:发布了一个串行通信的物理接口结合逻

    2024年02月06日
    浏览(56)
  • STM32学习:串口通讯(proteus仿真)

    本次通过CubeMx+proteus进行stm32串口仿真 具体功能: 1、开机后,向串口1发送“Welcome” 2、串口1接收字节指令“0xa1\\\",打开LED1,回传“LED1 OPEN!” 3、串口1接收字节指令“0xa2\\\",关闭LED1,回传“LED1 Close!” 4、在串口发送过程中,打开LED2作为发送数据指示灯 1、COMPIM元件 作用:把仿

    2024年02月03日
    浏览(46)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(67)
  • STM32(2)-串口通讯实际应用:串口屏

    文章以UART基础知识和串口屏实际应用来说明串口的作用。 、 UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是一种串行通讯协议,通常用于将计算机或微处理器与其他设备(如传感器、模块、显示器等)进行通信。UART可以将数据以一定速率和格式(

    2024年02月16日
    浏览(44)
  • STM32完成软件I2C通讯

    今天的重点是利用STM32的软件方案和MPU60506轴姿态传感器建立通讯,今天只完成了简单的发送地址和接收应答的部分,特此记录一下过程,以后忘记可以随时翻出来看看。 先介绍最基本的I2C通讯的最基本的6个时序: 一:起始条件:SCL高电平期间,SDA从高电平切换到低电平 时

    2024年04月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包