ARM7串口9位方式多机通信的编程技术

arm7串口9位方式多机通信的编程技术 1 主从式多机通信
所谓主从式多机系统,即在数个arm(或单片机)中,有一个是主机,其余的为从机。从机要服从主机的调度、支配,其拓扑结构如图1所示。
主机信息可以发到各个从机,从机发送的信息只能被主机接收,从机之间不进行通信。
51单片机串口不同寻常的特征是包括第9位方式(在串口模式2和模式3下)。它允许把在串行口通信增加的第9位用于标志特殊字节的接收。一般约定第9位为高时表示该字节为地址字节,第9位为低时为数据字节。第9位方式允许接收单片机信息,仅当字节具有一个第9位时才能被中断。用这种方式,主机首先广播1字节,并让其第9位为高,同时收到该字节的各个从机,只有地址相符的打开,以接收后面的数据字节。所接续的数据字节(第9位为低)不能引起其他从机中断,因为未送它们的地址。
51单片机用9位方式多机通信时,串口模式必须在方式2或方式3。
其实现多机通信的原理和工作过程如下:作主机的8051的sm2应设定为o,作从机的sm2设定为1。主机发送并被从机接收的信息有两类:一类是地址,用于指示需要和主机通信的从机地址,由串行数据第9位为“1”来标志;另一类是数据,由串行数据第9位为“0”来标志。由于所有从机的sm2=1,故每个从机总能在r1=o收到主机发来的地址(因为串行数据的第9位为“l”),并进入各自的中断服务程序。在中断服务程序中,每台从机把接收到的从机地址和它的本机地址(系统设计时所分配)进行比较。所有比较不相等的从机均从各自的中断服务程序中退出(sm2仍为1),只有比较成功的从机才足被主机寻址通信的从机。被寻址的从机在程序中使sm2=0,以便接收随之而来的数据或命令(rb8=0)。上述过程进一步归结如下:
①主机的sm2为o,所有从机的sm2=1,以便接收主机发来的地址。
②主机给从机发送地址时,第9数据位应设置l,以指示从机接收这个地址。
③所有从机在sm2=1、rb8=1和ri=o时,接收主机发来的从机地址,进入相应中断服务程序,并与本机地址相比较,以便确认是否为被寻址从机。
④被寻址从机通过指令清除sm2,以便正常接收数据,并向主机发回接收到的从机地址,供主机核对。未被寻址的从机保持sm2=1,并退出各自中断服务程序。
⑤完成主机和被寻址之间的数据通信,被寻址从机在通信完成后重新使sm2=l,并退出中断服务程序,等待下次通信。
从以上8051实现9位方式多机通信的过程可见,关键问题在于:
①发送端(主机)如何发送第9位,并且可编程设置1或o;
②接收端(从机)如何接收到这第9位,并判断出是l还是0。
以上问题,8051串口可通过控制寄存器scon中的tb8、rb8和sm2位的设置和读取轻松解决,但在arm中并没有与805l类似功能的寄存器。那么arm7多机系统怎样实现如上9位方式多机通信呢?下面通过分析arm串口(以uart0为例)的内部结构和相关寄存器,给出一个有效的解决方案。
2 arm7串口uart0内部结构
使用arm7串口uarto之前须设置5个寄存器,即中断使能寄存器uoier、uarto格式控制寄存器uolcr、fifo控制寄存器uofcr和波特率设置寄存器uodlm和uodll。发送过程是:cpu内核通过vpb接口对uarto的寄存器进行读写访问,数据首先进入发送缓存uothr,经发送移位寄存器uotsr逐位移出,经txdo引脚输出。接收过程是:数据经rxdo,先进入接收移位寄存器uorsr,经接收缓存u0rbr,通过vpb与cpu内核相连。特别注意的是,通信过程中arm7串口中的中断标志寄存器u0iir和uart0状态寄存器uolsr的各位将随着通信收发而自动受到影响,也就是说这两个寄存器记录了数据通信过程的状态信息,这些信息很有用。
uoiir寄存器的描述如表1所列。
uoiir提供状态代码,用于指示一个挂起中断的中断源和优先级。在访问uoiir的过程中,中断被冻结。如果在访问uoiir时产生了中断,该中断将被记录,在下次访问uoiir时可以读出,避免了中断的丢失。
uolsr寄存器描述如下:
rdr:接收数据就绪。判断该位是否置1,决定能否从fif0中读取数据。
0——uorbr为空。
l——uorbr中包含有效数据。从接收fifo中读走所有数据后,恢复为o。
0e:溢出错误标志。当u0rbr寄存器中已经有新的字符就绪,而接收fif0已满时,该位置位。
0——接收缓存区没有溢出。
1——接收缓存区发生溢出错误。
pe:奇偶校验错误。在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与uolcr中的设置不符,将引起奇偶校验错误。
o——没有发生奇偶校验错误。
1——发生奇偶校验错误。读操作使该位恢复为o。
fe:帧错误标志。当接收字符的停止位为o时,产生帧错误。 o——没有发生帧错误。
1——发生帧错误。读取该位时恢复为o。
bi:间隔中断标志。在发送数据时,如果rxdo引脚保持低电平,将产生间隔中断。发生间隔中断后,接收模块停止数据接收。
o——没有发生间隔中断。
1——发生间隔中断。
thre:反映uothr是否为空,也可以认为发送fifo是否为空。
o——不为空。
1——空。对uothr进行写操作,使该位恢复为o。
temt:当发送移位寄存器和uothr均为空时,该位置位。
0——不为空。
1——空。对uothr进行写操作,使该位恢复为0。
rxfe:如果一个带有接收错误(如帧错误、奇偶错误或间隔中断)的字符装入uorbr时,该位置位。
o——uorbr中没有接收错误,或uofcr[o]为0。
1——uorbr中包含至少一个uarto rx错误。
另外,还有两个很重要的寄存器:一个是前面提到的格式控制寄存器uolcr,另一个是fifo控制寄存器uofcr。
uolcr寄存器的描述如下:
其中第3位和第4、5位十分重要。
奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
o——禁止奇偶产生和校验。
1——使能奇偶产生和校验。
奇偶选择:设置奇偶校验类型。
oo——奇数(数据位+校验位=奇数)。
01——偶数(数据位+校验位=偶数)。
10——校验位强制为1。
11——校验位强制为o。
u0fcr寄存器的描述如下:
这里面注意第6、7位。
rx触发点设置:通过设置这两位可以调整接收fif0中触发rda中断的有效字节数量。
00——触发点o(1字节)。
01——触发点1(4字节)。
10——触发点2(8字节)。
11——触发点3(14字节)。
3 9位方式多机通信编程实现
上面已说明,9位方式多机通信的关键是第9位的编程发送和第9位的接收和判断。
对于发送端,利用uolcr寄存器的设置便能实现第9位的编程发送。
uolcr=0x2b; //带奇偶校验,强制为l
uolcr=ox3b; //带奇偶校验,强制为o
通过以上设置,只要编程发送1字节,arm就自动将第9位按程序设置的0或1发送出去。
难点在于接收端,即接收端把接收到的第9位放到哪了,程序员又如何知道这第9位是0还是1。
其实,arm并不像51单片机那样把接收到的第9位数据自动装入scon的rb8。实际上,arm并没有这样的寄存器scon,也没有rb8位。要实现判断第9位为1或0,只能利用arm串口通信的奇偶校验功能!
具体思路如下:
①设置奇偶校验使能;
②编程读取uolsr寄存器的pe位(具体含义见uolsr寄存器的描述部分);
③编程判断收到的l字节中有多少个“1”,并设置一标志pp;
④将上述标志与pe位比较处理;
⑤比较的结果就正确表示了第9位是“o”,还是“1”。
按照以上思路,可有效实现第9位的判断。下面给出相应的程序代码:
上述程序中变量u9就是得到的第9位标志:
当u9=oxff时,说明第9位为1;
当u9=oxfe时,说明第9位为o。
还需注意的是,接收端奇偶校验设置成偶校验还是奇校验,要根据后面程序中标志pp的设置而定。
4 总 结
本设计方案巧妙地应用arm串口通信奇偶校验功能,实现了9位方式的多机通信,并在相关课题中成功应用,而且保证了通信的可靠性。

建设品牌目标,新意互动将重新洗牌
关于LED闪灯分析
经纬恒润强势入选北京市第一批两业融合试点企业
松下超级电池工厂登陆欧洲
全新同步整流IC助力SMPS应用更简易、更高效
ARM7串口9位方式多机通信的编程技术
机器视觉的核心重点及关键技术是什么?
三星Note7的爆炸并不影响其市场销量 仍居世界第一!
简单认识动态随机存取存储器
横河电机发布新型混合信号示波器DLM6000系列
母线隔离开关发热怎么处理
蓝牙耳机哪款性价比高,推荐几款超高性价比蓝牙耳机
通过驱动器源极引脚将开关损耗降低约35%
iPhone7最新曝光:双摄像头新增配色 防水是好是坏?
Gartner预估半导体行业成长减个位数
人工智能+医疗是做优质医疗资源的增量工作
中国飞机产业的发展现状与趋势分析
中国移动执行副总裁李正茂表示O-RAN联盟正在推动无线接入网的创新
虹桥商务区准备布下数万个物联传感器
C语言柔性数组详解