打印
[应用相关]

STM32的can总线实验心得

[复制链接]
4154|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先通读手册中关于CAN的文档,必须精读。
STM32F10xxx 参考手册Rev7V3.pdf
http://www.mystm32.com/bbs/redirect.php?tid=255&goto=lastpost#lastpost

需要精读的部分为 RCC 和 CAN 两个章节。
为什么需要精读 RCC 呢?因为我们将学习 CAN 的波特率的设置,将要使用到 RCC 部分的设置,因此推荐大家先复习下这部分中的几个时钟

使用特权

评论回复
沙发
hehhehee|  楼主 | 2021-7-23 22:53 | 只看该作者
关于 STM32 的 can 总线简单介绍
bxCAN 是基本扩展 CAN (Basic Extended CAN) 的缩写,它支持 CAN 协议 2.0A 和 2.0B 。它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。
对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。

使用特权

评论回复
板凳
hehhehee|  楼主 | 2021-7-23 22:54 | 只看该作者
主要特点
· 支持 CAN 协议 2.0A 和 2.0B 主动模式
· 波特率最高可达 1 兆位 / 秒
· 支持时间触发通信功能

使用特权

评论回复
地板
hehhehee|  楼主 | 2021-7-23 22:56 | 只看该作者
发送
· 3 个发送邮箱
· 发送报文的优先级特性可软件配置
· 记录发送 SOF 时刻的时间戳

使用特权

评论回复
5
hehhehee|  楼主 | 2021-7-23 22:59 | 只看该作者
接收
· 3 级深度的2个接收 FIFO
· 14 个位宽可变的过滤器组 - 由整个 CAN 共享
· 标识符列表
· FIFO 溢出处理方式可配置
· 记录接收 SOF 时刻的时间戳

使用特权

评论回复
6
hehhehee|  楼主 | 2021-7-23 23:00 | 只看该作者
可支持时间触发通信模式
· 禁止自动重传模式
· 16 位自由运行定时器
· 定时器分辨率可配置
· 可在最后 2 个数据字节发送时间戳

使用特权

评论回复
7
hehhehee|  楼主 | 2021-7-23 23:02 | 只看该作者
管理
· 中断可屏蔽
· 邮箱占用单独 1 块地址空间,便于提高软件效率

使用特权

评论回复
8
hehhehee|  楼主 | 2021-7-24 21:59 | 只看该作者
(二) STM32 CAN 模块工作模式

STM32 的 can 的工作模式分为:
/* CAN operating mode */
#define CAN_Mode_Normal                ((u8)0x00)   /* normal mode */
#define CAN_Mode_LoopBack             ((u8)0x01)   /* loopback mode */
#define CAN_Mode_Silent                   ((u8)0x02)   /* silent mode */
#define CAN_Mode_Silent_LoopBack     ((u8)0x03)   /* loopback combined with silent mode */

使用特权

评论回复
9
hehhehee|  楼主 | 2021-7-24 22:08 | 只看该作者
在此章我们的 Mini-STM32 教程中我们将使用到 CAN_Mode_LoopBack 和 CAN_Mode_Normal 两种模式。

使用特权

评论回复
10
hehhehee|  楼主 | 2021-7-24 22:09 | 只看该作者
我们第一步做的就是使用运行在 CAN_Mode_LoopBack 下进行自测试。

在参考手册中 CAN_Mode_LoopBack (环回模式) 的定义如下:
环回模式可用于自测试。为了避免外部的影响,在环回模式下 CAN 内核忽略确认错误 (在数据 / 远程帧的确认位时刻,不检测是否有显性位) 。在环回模式下,bxCAN 在内部把 Tx 输出回馈到 Rx 输入上,而完全忽略 CANRX 引脚的实际状态。发送的报文可以在 CANTX 引脚上检测到。
因此这种模式也特别适合大家做好硬件后自测程序。

使用特权

评论回复
11
hehhehee|  楼主 | 2021-7-24 22:10 | 只看该作者

使用特权

评论回复
12
hehhehee|  楼主 | 2021-7-24 22:11 | 只看该作者
(三) CAN 接口端口映射

STM32 中的 CAN 物理引脚脚位可以设置成三种:

默认模式,重定义地址1模式,重定义地址2模式

使用特权

评论回复
13
hehhehee|  楼主 | 2021-7-24 22:13 | 只看该作者

使用特权

评论回复
14
hehhehee|  楼主 | 2021-7-24 22:16 | 只看该作者
在我们的 Mini-STM32 上面没有接出 CAN 的接口芯片, 所以我们可以利用

RealView MDK

的 CAN 软件

模拟

模块来做实验.

使用特权

评论回复
15
hehhehee|  楼主 | 2021-7-24 22:17 | 只看该作者
默认模式

   /* Configure CAN pin: RX */



  

GPIO

_InitStructure.GPIO_Pin = GPIO_Pin_11;



   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;



   GPIO_Init(GPIOA, &GPIO_InitStructure);



  



   /* Configure CAN pin: TX */



   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;



   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;



   GPIO_Init(GPIOA, &GPIO_InitStructure);

使用特权

评论回复
16
hehhehee|  楼主 | 2021-7-24 22:18 | 只看该作者
重定义地址1模式

/* Configure CAN pin: RX */



   //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;



   //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;



   //GPIO_Init(GPIOB, &GPIO_InitStructure);



   /* Configure CAN pin: TX */  



   //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;



   //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;



   //GPIO_Init(GPIOB, &GPIO_InitStructure);



   /* Configure CAN Remap   重影射 */



   //GPIO_PinRemapConfig(GPIO_Remap1_CAN, ENABLE);

使用特权

评论回复
17
hehhehee|  楼主 | 2021-7-24 22:19 | 只看该作者
重定义地址2模式

   /* Configure CAN pin: RX */



   //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;



   //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;



   //GPIO_Init(GPIOD, &GPIO_InitStructure);



  



   /* Configure CAN pin: TX */



   //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;



   //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;



   //GPIO_Init(GPIOD, &GPIO_InitStructure);



  



   /* Configure CAN Remap   重影射 */



   //GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);

使用特权

评论回复
18
hehhehee|  楼主 | 2021-7-24 22:19 | 只看该作者
设置完 CAN 的引脚之后还需要打开 CAN 的时钟:

/* CAN Periph clock enable */



   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

使用特权

评论回复
19
hehhehee|  楼主 | 2021-7-24 22:20 | 只看该作者
(四) CAN 波特率设置

4、我们需要搞明白CAN波特率的设置,这个章节也是使用CAN的最重要的部分之一,因为这实际应用中我们需要根据我们实际的场合来选择 CAN 的波特率。

使用特权

评论回复
20
hehhehee|  楼主 | 2021-7-24 22:22 | 只看该作者
一般情况下面1M bps 的速率下可以最高可靠传输 40 米以内的距离。



在 50K 以下的波特率中一般可以可靠传输数公里远。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

934

帖子

0

粉丝