0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

结合STM32F4关于CAN基本的信息描述

strongerHuang 来源:STM32 作者:STM32 2021-04-02 11:12 次阅读

CAN,Controller Area Network(控制器局域网络),在汽车电子工业控制领域的应用比较多,通常用于局域组网。

CAN总线和UARTI2C、SPI总线最大的区别主要在于取消了传统的地址编码方式,理论上讲总线上的互联节点数不受限制,拥有强大的握手与出错管理及重发机制,具有很强的抗干扰能力。

1

STM32 CAN 基础内容CAN网络中主要由CAN控制器和CAN收发器组成,大部分STM32内部都集成了CAN控制器,如果需要使用CAN功能,还需要在外部连接一个CAN收发器才能使用。

6be1ba8a-92ed-11eb-8b86-12bb97331649.png

▲ CAN 网络拓扑结构图

STM32内部集成的CAN控制器,支持 2.0A 和 B 版本的 CAN 协议。还有通信速度更快的CAN FD、 CAN XL,目前一部分STM32支持CAN FD(比如STM32H7)。

下面结合STM32F4描述一下关于CAN基本的信息

1. CAN总线

CAN总线上的数据是基于差分信号,通常只有两根线:CAN_L和CAN_H。从STM32芯片引出来的两个信号脚CAN发送和CAN接收,有点类似UART的收发引脚,但内部控制逻辑完全不一样。经过CAN收发器后形成两根信号线CAN_L和CAN_H挂到CAN总线上。

2. CAN波特率

CAN 总线属于异步通信,和UART类似,因此具有通信的波特率,标准 CAN 波特率通常支持高达 1 Mb/s。当然,也可以配置成500Kb/s、 250Kb/s等。

CAN 波特率由多个参数决定,下面章节会讲述波特率配置。

3. CAN发送

STM32集成的CAN控制器支持三个发送邮箱,也就是说可以支持队列发送消息(数据),如果同一时间发送数据比较多,使用邮箱就比较高效,不用消耗CPU资源,CAN控制器自动发送,直到完成。

4. CAN接收

和发送类似,CAN接收支持接收FIFO,可以连续接收多个消息(数据),CPU空闲了再去处理接收到的数据。

同时,CAN控制器还支持接收过滤配置,也就是说,有些数据我不需要,CAN控制器可以自动过滤掉。

通过一张CAN框图来认识CAN控制器:

6c0cc37e-92ed-11eb-8b86-12bb97331649.png

关于CAN的更多信息,可以参看芯片对应的手册和CAN相关协议资料

2

STM32 CAN 常规配置STM32 CAN控制器需要配置的参数比较多,对于初学者而言,重点就是波特率。如果你只使用一些基本的功能,不使用的功能建议参考官方代码默认配置即可。

1. CAN引脚时钟配置

引脚和时钟是使用外设基本的配置,比如F4例程:

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

2. CAN常规配置

这些基本参数,需要进一步功能的作用,默认DISABLE。

CAN_InitTypeDef CAN_InitStructure;

CAN_InitStructure.CAN_TTCM = DISABLE;CAN_InitStructure.CAN_ABOM = DISABLE;CAN_InitStructure.CAN_AWUM = DISABLE;CAN_InitStructure.CAN_NART = DISABLE;CAN_InitStructure.CAN_RFLM = DISABLE;CAN_InitStructure.CAN_TXFP = DISABLE;CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

3. CAN波特率配置

波特率是第一步需要掌握的,波特率不对,就不能正常通信。波特率 = 时钟 ÷ Prescaler ÷ (SJW + BS1 + BS2);

比如:42M / 2 / (1 + 12 +8) = 1M

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler = 2;

4. CAN过滤配置CAN过滤是相对更高级的功能,建议深入了解,否则建议默认配置即可。

CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber = 0;CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);

以上是通过标准外设库配置的参数,使用STM32CubeMX就可以很轻松的一键配置了。

6c25ad58-92ed-11eb-8b86-12bb97331649.png

对CAN有一定基础了解,同时掌握HAL库使用方法的人,建议直接使用STM32CubemMX 配置并生成初始化代码。

3

STM32 CAN 常见问题STM32的CAN控制器功能相对比较强大,实际开发过程中容易遇到问题,软件硬件都有可能导致通信异常,下面整理几点常见问题。

问题一:CAN总线接线问题

CAN控制器出来的信号为CAN_TX和CAN_RX,有点类似UART,但它和外面的收发器接法是TX对应TX,不是UART交叉连接。

同时,CAN总线和485类似是差分信号,具有极性。通常CAN总线只有两根线CAN_L和CAN_H。

上面指出来的两点,任意一处接线错误都会导致通信失败。所以,建议参考官方给出的电路原理图。

问题二:通信波特率配置问题

CAN属于异步通信,如果波特率不对,就会通信失败,或者接收到乱码。影响波特率的因素有很多:CAN时钟、分频值、位时序。

CAN时钟也就是RCC出来进入CAN控制器的APB时钟,比如上面代码中配置的是APB1,42M时钟。(一定要分清,不能认为是84M)。

6c4437dc-92ed-11eb-8b86-12bb97331649.png

位时序也是比较重要的一个配置,包含同步段、位段等,需要根据实际情况调整对应的值。

6c61bca8-92ed-11eb-8b86-12bb97331649.png

问题三:CAN接收数据丢包问题

通常来说,CAN组网之后,总线上的数据量比较大,如果你配置或者处理不正确,就会导致丢失数据的情况。

1. CAN接收数据,通常使用中断

CAN中断入口和CAN中断函数处理比较容易引起数据丢失的问题。

有些CAN中断入口和其它外设的共用,比如STM32F103的CAN和USB共用一个中断入口。

通信时,由于CAN中断频率较高,中断函数不能占用太多时间,通常来说,只对接收到的数据进行一些简单搬运处理,不建议在中断程序里处理较为复杂的逻辑或算法运算。

2. 双CAN过滤器管理问题

部分STM32芯片具有双CAN模块,从整体功能上讲,两个CAN是独立的。但是,两个CAN共用过滤器管理模块,对于STM32芯片来讲,该过滤器控制模块由CAN1统一管理,所以即使只是单独使用CAN2进行收发,也须开启CAN1,否则会因为过滤器未能开启,导致单独使用CAN2时无法收发的情形。

3.CAN接收过滤

CAN总线接收可以通过配置,对一些“无用”或不需要的信息进行过滤,换言之即对总线上的信息选择性地进行接收。这个功能也算是CAN总线的高级功能,只有深入理解该功能之后方能灵活使用之。否则会因为过滤配置不当导致收发异常。

复盘一下▼CAN 基础内容:CAN总线、波特率、发送和接收;▼CAN 常规配置:引脚时钟、常规配置、波特率配置、过滤配置;▼CAN 常见问题:接线问题、波特率配置问题、接收数据丢包问题;

原文标题:STM32学习笔记 | CAN总线收发数据常见问题分析

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN
    CAN
    +关注

    关注

    57

    文章

    2711

    浏览量

    463303
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354646

原文标题:STM32学习笔记 | CAN总线收发数据常见问题分析

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码

    《智能灯光控制系统_STM32F4》项目完整文档、项目源码,私信小雯老师免费领取。STM32项目实战之“智能灯光控制系统”(基于STM32F4)今天小编来分享一个《智能灯光控制系统》的项目案例,硬件
    的头像 发表于 10-17 16:16 577次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32F4</b>的智能灯光控制系统(LVGL),附项目教程/源码

    STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx中文手册

    STM32F4系列单片机中文手册
    发表于 08-08 14:32 2次下载

    请问STM32F4系列有对PI/SI仿真要求的文件吗?

    STM32F4系列有对PI/SI仿真要求的文件吗?
    发表于 06-03 06:25

    请问stm32f4的dsp库里面fir函数如何使用?

    请问在stm32f4 的dsp库里面有好几个关于fir的函数,因为没有源码,我也没有什么关于这个dsp函数的介绍,所以看不懂这些函数怎么用呢。比如说void arm_fir_init_q31
    发表于 05-17 08:07

    STM32F4用来作为计算单元的时候,如何评估算法或应用的时间性能?

    STM32F4用来作为计算单元的时候,如何评估算法或应用的时间性能?能不能通过配置使之具备计时功能?精度达到us级别就足够了。 关于计时,在debug状态下,通过states的计数值可以计算时间性能,但必须是debug设置断点,如果是系统实时应用,有没有别的办法?
    发表于 05-16 06:37

    STM32f4采集的视频怎么在电脑显示?

    我用stm32f4采集到的视频想通过网线传输到电脑,在电脑上显示采集到的视频,有没有大神做个过视频传输啊,我该怎么弄啊???
    发表于 05-14 08:25

    stm32f4批量烧录,用什么软件?

    请问,stm32f4批量烧录,用什么软件
    发表于 05-09 06:02

    STM32F4驱动MMC,返回的CID和CSD数据都为0是怎么回事?

    STM32F4驱动MMC,返回的CID和CSD数据都为0
    发表于 04-19 08:07

    stm32f4 FLASH_ProgramDoubleWord函数数据不能写入flash的原因?

    STM32F401芯片,调用flash写函数时,如果写一个字,也就是调用stm32f4 FLASH_ProgramWord函数,能正确写入;如果换成stm32f4 FLASH_ProgramDoubleWord函数,数据不能写
    发表于 04-12 06:50

    STM32F4和一个烟雾传感器(MQ-2)模块相连,STM32F4板子的电压不能超过3.3V如何解决?

    问题: 想用STM32F4和一个烟雾传感器(MQ-2)模块相连,但MQ-2模块的输出电压范围是0——5V,STM32F4板子的电压不能超过3.3V,请问该如何解决?
    发表于 04-11 06:33

    stm32F4 64位变量操作异常怎么解决?

    stm32F4 64位变量使用报错解决
    发表于 04-02 07:16

    STM32F4内部的DAC可以分时复用吗?

    请问,STM32F4内部的DAC可以分时复用吗?
    发表于 03-28 08:38

    如何让stm32f4发出错误帧呢?

    文档里面说can外设支持CAN协议。在can协议里面,有错误帧的概念。 当发现 Bit Check Error的时候,如何让stm32f4发出错误帧呢?请高手解答一下
    发表于 03-28 06:15

    请问引脚数相同的STM32F2的程序可以直接运行在STM32F4的上吗?

    引脚数相同的STM32F2的程序可以直接运行在STM32F4的芯片上吗?手册上说F4全兼容F2的软件
    发表于 03-27 07:43

    使用STM32F4芯片验证SPI功能的问题分析

    有人使用STM32F4芯片验证SPI功能。当使用片内两个SPI模块基于中断方式进行收发时,发现总是出现接收数据丢失的情况,貌似总丢失末尾2个数据。代码使用HAL库提供的API函数。这是怎么回事呢?
    的头像 发表于 12-11 09:20 2151次阅读
    使用<b class='flag-5'>STM32F4</b>芯片验证SPI功能的问题分析