当前位置:首页 > 单片机 > 单片机
[导读] 1 主从式多机通信  所谓主从式多机系统,即在数个arm(或单片机)中,有一个是主机,其余的为从机。从机要服从主机的调度、支配,其拓扑结构如图1所示。    主机信息可以发到各个从机,从机发送的

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位方式的多机通信,并在相关课题中成功应用,而且保证了通信的可靠性。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

串行通信需要传输的数据通过调制器(Modulator)将数据转换为模拟信号,经过信号调制(Modulation)后在传输线上传输,接收端通过解调器(Demodulator)将信号解码还原成原始数据。

关键字: 串口 串行通信 并行通信

51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺...

关键字: 单片机 全双工 串口

串口是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。因此串口广泛应用于嵌入式、工业控制等领域中对数据传输速度要求不高的场合...

关键字: 串口 RS232 同步传输

串口作为单片机开发的一个常用的外设,应用范围非常广。大部分时候,串口需要接收处理的数据长度是不定的。那么怎么才能判断一帧数据是否结束呢,今天就以STM32单片机为例,介绍几种接收不定长数据的方法。

关键字: 单片机 串口 STM32

这是FPGA之旅设计的第十例啦,在上一例中,已经成功驱动了OLED屏幕,本例将结合上一例,以及第四例多bytes串口通信做一个有趣的例程。

关键字: FPGA OLED屏 串口

接下来测试烧写功能,本次采用串口和USB烧写方式。使用ISP串口烧写这是51单片机常用的方案,本次测试比较顺利,没有遇到什么问题。但是USB烧写没有测试成功,USB烧写方式不需要任何的驱动和硬件支持,直接将USB线和ST...

关键字: PCB控制板 USB 串口

摘要:多功能电能表在配电系统中应用广泛,其计量的准确度对企业管理和考核至关重要,因此在设计多功能电能表时需要对其进行校准,满足一定应用等级。常规的多功能电能表校准方法是以电能脉冲校准为主,现提出一种基于C#和功率校表法的...

关键字: 多功能电能表 串口 波特率

摘 要:为了能通过串口采集电能参数,完成一种基于串口的三相电能采集设备的研制,设计了电能采集设备的硬件和软件部分。其中硬件采用MCU+专用电能计量芯片的结构,结构简单;软件则用于实现输入、输出、三相电能参数的采集和串行通...

关键字: 电能采集 ATT7022B MSP430 串口

如何确定时基假如要测量的波特率为9600,则每一比特位的时间为:1/9600≈104μs,一般示波器横向上每个大格子里5个小格子,要想看清一比特位一般需要一个小格子就够了,则时基为:104μs*5=520μs,也就是说时...

关键字: 串口

VivadoML最新版2021下载方法:《安装Vivado2021.1ML版,编译时间真的会减少吗?》今天我们通过zedboard串口使用的实例来简单介绍vivado和vitis的使用步骤。1,首先打开软件,新建一个空白...

关键字: 串口 zedboard vi
关闭
关闭