笔记一:CAN传输的假想
在学习笔记第一本中,最后一个个人秀,利用了两个CAN节点建立了简单的CAN通讯,这回就强化一下CAN节点与节点之间通讯的概念。
传送这词在人们的脑海里就好想邮差送信的概念,邮差将一封封的信件逐个送到每一户目的地址,不过在CAN总线里通讯的节点们比起邮差的概念,“广播”的概念更贴切,广播有如电视台将节目广播开来,谁家只要搭起天线选择适合的频道就能接收到节目。CAN总线的传输就是这么一回事。
换另一句话说:某个节点(假设节点1),发送报文在总线上,这时报文以广播的方式在总
线上传输,如果当中两个点(假设节点2与3),他们拥有与报文标示符一样的接受代码的话,那么经过验收滤波动作,报文就会被接入它们RXFIFO当中。
当然还有一点要项必须注意,报文发送时必须先申请发送请求 ,然后报文才会发在总线上。这个概念很重要必须稳固在脑海中。
笔记二:自检模式
估计刚开始接触CAN的第一个实验就是PIAE的CAN自检测试,说老实话刚开始的时候我真的不明白自检模式到底时什么一回事,但是经过几个小时的测试后,终于得出结论,好了立马进入这篇笔记的主题吧。回顾一下我们的好朋友模式寄存器,在MODR(模式寄存器)中的第三位也就MOD.2
?
它设置了节点的自检模式,自检模式说白了就是测试模式节点用来测试自己。在图表中包含了一条信息,“using lf reception request command”,nucleus这才是最关键,如果在报文发送的时候忘了给命令寄存器设置“自接收请求-lf reception request”,自检模式时无法完成的。(我就是遗漏了这条信息,苦了自己瞎搞那么久,哈哈)。
在自检模式中,节点包含了几个特性:
(一)可以孤独的一个节点在工作
(二)必须使用自接收请求命令发送报文
(三)验收滤波动作无视,也就是说无视ACR,AMR的设置
(四)报文标示符无视
(五)节点依然参与总线
概念图如以上图标的感觉(图凑合看就好了!呵呵),话多无用,还是开始编写程式。
笔记三:自检模式 实验
试验内容:
每一次点击外部中断键,点击的数量作为报文数据发送,而报文的接收则是节点本身发出的报文。第一到第二个数码管显示发送报文的数据(也就是点击次数),第三到四个数码管显示接收的数据(依然时点击次数,不过是以接收的方式得到数据)。
这个实验借签了PIAE的原实验观念(感谢PIAE),和以“个人秀零七:编写简单的点对点SJA1000驱动函数”作为源码作为基础。虽然说是由“个人秀零七”中的源代码作为基础,但是稍微的将 CAN_RXD( );
CAN_TXD( );Init_CAN( );和一些变量,作为另一个名为can.H的个体文件,这是为了以后编程更方便。
===============================================================
===============================================================
在这里主要是针对两点要点进行了修改,它们就是节点初始化函数Init_CAN();和节点发送函数CAN_TXD();把么我们来看看Init_CAN()和CAN_TXD一对一口语到底做了什么修改?
把焦点焦距在初始化函数上Init_CAN();如果回忆了介绍初始化函数那章个人秀就会发现到,一旦进入初始化函数,会先进入复位模式-english joke单滤波模式,然后针对波特率,ACR,AMR,CLKOUT等等进行初始化,在初始化函数结束之间,会退出复位模式,再者设定下一个工作模式。如以下代码所示:
void Init_CAN(void)
{
......
......
/*
do
{
MODR=0x08;
temp=MODR; //cyan模式寄存器-推出复位模式,保持单验收滤波模式
}
while(temp&0x01); //判断...*/
do
{
MODR = 0x04;
temp = MODR;
}while(!(temp&0x04)); //确保进入自检模式
我把原先那段“设置工作模式为单验收滤波”代码注释掉了,那么在下面的就是设置进入自检测的代码,
MODR赋值0x04,亦即将STM置一(Self Test Mode)。
接下来的主角就是节点发送函数CAN_RXD();在节点发送函数体中。当完成对TXFIFO赋值以后,我们不是要针对命令寄存器设置报文发送请求吗?如以下代码所示:
void CAN_RXD()
{
......
......
TBSR7=TXD_Buffer[7];
TBSR8=TXD_Buffer[8];
TBSR9=TXD_Buffer[9];
TBSR10=TXD_Buffer[10];
TBSR11=TXD_Buffer[11];
TBSR12=TXD_Buffer[12];
CMR=0x10; //命令寄存器-自动接收请求
/
/CMR=0x01; //命令寄存器-学龄前发送请求
}
CMR(命令寄存器)赋予的值不是原先的0x01,而是0x10,这亦即把SRR置一(Self Recepition Request),那么当完成对TXFIFO赋值后的状态,SRR置一,发送的报文同时间也会被自己接收。除了以上两点修改点要注意以外,当然还有ACR,AMR,和TX报文中的标示符。在自检模式中,可以完全无视验收滤波的规则,换句话说就是在自检模式,无论ACR,AMR,TX报文赋予什么值,也不影响自检模式。
好了这篇笔记就写到这里吧,在文中虽然有很多错误的观点,借用哲学里的一句话“概念”本来就是没有真确的构造体,我也只是以自己的语言来描述“我本身感觉得到”的概念而已,大伙虽然会容易被使糊涂,可是还是将就一下吧。
笔记四:深入探索发送请求
(写实验的笔记很伤元气的,今天就来一些比较文的吧)写这一篇的笔记时为了进一步认识的发送请求,我们都知道在TXFIFO填满报文准备向总线发送,都必须向SJA1000控制器申请发送请求,在正常模式中(验收滤波模式),自检模式中,发送请求的设置都不一样。说是要深入探索发送请求,还不如说进一步讲解数据手册里边的内容,那么开始切入真题吧。
发送请求顾名思义就是在报文呈现发送准备的状态时进行发送申请的动作,在以往练习过的实验基本上接触过发送请求命令有CMR=0x40,CMR=R0x01,那么还有其它的吗?答案是肯定的。
stolen回顾一下命令寄存器,有用的位只有前五位,亦即CMR.0~5而已。而TR(发送请求位)与AT(终止发送位)是对应的关系,这怎么说呢?当TXFIFO已是发送就绪状态,要将报文发送在总线上必须设置TR位逻辑1,一旦TR设置为逻辑1,那么它无法设置TR为逻辑0为取消发送请求,而是必须将AT设置位逻辑1自强英语
才能有效的取消发送请求。
除此之外TR,AT,SRR它们可以复合使用,复合后的效果如下:
CMR | 符号 | 说明 |
0x01 | TR=1 | 发送请求 缝隙英文 |
0x02 | AT=1 | 发送请求取消 |
0x10 | SRR=1 | 自接收请求 |
0x03 | TR=1,AT=1 | 一次性发送请求 |
0x12 | SRR=1,AT=1 | 一次性自接收请求 |
0x13 | SRR=1,TR=1,AT=1 | 与0x03等价 |
0x11 | SRR=1,TR=1 | 与0x01等价 |
| | |
还有一点要注意,之前不是说过了当TR设置为逻辑1,除了设置spawn>幸福的英语AT为逻辑1为取消发送请求以外,当发送状态位为逻辑1时,TR也会自动设置位逻辑0.
那么接下来的要事就是通过实验来验证一下...自己可以尝试以不同的工作模式(自检,验收滤波),在节点发送函数CAN_TXD();设置不同的发送请求看看,结果非常有趣,例如在自检模式中,将节点发送函数设置为CMR=0x11的话,自检模式起不了作用。
笔记五:只听模式
我们多来讨论一个模式吧,如题就是只听模式,如果你曾经仔细的浏览过数据手册,会容易被使混乱,什么“错误认可状态”,又什么“不作出应答”之类老是看不懂的东西。但是只要记住这么一点,当节点设置为只听模式时,它就变成“只能接收报文不能发送报文”的状态,虽然该节点依然参与总线活动,但是它失去了“发言权”。