这个怎么安装??在线等,挺急

第1页/共14页
STM32的can总线实验心得
(一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介
首先通读手册中关于CAN的文档,必须精读。
STM32F10xxx 参考手册Rev7V3.pdf
/bbs/redirect.php?tid=255&goto=lastpost#lastpost
需要精读的部分为 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页/共14页
寻找更多 ""博客访问: 243353
博文数量: 57
博客积分: 167
博客等级: 入伍新兵
技术积分: 1157
注册时间:
一个算是正常的中国码农!
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
今天花了一天的时间学习了stm32f4的can模块的相关知识,首先我学的时候显示从can协议这块入手,而后进入stm32的配置和使用上,期间子啊百度上找了好多资料这里吧我的理解跟大家分享一下,希望我理解不足和错误的地方大家给指出来。
对于stm32的使用就是三个步骤
1:学习怎么配置相应的寄存器
2:学习怎样发送数据
3:学习怎样接收数据;但是在这个之前的学会对can总线协议的一些了解;
这里我拿我学习的时候看的一篇百度文章来说明吧:
当CAN总线上的一个节点(站)发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。每组报文开头的11位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文,当几个站同时竞争总线读取时,这种配置十分重要。&
大体的工作原理我们搞清了,但是根本的协议我们还要花一番功夫。下面介绍一个重要的名词,“显性“和”隐性“&
& &在我看到的很多文章里,有很多显性和隐性的地方,为此我头痛不已,最终我把它们彻底弄明白了。&
& 首先CAN数据总线有两条导线,一条是黄色的,一条是绿色的。分别是CAN_High线和CAN_Low线 当静止状态时,这两条导线上的电平一样。这个电平称为静电平。大约为2.5伏。 这个静电平状态就是隐形状态,也称隐性电平。也就是没有任何干扰的时候的状态称为隐性状态.当有信号修改时,CAN_High线上的电压值变高了,一般来说会升高至少1V,而CAN_Low线上的电压值会降低一个同样值,也是1v,那么这时候。CAN_High就 是2.5v+1v=3.5v,它就处于激活状态了。而CAN_Low降为2.5v-1v=1.5v。 可以看看这个图&
由此我们得到&
在隐性状态下,CAN_High线与CAN_Low没有电压差,这样我们看到没有任何变化也就检测不到信号。但是在显性状态时,改值最低为2V,我们就可以利用这种变化才传输数据了。所以出现了那些帧,那些帧中的场,那些场中的位,云云~~~~~~~~~~~&
在总线上通常逻辑1表示隐性。而0表示显性。这些1啊,0啊,就可以利用起来为我们传数据了。&
利用这种电压差,我们可以接收信号;
以上是对显隐电平的理解
CAN的报文格式有两种,不同之处其实就是识别符长度不同,具有11位识别符的帧称为标准帧,而还有29位识别符的帧为扩展帧,CAN报文有以下4个不同的帧类型。分别是 (1) 数据帧:数据帧将数据从发送器传输到接收器。 (2) 远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧 (3) 错误帧:任何节点检测到总线错误就发出错误帧 (4) 过载帧:过载帧用已在先行的后续的数据帧(或远程帧)之间提供一
这一上是对协议电平的理解;一下就是stm32 f4的相关配置
static void CAN2_Config(void)
& //CanTxMsg TxM
CAN_InitTypeDef & & & &CAN_InitS
& CAN_FilterInitTypeDef &CAN_FilterInitS
& RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
//????CAN2???±??
& CAN_DeInit(CAN2);
//??CAN2?????÷?????è???±????
& CAN_StructInit(&CAN_InitStructure);
//??CAN_InitStructure??????????????°??±????????
& /* CAN cell init */
& 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;
//锁定fifo模式
& CAN_InitStructure.CAN_TXFP = DISABLE;
//失能fifo优先级
& CAN_InitStructure.CAN_Mode = CAN_Mode_N &//?????¤×÷????
& CAN_InitStructure.CAN_SJW = CAN_SJW_1
//设定同步时间段
& /* CAN Baudrate = 1MBps (CAN clocked at 30 MHz) */
& CAN_InitStructure.CAN_BS1 = CAN_BS1_6
//?è?¨?±????1??6???±??????????
& CAN_InitStructure.CAN_BS2 = CAN_BS2_8
//?è?¨?±????2??8???±??????????
& CAN_InitStructure.CAN_Prescaler = 2;
//?è?¨???±?????????¤????2
& CAN_Init(CAN2, &CAN_InitStructure);
& CAN_FilterInitStructure.CAN_FilterNumber = 14;
//???¨?????÷14 &?¨????????????±?????stm32????14???????¨????
& CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdM
//?????÷???????? ±ê??·???±???????
& CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32 //1??32???????÷
& CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
//?è?¨?????÷±ê??·? &???ù?è???????÷???°????×?????????????????????
//???????è?????¨????±ê×???
& //CAN_FilterInitStructure.CAN_FilterIdHigh = x06DB<<5;//?ò??????×???11????±ê×???11????
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
//?è?¨?????÷±ê??·?
& CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
//?è?¨?????÷??±?±ê??·?
& CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
&//?è?¨?????÷??±?±ê??·?
//?????è??????±???????????high??low???è????0xffff???°?????????????????¨?????·;
//CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0
//?è?¨?????÷??±?±ê??·?
& //CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0
&//?è?¨?????÷??±?±ê??·?
& CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
//CAN_FilterFIFO0???ò?????÷14
& CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
//?????????÷
& CAN_FilterInit(&CAN_FilterInitStructure);
& /* Transmit Structure preparation */
& TxMessage.StdId = 0x321;
//?è?¨±ê??·?0x321//???????????á?&?????? &±¨??±ê?????????????à??????????????
& TxMessage.ExtId = 0x01;
//?è?¨?&??±ê??·?0x01
& TxMessage.RTR = CAN_RTR_DATA;
& TxMessage.IDE = CAN_ID_STD;
//????±ê×?±ê??·?
& TxMessage.DLC = 1;
//???????????¤????1
&// CAN_Transmit(&TxMessage); &//yj?í??
& /* Enable FIFO 0 message pending Interrupt */
& CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
这里黄色部分是对发送的地方的标准进行配置,发送采用标准帧模式,标志符那个需要0x321的,这里的扩展符可有可无;因为后面有一个模式选择;
红色部分是对接收进行配置这里主要是对过滤器和过滤器屏蔽标志进行配置,他们两个是配合使用的
附加的延时&
我们先研究数据帧吧。&
一,数据帧由7个不同位场组成。&
这里的位场,就是不同位的组合,这名字起的很烂,让人看了感觉很抽象。我们来看看这些个不同的位场吧。&
一开始是一位帧起始,也叫SOF。它用显性位表示,也就是0.它告诉我们,两个线上有电压差了,也就是有数据了。这个帧起始看起来只有一位,起始不简单了。
为了让所有的分站都同步于发送报文的发送站,好接收数据,有很多要考虑的地方。&
然后下一个场是仲裁场。这个仲裁场是个难点。但是不要怕,有我在,你会很明白地搞定的。 这个仲裁很抽象,其实在这里就是为了解决一个问题。如果2个或2个以上的单元同时开始传送报文,那么就会有总线访问冲突。那么仲裁机制就是用来根据标识符优先级来一个一个的去掉低级别的数据。我们可以详细的描述这场生动的争抢总线的战斗。&
当总线处于空闲状态时呈隐性电平,此时任何节点都可以向总线发送显性电平作为帧的开始。2个或2个以上的节点同时发送开始争抢总线,但是总线只能被一个人抢走。
总线只属于一个他。这时候到底怎么决定谁留下,谁滚蛋呢。我们开始考虑,思索,我们以前定义了标识符,标识符有优先级,它越小,它优先级越高。那么怎么实现的呢。看下面把 首先搞明白两点,一 下面的图 低波形代表0,高波形代表1 二 当隐性碰到显性,就变为显性。
阅读(11256) | 评论(0) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。查看: 6497|回复: 4
STM32 CAN总线的一些心得
主题帖子精华
中级会员, 积分 207, 距离下一级还需 293 积分
在线时间2 小时
好吧,首先我不得不承认这是一篇有关失败实验经历的帖子,但我还是想写出来,因为在此期间还是有一些收获的。先来说说关于CAN总线的实验想法:学习了STM32 的can总线模块后,总想着实现多机通讯,实验室有人用c芯片搭了一个can总线的双机通讯电路,所以想将STM32的板子加进去,实现三机通讯。有了这个想法后着手去做了,但没有实现。
先来说说我在学习STM32 can总线模块时的一些心得吧:
这部分主要是位时序和过滤器的理解心得:
位时序,就是发送一位所用的时间,在这样一段短暂时间里,又分了四段:同步段、传播段、相位缓冲段1、相位缓冲段2.这些都是在其他总线通信中不曾遇到的,有些初学者看到手册上后面的介绍基本就晕菜了,很难接受和理解,不知道为什么要这么做,其实把这样一小段时间又分成4段就是为了进行同步。
CAN总线的通讯时采用NRZ(Non-Return to
Zero,非归零)码,数据本身并不携带时钟信息,也就是说在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收。可以这样理解,总线上的发送端和接收端以相同的频率振荡,这个振荡就是时钟信息,很同步,很和谐,这样发送端发个数据,它就这样以同样的频率振啊振的振到接收端,接收端察觉并接收,很完美哈?可这只是理想情况,在实际情况中,发送端和接收端会存在时间误差,传输路径也会有相位误差,这些都可能使二者在收发操作中失去同步关系,这个时候要想再实现通讯,接收端就必须调用同步机制,调整它的操作时序。
CAN bus 有两个同步机制:硬同步和重同步
硬同步:在总线空闲状态时,接收单元检测到SOF就会执行这个同步调整过程,“隐式”电平跳变到“显式”电平的边缘的时间点被认为是接收端位时序的同步段,不用管SJW的值。这种同步在一个帧中只出现一次,就是在开头。
重同步:接收节点在一帧中间如果检测到信号从1到0 的变换边沿是在传播段或者相位缓冲段1中,则认为自己的位时序提前了,这是因为采样时间点会出现在相位缓冲段1与2 之间,过早采样会造成采样不准,所以接收端就将这个位时序周期的相位缓冲段1延长;反之,如果检测到边沿在相位缓冲段2中,则将相位缓冲段2缩短,最终让信号变化的边沿变回到同步段,这样,是不是觉得一个位时间分成四段很合理了呢。
对于这个同步机制,我也没有特别深入的研究,如果有谁在这方面有更好的心得,欢迎分享。
再来聊聊过滤器吧。
CAN总线设计了过滤器在芯片里,用于筛选报文,STM32 手册里把过滤器说的云里雾里的,害苦了我们这些初学者,其实很好理解:
我先来简单啰嗦下过滤器的工作方式:
根据配置,每一组的过滤器组可以有1个、2个或4个过滤器
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上“过”一下,能通过的报文是有效报文,收进FIFO,不能通过的是无效报文,直接丢弃,每一个过滤器是并联的,即一个报文只要通过了一个过滤器,就是有效的报文。
对于这方面的介绍,大家可以戳这个链接& 是论坛上关于过滤器很详细的一个介绍,借花献佛,和大家分享。
如果大家还是不能很好的理解过滤器,那我们举个例子带大家进入角色:想象一下,你想去寄快件(发报文),但是国家垄断,没有四通一达上门服务,只能去邮局(若干过滤器组),邮局又比较落后只开了2个投送目的地(接收后保存报文的FIFO),但他们不是什么快件都寄,易燃易爆的不给寄,所以就要筛选,开辟了几个窗口进行筛选(激活的过滤器组,最多14个),每个窗口配备人员不同(过滤器组设置),有的是一个连长加一个班长(2个32位过滤器,工作在屏蔽位模式),有的是两个连长(2个32为过滤器,工作在标识符列表模式),有的是两个班长加两个士兵(4个16位过滤器工作在屏蔽位模式),有的是四个班长(4个16位过滤器工作在列表模式中),这不同的人员配置起到作用不同,官大一级压死人的道理大家都懂,所以你拿去的快件,优先给官大的人筛选,不同级的人员配置中,官大的点头才能寄,平级的谁点头都行,通过之后就存在他们的仓库里了(FIFO中),当然,要是没有你想寄去的地方,你就要去别的邮局看看了,不同邮局寄送的城市不同(寻找下一个节点继续匹配)。
这个例子只是为了形象建立过滤器的工作模式,细节可能有出入,我上面推荐的帖子,非常好。
写到这关于STM32 can总线的学习心得基本就结束了,接下来我想说说我那个失败的实验经历:
实验电路板是两块基于c 芯片的can通讯电路板和STM32 战舰电路板,实验结果:两块c 的电路板可以完美通讯,STM32 的板子无法加进去,期间保证了波特率相同,位时序频率相同,传输数据位数相同,id也是匹配的,但是无法通讯,想问下有此方面经验的同僚们,在保证了以上数据相同的前提下,连接两个电路板是不是理论上可以实现通讯?
菜鸟一枚,还请大家批评指正
主题帖子精华
在线时间17 小时
回复【楼主位】Daisy:
---------------------------------
谢谢分享
站在巨人的肩膀上不断的前进。。。
主题帖子精华
金钱106574
在线时间685 小时
谢谢分享。
CAN节点没有都接120R电阻吧?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
金牌会员, 积分 1643, 距离下一级还需 1357 积分
在线时间24 小时
1、一个CAN总线网络只能有两个120欧终端电阻
2、每个节点波特率必须匹配
3、可先设置过滤器接收所有数据,这样就不会应该过滤器没设置对而接收不到数据。
5、调试的时候最好能有个来协助调试,好的工具,事半功倍!
主题帖子精华
中级会员, 积分 207, 距离下一级还需 293 积分
在线时间2 小时
回复【4楼】beyond696:
---------------------------------
多谢指点。
菜鸟一枚,还请大家批评指正
Powered by&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
该文档贡献者很忙,什么也没留下。
&#xe602; 下载此文档
正在努力加载中...
[精品]STM32的CAN总线接收与发送
下载积分:420
内容提示:[精品]STM32的CAN总线接收与发送
文档格式:PDF|
浏览次数:57|
上传日期: 02:32:48|
文档星级:&#xe60b;&#xe60b;&#xe612;&#xe612;&#xe612;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 420 积分
&#xe602;下载此文档
该用户还上传了这些文档
[精品]STM32的CAN总线接收与发送
官方公共微信

我要回帖

更多关于 在线等很急 的文章

 

随机推荐