STM32——CAN通讯

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

STM32-CAN通讯

一、发送和接收流程

can通讯传输的是一种差分信号,关于具体的硬件电路略。

1、发送流程
  • 前置工作:如 时钟的开启、引脚的配置;CAN邮箱和模式等配置参考下面或HAL库选择

  • 选择一个空置的邮箱(判断空置:CAN_TSR的TMEx位);

  • 在这个空置邮箱中按数据帧格式设置ID、数据长度以及要发送的数据;

  • 请求发送(CAN_TIxR 的 TXRQ = 1 );

  • 后面的是硬件来实现的(这个过程可以被软件打断):

    • 邮箱挂号(等优先);
    • 预定(等总线);
    • 发送;
    • 空置。
2、接收流程
  • 前置工作略
  • 配置过滤器:给过滤器绑定一个FIFO,之后以FIFO0为例;
  • 硬件自动处理:收到报文后挂号到FIFO0(绑定的)的空闲邮箱深度;如果邮箱深度,再收到报文会溢出;
    • 这个挂号和溢出都可以触发中断
  • 软件接收:有个邮箱深度里挂过一次号即存一个报文,所以,可以通过挂号的数量来获取到存进来的报文数量。具体参考寄存器的位。

二、数据帧格式

  • 标准帧

    • 仲裁段:
      • SOF : 帧起始,1bit
      • ID : 11bit
      • RTR : 1bit ------------------- 0数据帧;1远程帧
    • 控制段
      • IDE : 1bit -------------------- 0标准格式;1扩展格式
      • R0 : 1bit ---------------------- 保留位
      • DLC : 4bit ---------------------- 数据字节个数 , 虽然有4bit容量,但只能放0-8,也就是最大发送8byte数据
    • 数据段 0-64bit,最大64bit,即8byte数据
    • CRC段
      • CRC : 15bit 校验
      • 界定符 : 1bit 校验结束
    • ACK段
      • ACK : 1bit 确认
      • 界定符 : 1bit 确认结束
    • 帧结束 7bit
  • 扩展帧

    略。比标准帧多了 1bit SRR, 18bit ID, 1bit R1保留位。

三、bit时段

​ 为了实现发收双方数据的同步,将传送每个bit的时间分为n个小的时间单位,这个时间单位就是tq, 可配置每个tq的具体时长。

​ CAN通讯是一种异步传输通讯,通过位时段来确认双方的通讯无误。

  • sync (ss) : 同步段。1tq
  • prop-set (pts) : 传播时间段。一般 1-8tq,补传输时的延时的误差
  • phase1 (pbs1) : 相位缓冲段1。一般 1-8tq,补边沿误差
  • phase2 (pbs2) : 相位缓冲段2。一般2-8tq,补边沿误差

​ 硬同步:接收到起始帧SOF时,调整同步段SS,使得与发送方SOF的SS段一致。

​ 再同步:接收过起始帧以后,发现与发送方不同步,则通过拉或缩相位段进行位同步。

​ 采样点:每个bit的采样位置,采样时发现位不同步则进行调整。

​ 在stm32f103中,prop-seg和phase1合作为了一段。

​ CAN通讯并【不是】通过波特率(每秒传输速率,比如uart中,确定起始位后,可以通过波特率完成)来确保通讯的,但它可以计算出波特率。

​ 1bit花费n个tq

​ tq = ( CAN_BTR的BRP位 + 1 ) * Tcan频率

​ 1bit中所有时段花费的tq = 1bit花费的时间

​ 波特率 = 1s / 1bit花费的时间

四、工作模式和测试模式

1、工作模式

​ 睡眠、正常、初始化。 通过寄存器控制。

2、测试模式

​ 静默模式(LBKM=0, SILM=1):可以自通讯,对外部只收不发;

​ 环回模式(LBKM=1, SILM=0):可以自通讯,对外部只发不收;

​ 环回静默模式(LBKM=1,SILM=1):可以自通讯,对外部不发不收。

五、CAN主体功能

1、CAN1和CAN2

​ 对于非互联产品,如stm32f103系列,只有一个CAN1,有14个过滤器组;

​ 对于互联型产品,如105、107系列,有一个CAN1和一个CAN2,连个CAN共享28个过滤器组。

2、发送邮箱

​ 3个。将要发送的报文放到某个邮箱中,硬件自动发送出去。

3、接收邮箱和FIFO

关于FIFO和接收邮箱,可以说每个FIFO里有三个邮箱,但一般说法是每个FIFO里有三个邮箱深度。

stm32f103系列中,CAN功能有2个FIFO(队列), 每个FIFO有3个邮箱深度, 每个邮箱深度可放一个报文。

当报文通过滤波器过滤之后,就存储到了某个FIFO的某邮箱中,这个需要FIFO和过滤器进行关联配置。

硬件会遍历配置好的FIFO中的邮箱深度以存储报文。

4、接收滤波器 (关于位宽和模式)

​ 上面说到,stm32103系列CAN功能有14个过滤器组;

​ 每个过滤器组由2个32位寄存器组成。

  • 位宽:

    可通过CAN_FS1R寄存器的FSCx(0-13)位将这2个32位运用为:

    • 0 ———— 4个单位,每个单位16bit
    • 1 ———— 2个单位,每个单位32bit
  • 过滤器模式:

    可通过CAN_FM1R寄存器的FBMx位控制

    • 1 ———— 标识符模式: 4或2个单位全填ID, 只有填进去的ID才可通过过滤器放到FIFO的邮箱深度中
    • 0 ———— 屏蔽位模式: 4或2个单位 的 其中一半是1/0位,另一半(每个32bit的低16bit)是规则(0验证 1不验证)

六、CAN错误状态

  • 错误主动——————出错次数较少, [0, 127]

  • 错误被动——————出错次数中等, [128, 255]

  • 离线 ——————出错次数较多, [256, ∞)

    从离线模式进入正常模式(错误主动)可以由软件或硬件控制,MCR的ABOM位可配置这个。文章来源地址https://www.toymoban.com/news/detail-837656.html

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

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

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

相关文章

  • stm32 cubemx can通讯(3)bsp_can

    stm32 cubemx can通讯(1)回环模式 stm32 cubemx can通讯(2)过滤器设置说明代码分析 根据前两篇文章已经能够实现can标准帧的收发,但是调用的函数没有标准化和可扩展性。 所以本文讲解bsp,在bsp中已经有了发送函数和接受回调函数的任务映射处理回调函数。 暂时(2023.8.10)还

    2024年02月13日
    浏览(30)
  • stm32 cubemx can通讯(1)回环模式

    介绍使用stm32cubemx来配置can,本节讲解一个简答,不需要stm32的can和外部连接,直接可以用于验证的回环模式。 所谓回环模式就是自己发给自己。 参考: 参考1 配置到合适的速率 要打开中断 在新版的cubemx中可以直接在 MX_CAN_Init(); 中加入过滤器配置,老版的不行(野火hal库视

    2024年02月13日
    浏览(25)
  • STM32 CAN使用记录:FDCAN基础通讯

    CAN是非常常用的一种数据总线,被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。 CAN的一些基础介绍与使用可以参考下面文章: 《CAN基础概念》https://blog.csdn.net/Naisu_kun/article/details/132814079 《STM32 CAN使用记录:bxCAN基础通讯》https://blog.csdn.net/Naisu_kun/arti

    2024年02月07日
    浏览(48)
  • 【通讯协议备忘录】stm32的CAN外设

    CAN的报文结构: 静默模式: 环回模式: 环回静默模式: 选好对应GPIO即可,APB1 36 Mhz, 500kbps: 不配置过滤器亦可使用 根据不同位长模式,每个过滤器组,32位模式可以配置一个屏蔽掩码或两个白名单列表,16位模式翻倍 标准帧和扩展帧的ID长度分别为11比特和29比特,通过移位

    2024年02月16日
    浏览(30)
  • stm32 CAN发送丢包

    多机组网的工况下stm32 CAN发送函数正常运行,数据更新,但是使用CAN抓包工具发现阶段性没数据,或者丢包等情况。 这种情况分两种; 发送太快,STM32集成的CAN控制器支持三个发送邮箱,但是一般的示例程序没有对邮箱的操作,默认使用邮箱0,发送太快导致邮箱占用过高导

    2024年02月07日
    浏览(67)
  • stm32 can滤波器接收指定的ID

    (slave_id=0x18010001为只接收的id号): 这一步是为了从32位的slave_id中提取出高16位作为CAN过滤器的ID高位部分。 (u32)slave_id 3:首先将slave_id强制转换为32位的无符号整数(u32),然后将其左移3位。这是为了将slave_id向左移动3位,为后续的位运算做准备。 0xFFFF0000:然后将结果与

    2024年01月22日
    浏览(33)
  • STM32--HAl库串口接收与发送

            在此之前,我们已经学习了单片机串口通信的原理(江科协),再写一遍我个人认知:世界上任何两个事物如果要进行交流的话,那必然需要两个东西进行通信的,就像两个人之间,两个国人之间用普通话就能够清楚的交流,但是让我们中国人和外国人去交流可能会

    2024年04月10日
    浏览(39)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(52)
  • STM32 —— DMA 发送与接收数据详解

    DMA(Direct Memory Access) :直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU ,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者是 FLASH DMA传

    2024年02月13日
    浏览(29)
  • STM32F407的CAN2无法进入can接收中断的解决办法

    这个问题困扰了我两天,今天偶然看到一篇文章有讲这个:STM32 CAN1 CAN2 不能同时工作,最后原因竟然是。。。。 看了之后恍然大悟。下面贴上我的初始化代码: 主函数进行中断优先级分组和CAN初始化调用及使能 初始化代码: 中断服务函数: 效果展示:  CAN逻辑分析仪数据

    2024年02月13日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包