STM32的can总线实验心得

合集下载

《STM32开发指南》第三十章 CAN通信实验介绍

《STM32开发指南》第三十章 CAN通信实验介绍
ALIENTEK 战舰STM32开发板
第三十章 CAN 通讯实验
本章我们将向大家介绍如何使用 STM32 自带的 CAN 控制器来实现两个开发板之间的 CAN 通讯,并将结果显示在 TFTLCD 模块上。本章分为如下几个部分: 30.1 CAN 简介 30.2 硬件设计 30.3 软件设计 30.4 下载验证
www.Biblioteka
343
ALIENTEK 战舰STM32开发板
图 30.1.1 ISO11898 物理层特性 从该特性可以看出,显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性 电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个 单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都 输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强) 。另外,在 CAN 总线的起止 端都有一个 120Ω的终端电阻,来做阻抗匹配,以减少回波反射。 CAN 协议是通过以下 5 种类型的帧进行的: 数据帧 要控帧 错误帧 过载帧 帧间隔 另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符 (ID) ,扩展格式有 29 个位的 ID。各种帧的用途如表 30.1.1 所示:

344
ALIENTEK 战舰STM32开发板
(6) ACK 段。表示确认正常接收的段。 (7) 帧结束。表示数据帧结束的段。 数据帧的构成如图 30.1.2 所示:

342
ALIENTEK 战舰STM32开发板
30.1 CAN 简介
CAN 是 Controller Area Network 的缩写(以下称为 CAN) ,是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种 各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求 不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量” 、 “通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面 向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧 洲已是汽车网络的标准协议。 现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设 备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的 计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有 力的技术支持。 CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平, 二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。 CAN 协议具有一下特点: 1) 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制) ,而两个以上的单元 同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是 表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始 发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级 最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 2) 系统的若软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单 元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。 3) 通信速度较快,通信距离远。最高 1Mbps(距离小于 40M) ,最远可达 10KM(速率低 于 5Kbps) 。 4) 具有错误检测、 错误通知和错误恢复功能。 所有单元都可以检测错误 (错误检测功能) , 检测出错误的单元会立即同时通知其他所有单元(错误通知功能) ,正在发送消息的单 元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新 发送此消息直到成功发送为止(错误恢复功能) 。 5) 故障封闭功能。 CAN 可以判断出错误的类型是总线上暂时的数据错误 (如外部噪声等) 还是持续的数据错误(如单元内部故障、驱动器故障、断线等) 。由此功能,当总线上 发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。 6) 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没 有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通 信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。 正是因为 CAN 协议的这些特点,使得 CAN 特别适合工业过程监控设备的互连,因此,越 来越受到工业界的重视,并已公认为最有前途的现场总线之一。 CAN 协议经过 ISO 标准化后有两个标准: ISO11898 标准和 ISO11519-2 标准。 其中 ISO11898 是针对通信速率为 125Kbps~1Mbps 的高速通信标准, 而 ISO11519-2 是针对通信速率为 125Kbps 以下的低速通信标准。 本章,我们使用的是 450Kbps 的通信速率,使用的是 ISO11898 标准,该标准的物理层特 征如图 30.1.1 所示:

基于STM32的CAN总线通信设计

基于STM32的CAN总线通信设计

基于STM32的CAN总线通信设计近年来,CAN(Controller Area Network)总线通信在汽车电子控制系统和工业领域得到了广泛应用。

作为一种高可靠性、高实时性的通信协议,CAN总线能够实现多节点之间的高效数据传输。

STM32系列微控制器作为嵌入式系统设计领域的重要成员,具备强大的处理能力和丰富的外设资源,被广泛用于CAN总线通信的设计和应用。

本文将介绍,包括硬件设计和软件编程两个方面。

首先,我们将讨论如何选择合适的STM32微控制器和CAN收发器。

其次,我们将详细描述硬件连接和接口电路设计。

最后,我们将介绍CAN总线通信软件的编程方法和实现。

在硬件设计方面,选择合适的STM32微控制器和CAN收发器是至关重要的。

STM32系列微控制器具备不同的处理能力和资源配置,应根据具体应用需求来选择。

CAN收发器是将STM32与CAN总线连接的重要部件,需要根据通信速率和总线特性选择合适的收发器。

在硬件连接和接口电路设计方面,需要参考STM32的引脚分配和电气特性,正确连接CAN收发器和其他外设。

同时,还需要考虑如何提供稳定的电源和适当的信号滤波电路,以保证CAN总线通信的可靠性和稳定性。

在软件编程方面,首先,需要在STM32的开发环境中配置CAN总线通信所需的外设和时钟。

然后,根据具体需求设置CAN总线的通信速率、帧格式和过滤器等参数。

接下来,编写CAN总线发送和接收数据的代码。

在发送数据时,需要将数据打包成CAN帧的格式,并将其发送到CAN总线;在接收数据时,需要监听CAN总线上的数据帧,并将接收到的数据解码处理。

此外,为了提高CAN总线通信的可靠性,还可以加入错误检测和纠错代码。

在实际应用中,广泛应用于汽车电子控制系统和工业自动化领域。

在汽车电子控制系统中,CAN总线通信可以实现各个控制单元之间的数据交换和协调工作,提高整车系统的性能和安全性。

例如,发动机控制单元、制动系统控制单元和防抱死系统控制单元可以通过CAN总线通信实现数据的快速传输和实时响应。

基于STM32的CAN总线通信设计_亢雪琳

基于STM32的CAN总线通信设计_亢雪琳
CAN—Controller Area Network is a multi-master network which created by BOSCH.Cause it satisfied high requirements of the system on the flexibility and reliability,it quickly becomes the most promising bus in public.First CAN was created to solve the data exchange problem between controllers and test instruments.CAN has many masters ,provides the possibility that each node communicate with others as a host .Communication medium can be twisted pair,coaxial cable and optical fiber.
控制器局域网(CAN—Controller Area Network)是由 BOSCH 公司率先推出的一 种多主机局域网,它成功的满足了系统对灵活性和可靠性的高要求,迅速成为公认的 最具前途的现场总线之一。起初,汽车中多个控制器和测试仪器间的数据交换越来越 复杂,引发了对一种多主机数据总线的需求,该总线要能很好的满足控制器间数据交 换的要求,让每个节点都可以作为主机通信,CAN 总线技术因此发展起来。CAN 总线 的通信介质可以是双绞线、同轴电缆或光导纤维[4]。CAN 总线技术摒弃了传统的站地 址编码,通信速率可达 1Mb/s。通过对数据块的编码使网络内节点数理论上不受限。 CAN 协议所具有的 CRC 检验功能保证了数据通信的可靠性。数据段长度最多为 8 个字 节,在保证了控制命令等长度要求又不占用过长的总线时间,系统通信的实时性能提 高。CAN 协议所具有的位仲裁机制可以保证实现总线分配时,避免两个站在同时发送数 据时所形成的冲突碰撞。

stm32地can现场总线实验

stm32地can现场总线实验

STM32的can现场总线实验心得最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的。

开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用来传输数据通信的,对其工作原理一窍不通,还是从基础开始看书看资料,先了解它的基本原理吧。

原来can总线有以下特点:主要特点支持CAN协议2.0A和2.0B主动模式波特率最高可达1兆位/秒支持时间触发通信功能发送3个发送邮箱发送报文的优先级特性可软件配置记录发送SOF时刻的时间戳接收3级深度的2个接收FIFO14个位宽可变的过滤器组-由整个CAN共享标识符列表FIFO溢出处理方式可配置记录接收SOF时刻的时间戳可支持时间触发通信模式禁止自动重传模式16位自由运行定时器定时器分辨率可配置可在最后2个数据字节发送时间戳管理中断可屏蔽邮箱占用单独1块地址空间,便于提高软件效率看完这些特点后,疑问一个一个地出现,1.什么是时间触发功能?2.发送邮箱是什么来的?3.报文是什么来的?4.什么叫时间戳?5.什么叫接收FIFO?6.什么叫过滤器?好了,带着疑问往下看,看完一遍后,报文:报文包含了将要发送的完整的数据信息发送邮箱:共有3个发送邮箱供软件来发送报文。

发送调度器根据优先级决定哪个邮箱的报文先被发送。

接收过滤器:共有14个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在引脚收到的报文中选择它需要的报文,而把其它报文丢弃掉。

接收FIFO共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。

它们完全由硬件来管理工作模式bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。

初始化模式*软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认*软件通过对CAN_MCR寄存器的INRQ位清0,来请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清0就确认了初始化模式的退出。

stm32F4 CAN总线学习

stm32F4 CAN总线学习

STM32F4 CAN学习记录1.C AN协议学习CAN基础1.CAN属于多主机局部网,采用多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播通信的特点,各节点之间可以实现自由通信。

2.CAN总线以报文为单位进行数据传送,报文的优先级由标识符决定,具有最低二进制数的标识符有最高的优先级。

3.CAN总线采用差分电压传输;在空闲状态下CAN_H和CAN_L均为2.5V左右,此时的状态表示为逻辑“1”,称为“隐性”电平(差值为"0v");当CAN_H比CAN_L高时表示逻辑“0”,称为“显性”电平(差值为"2v")。

显性时,通常电压值为:CAN_H=3.5V,CAN_L=1.5V。

4.CAN总线采用“载波监测,多主掌控/冲突避免”(CSMA/CA)的通信模式。

该模式工作流程大致如下:●当总线处于空闲状态时(呈隐性电平),任何节点都可以向总线发送显性电平作为帧开始。

●当网络中存在2个及以上节点同时要求发送时就会产生竞争。

CAN总线按位对标识符进行仲裁;各节点在发送电平的同时也在监听总线,如果总线电平与发送电平不同,则表明总线上存在更高优先级的节点在发送,则节点停止发送退出竞争。

其他节点继续上述过程直到剩余1个节点,则最终优先级最高节点获得总线控制权并发送数据。

●参与总线仲裁的只有仲裁段;基础ID相同的标准can报文比扩展can报文优先级更高;相同ID的数据帧与远程帧,数据帧优先级更高。

CAN报文结构CAN分为标准格式(CAN2.0A)和扩展格式(CAN2.0B);标准帧采用11位标识符ID,共可表示2047条报文;扩展帧采用29位标识符ID,共可表示5亿多条报文。

CAN总线上传输的数据帧共有4种类型:数据帧、远程帧、错误帧、过载帧。

每一帧都由多个场构成,每个场也都由多个位组成。

下面分别描述着几种帧结构。

1)数据帧:用于传输数据数据帧由7个不同的位场组成:帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾。

STM32CAN发送接收的简单测试

STM32CAN发送接收的简单测试

STM32CAN发送接收的简单测试can接⼝相对是⼀种常⽤的串⾏接⼝,但是不像spi、i2c、uart等接⼝都有主从的关系,can可以任何⼀个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。

can和rs485⼜有些类似,都是把ttl信号转换成了差分信号。

所以在stm32 使⽤can的时候会有⼀个can收发器。

STM32 CAN 发送的简单测试从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。

所以假如我们要测试can的发送,是不是只接can tx脚就可以了?我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样⾏不通的。

因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对⽐,是不是⼀致就知道总线有没有冲突。

所以在正常情况(这⾥意味着⾮正常情况下也可以)下can rx不接就到这发送出去的数据⽆法收到从⽽硬件⾃动判断为发送失败。

所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。

硬件上就这些主要注意点,接下来就主要是软件的配置了。

⼀般stm32 配置can有以下⼏⼤步骤:can的初始化(cubemx直接可以⽣成代码)can的启动can滤波器的设置(⽤来接收的,发送的时候可以不⽤配置它)can执⾏发送数据请求我们只测试can的发送,所以就只⽤关系1、2、4步骤就可以了。

第⼀步,配置stm32cubemxSTM32 CAN 发送的简单测试如上图所⽰,最关键主要配置如下三个参数,分频数我这⾥配置48,下⾯的time Quantum值就会⾃动计算出来。

因为can时钟是48mhz经过48分频后,⼀个单位时间就是1us=1000ns。

因为我想要100k波特率,然后填写下⾯的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。

那么具体波特率该怎么计算还是要看看官⽅⼿册的描述:STM32 CAN 发送的简单测试根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。

STM32_CAN_Bus调试心得

STM32_CAN_Bus调试心得

睡眠模式(低功耗)
*软件通过对CAN_MCR 寄存器的SLEEP位置 1,来请求进入这一模式。在该 模式下,bxCAN 的时钟停止了,但软件仍然可以访问邮箱寄存器。 *当bxCAN 处于睡眠模式,软件想通过对CAN_MCR 寄存器的INRQ位置 1, 来进入初始化式, 那么软件必须同时对SLEEP位清 0才行 *有2种方式可以唤醒(退出睡眠模式)bxCAN :通过软件对SLEEP位清0,
第 4 页 共 11 页
GZHU
Electronic Association
或硬件检测 CAN 总线的活动。 工作流程 那么究竟can是怎样发送报文的呢? 发送报文的流程为: 应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据; 然后对CAN_TIxR 寄存器的 TXRQ位置 1,来请求发送。TXRQ位置 1后,邮箱 就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权 限。 TXRQ位置 1后, 邮箱马上进入挂号状态, 并等待成为最高优先级的邮箱, 参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送 状态。 一旦 CAN总线进入空闲状态, 预定发送邮箱中的报文就马上被发送 (进 入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件 相应地对CAN_TSR 寄存器的RQCP和 TXOK位置1,来表明一次成功发送。 如果发送失败,由于仲裁引起的就对CAN_TSR 寄存器的ALST位置1,由于 发送错误引起的 就对 TERR位置 1。 原来发送的优先级可以由标识符和发送请求次序决定: 由标识符决定 当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根 据CAN 协议,标 识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号 小的报文先被发 送。 由发送请求次序决定 通过对CAN_MCR 寄存器的TXFP位置 1,可以把发送邮箱配置为发送 FIFO 。 在该模式下,发送的优先级由发送请求次序决定。 该模式对分段发送很有用。 时间触发通信模式 在该模式下,CAN 硬件的内部定时器被激活,并且被用于产生时间戳,分别 存储在 CAN_RDTxR/CAN_TDTxR 寄存器中。内部定时器在接收和发送的帧起始位 的采样点位置被采样,并生成时间戳(标有时间的数据)。 接着又是怎样接收报文的呢? 接收管理 接收到的报文,被存储在 3级邮箱深度的FIFO 中。 FIFO 完全由硬件来管理, 从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取 FIFO 输出邮箱,来读取 FIFO中最先收到的报文。 有效报文 根据 CAN协议,当报文被正确接收(直到 EOF域的最后 1位都没有错误), 且通过了标识符 过滤,那么该报文被认为是有效报文。

基于STM32的CAN总线接口设计与实现

基于STM32的CAN总线接口设计与实现

图1 系统总体框图是一款带隔离的高速CAN收发器芯片,该芯片内部集成了所有必需的CAN隔离及CAN收发器件。

芯片的主要功能是将CAN控制器的逻辑电平转换为CAN总线的差分电平,并且具有DC 2500V的隔离功能及ESD保护作用,其是CAN收发器的理想选择[2]。

2 CAN总线收发模块的硬件设计CAN总线收发模块的硬件结构如图2所示。

CAN总线(1978-),男,江西宜春人,研究生,工程师。

研究方向:汽车电子项目管理。

公飞(1989-),男,山东临沂人,本科,助理工程师。

研究方向:汽车电子硬件设计。

收发模块的主要功能是控制开关和与RS232进行数据通信,开关可以用来控制现场设备的运行,后者可以方便与外界进行通信,提供通讯接口。

其硬件结构节点可以划分为最小系统模块、功能模块。

电源STM32的工作电压(VDD)为2.0~3.6V[3]。

通过内置的电压调节器提供所需的1.8V电源。

当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。

VBAT脚也图3 设置时钟流程图2.2 开关和RS232功能模块该节点具有两个功能,控制开关状态和与RS232通讯,开关选用八个TX2-5V继电器,两片MC1413作为驱动芯片,MC1413可以实现单片机端口电压到12V电平的转换。

与RS232通讯部分选用MAX232做为电平转换芯片。

2.3 CAN收发模块CAN收发模块主要是CAN收发器,CAN收发器的常用型号有CTM1050,CTM1050是一款带隔离的高速CAN收发器芯片,该芯片内部集成了所有必需的CAN隔离及CAN发器件。

芯片的主要功能是将CAN控制器的逻辑电平转换为CAN总线的差分电平,并且具有DC 2500V的隔离功能及ESD保护作用。

该芯片符合ISO 11898标准,因此,它可以和图2 节点硬件结构图图4 CAN初始化流程图选用的测试模式是环回模式,该模式下数据是自发自收的,即在发送成功的同时就接收到数据了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32的can总线实验心得(一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介首先通读手册中关于CAN的文档,必须精读。

STM32F10xxx 参考手册Rev7V3.pdf/bbs/redirect.php?tid=255&goto=lastpost#lastpos t需要精读的部分为 RCC 和 CAN 两个章节。

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

关于 STM32 的 can 总线简单介绍bxCAN 是基本扩展 CAN (Basic Extended CAN) 的缩写,它支持 CAN 协议 2.0A 和 2.0B 。

它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。

它也支持报文发送的优先级要求(优先级特性可软件配置)。

对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。

主要特点· 支持 CAN 协议 2.0A 和 2.0B 主动模式· 波特率最高可达 1 兆位 / 秒· 支持时间触发通信功能发送· 3 个发送邮箱· 发送报文的优先级特性可软件配置· 记录发送 SOF 时刻的时间戳接收· 3 级深度的2个接收 FIFO· 14 个位宽可变的过滤器组-由整个 CAN 共享· 标识符列表· FIFO 溢出处理方式可配置· 记录接收 SOF 时刻的时间戳可支持时间触发通信模式· 禁止自动重传模式· 16 位自由运行定时器· 定时器分辨率可配置· 可在最后 2 个数据字节发送时间戳管理· 中断可屏蔽· 邮箱占用单独 1 块地址空间,便于提高软件效率(二) 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 */在此章我们的 Mini-STM32 教程中我们将使用到CAN_Mode_LoopBack和CAN_Mode_Normal两种模式。

我们第一步做的就是使用运行在 CAN_Mode_LoopBack 下进行自测试。

在参考手册中 CAN_Mode_LoopBack (环回模式) 的定义如下:环回模式可用于自测试。

为了避免外部的影响,在环回模式下 CAN 内核忽略确认错误 (在数据 / 远程帧的确认位时刻,不检测是否有显性位) 。

在环回模式下,bxCAN 在内部把 Tx 输出回馈到 Rx 输入上,而完全忽略 CANRX 引脚的实际状态。

发送的报文可以在 CANTX 引脚上检测到。

因此这种模式也特别适合大家做好硬件后自测程序。

下载(37.38 KB)2009-8-16 11:46(三) CAN 接口端口映射STM32 中的 CAN 物理引脚脚位可以设置成三种:默认模式,重定义地址1模式,重定义地址2模式。

下载(28.94 KB)2009-8-16 11:51在我们的 Mini-STM32 上面没有接出 CAN 的接口芯片, 所以我们可以利用RealView MDK的 CAN 软件模拟模块来做实验.-------------------------------------------------------------------------默认模式/* 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);------------------------------------------------------------------------重定义地址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);-------------------------------------------------------------------------重定义地址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);-------------------------------------------------------------------------设置完 CAN 的引脚之后还需要打开 CAN 的时钟:/* CAN Periph clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);(四) CAN 波特率设置4、我们需要搞明白CAN波特率的设置,这个章节也是使用CAN的最重要的部分之一,因为这实际应用中我们需要根据我们实际的场合来选择 CAN 的波特率。

一般情况下面1M bps 的速率下可以最高可靠传输 40 米以内的距离。

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

对于波特率的设置需要详细学习参考手册对应部分的解释。

我们在调试软件的时候可以使用示波器来测试 CANTX 引脚上的波形的波特率,这样可以得到事半功倍的效果,大大的缩短调试学习的时间。

// ***************************************************************// BaudRate = 1 / NominalBitTime// NominalBitTime = 1tq + tBS1 + tBS2// tq = (BRP[9:0] + 1) x tPCLK// tPCLK = CAN's clock = APB1's clock// ****************************************************************也就是BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)这里注意的是采用点的位置,也就时BS1,BS2的设置问题,这里我也找了一些资料,抄录下来给大家,是 CANopen 协议中推荐的设置。

1Mbps 速率下,采用点的位置在6tq位置处,BS1=5, BS2=2500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同。

因此我们需要重视的有软件中的这么几个部分:// 设置 AHB 时钟(HCLK)// RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟RCC_HCLKConfig(RCC_SYSCLK_Div8);// 设置低速 AHB 时钟(PCLK1)// RCC_HCLK_Div2 APB1 时钟 = HCLK / 2RCC_PCLK1Config(RCC_HCLK_Div2);// PLLCLK = 8MHz * 8 = 64 MHz// 设置 PLL 时钟源及倍频系数RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8);CAN 波特率设置中需要的就是PCLK1 的时钟。

相关文档
最新文档