STM32的can总线实验心得
《STM32开发指南》第三十章 CAN通信实验介绍

第三十章 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总线通信设计近年来,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总线通信设计_亢雪琳

控制器局域网(CAN—Controller Area Network)是由 BOSCH 公司率先推出的一 种多主机局域网,它成功的满足了系统对灵活性和可靠性的高要求,迅速成为公认的 最具前途的现场总线之一。起初,汽车中多个控制器和测试仪器间的数据交换越来越 复杂,引发了对一种多主机数据总线的需求,该总线要能很好的满足控制器间数据交 换的要求,让每个节点都可以作为主机通信,CAN 总线技术因此发展起来。CAN 总线 的通信介质可以是双绞线、同轴电缆或光导纤维[4]。CAN 总线技术摒弃了传统的站地 址编码,通信速率可达 1Mb/s。通过对数据块的编码使网络内节点数理论上不受限。 CAN 协议所具有的 CRC 检验功能保证了数据通信的可靠性。数据段长度最多为 8 个字 节,在保证了控制命令等长度要求又不占用过长的总线时间,系统通信的实时性能提 高。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学习记录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发送接收的简单测试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调试心得

睡眠模式(低功耗)
*软件通过对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总线接口设计与实现

图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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 的时钟。