单片机多机通信的设计方案及原理有哪些?
扫描二维码
随时随地手机看文章
随着社会经济的不断发展进步,科技的不断飞升,在新时代的背景下网络通信已经成了人们最为常 用的科学技术产品之一,由于生活水平得到了提高人们在日常的追求上也发生着变化,而对于通信 的产品可以说是有着日新月异的变化,人们在网络通讯以及工业自动化和数据传输等这方面的实践 操作中会需要一个控制系统对于所运行的数据来进行有效地控制与检测,以此来让通信系统能够及 时高速的进行正常通讯,基于它的种种优点在当下已经得到了较为广泛的应用。
在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。
在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
单片机构成的多机通信系统中常采用总线型主从式结构。在多个单片机组成的系统中,只允许存在一个主机,其他的就是从机,从机要服从主机的控制,这就是总线型主从式结构。
当 51 单片机进行多机通信时,串口要工作在方式 2 和方式 3。假设当前多机通信系统有 1 个主机和 3 个从机,从机地址分别是 00H、01H、02H。如果距离很近它们直接可以以 TTL 电平通信,一旦距离较远的时候,常采用 RS-485 串行标准总线进行数据传输。
为了区分是数据信息还是地址信息,主机用第九位数据 TB8 作为地址 / 数据的识别位,地址帧的 TB8=1,数据帧的 TB8=0。各从机的 SM2 必须置 1。
在主机与某一从机通信前,先将该从机的地址发送给各从机。由于各从机 SM2=1,接收到的地址帧 RB8=1,所以各从机的接收信息都有效,送入各自的接收缓冲器 SBUF,并置 RI=1。各从机 CPU 响应中断后,通过软件判断主机送来的是不是本从机地址,如是本从机地址,就使 SM2=0,否则保持 SM2=1。
接着主机发送数据帧,因数据帧的第九位数据 RB8=0,只有地址相符的从机其 SM2=0,才能将 8 位数据装入接收缓冲区 SBUF,其他从机因 SM2=1,数据将丢失,从而实现主机与从机的一对一通信。
串口工作方式 2、3 也可以用于多机通信,此时第九位数据可作为奇偶校验位,但必须使 SM2=0。
对于现代所见到的的单片机基本上都是带有通信接口的,能够方便的和计算机在信息数据上进行通 信这给通信设备以及计算机网络之间在应用的层面上提供了有力的物质基础条件,在当下的通信设 备的使用上都已经实现了对于单片机的智能控制,像手机、列车无线通信、无线电对讲机等等,在 单片机的通信应用应该说是从两片单片机间的通信开始的,再往后就有了主从式的通信设备,在后 就出现了基于单片机的多机通信系统的应用,同时得到了广泛的应用,虽然说在单片机的多机通信 上面有了很长的研究史但是在形式上也基本都是主从式的,对于平权式的就相对较少。
在系统的设计中对于通信的协议工作的相关过程主要包括了发送数据的过程以及接收数据的过程, 可以采取异步半双的这种通信模式来进行设计,也就是可以在相同的时间段由主机进行发送从机进 行接收,或者是从机进行发射由主机进行接收,这样的设计能够使系统的工作更加的有效便捷,在 整个的系统设计当中占有着相当重要的位置。在接收的同时从机有着两种方式,一个是等待接收这 是由处理器来对串口的状态进行查询而得到的判断;二就是中断接收面对一个对着多个的传输数据 的命令系统首先会在接收中断的过程当中对连接的命令进行解析,当这个“连接”命令得到了信息 之后,主程序就会立即进入到一个设置的状态,然后就会以查询的方法对其余的协议进行解析,在 这个过程中协议的解析首先是对数据包的一个正确性以及完整性进行的判断,随后就是对数据以及 数据的类型进行的提取,这些结束后就把提取的相关数据存放起来,用作对主程序的处理,通常会 采用中断接收这种方式会比较好。在接收数据的过程中主机可以和从机得到一致的结合,在串口打 开之后对远程的监视串口的数据接收也要开启,然后把接收到的数据放置到缓冲区域由此同时把接 收数据的消息传送给主程序,这时数据就会和消息一起传输给主程序那里,随后主程序就会对消息 进行开启开始处理函数以及数据。
越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路,对于某一些场合,比如:复杂的后台运算及通信与高实时性前台控制系统、软件资源消耗大的系统、功能强大的低消耗系统、加密系统等等,如果合理使用多种不同类型的单片机组合设计,可以得到极高灵活性与性能价格比,因此,多种异型单片机系统设计渐渐成为一种新的思路,但单片机之间的通信一直是困扰这种方法拓展的主要问题,本文将分析比较几种单片机之间的方式、难点,并提出一种解决方案。
一、几种常用单片机之间的通信方式
1、采用硬件UART进行异步串行通信
这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件 UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源是不够的,这种方法一般用于单片机有应件UART且不需与外界进行串行通信或采用双UART单片机的场合。
2、采用片内SPI接口或2C总线模块串行通信形式,SPI/I2C接口具有硬件简单、软件编程容易等特点,但目前大多数单片机不具备硬件SPI/I2C模块。
3、利用软件模拟SPI/I2C模式通信,这种方式很难模拟从机模式,通信双方对每一位要做出响应,通信速率与软件资源的开销会形成一个很大的矛盾,处理不好会导致系统整体性能急剧下降,这种方法只能用于通信量极少的场合。
4、口对口并行通信,利用单片机的口线直接相连,加上1~2条握手信号线,这种方式的特点是通信速度快,1次可以传输4位或8位,甚至更多,但需要占用大量的口线,而且数据传递是准同步的,在一个单片机向另一个单片机传送1个字节以后,必须等到另一个单片机的接收响应信号后才能传送下一个数据。一般用于一些硬件口线比较富余的场合。
5、利用双口RAM作为缓冲器通信,这种方式的最大特点就是通信速度快,两边都可以直接用读写存储器的指令直接操作;但这种方式需要大量的口线,而且双口RAM的价格很高,一般只用于一些对速度有特殊要求的场合。
从上面几种方案来看,各种方法对硬件都有很大的要求与限制,特别是难以在功能简单的单片机上实现,因此寻求一种简单、有效的,能在各种单片机之间通信的方法具有重要的意义,③、④方案中,双方单片机要传递的每一位或每一个字节做出响应,通信数据量较大时会耗费大量的软件资源,这在一些实时性要求高的地方是不允许的。
针对这一问题,假设在单片机之间增加1个数据缓冲器,大批数据先写入缓冲区,然后再让对方去取,各个单片机对数据缓冲器都是主控模式,这样必然会大大提高通信效率,谈到数据缓冲,我们马上会想到并行RAM,但是并行RAM需要占用大量的口线(数据线+地址线+读写线+片选线+握手线),一般在16条以上,这是一个让人望而生畏的数字,而且会大大增加PCB面积并给布线带来一定的困难,极少有人采用这种方式。串行接口的RAM在市场上很少见,不但难以买到而且价格很高,移位寄存器也可以做数据缓冲器,但目前容量最大的也只128位,因为是“先进先出”结构,所以不管传递数据多少,接收方必须移完整个寄存器,灵活性差而且大容量的移位寄存器也是少见难买的。一种被称为“铁电存储器”芯片的出现,给我们带来了解决方法。
二、利用铁电存储器作为数据缓冲器的通信方式
铁电存储器是美国Ramtran公司刚刚推出的一种新型非易失性存储器件,简称FRAM,与普通EEPROM、Flash-ROM相比,它具有不需写入时间、读写次数无限,没有分布结构可以连续写放的优点,因此具有RAM与EEPROM的双得特性,而且价格相对较低,现在大多数的单片机系统配备串行EEPROM(如24CXX、93CXX等)用来存储参数。
如果用1片FRAM代替原有EEPROM,使它既能存储参数,又能作串行数据通信的缓冲器,2个(或多个)单片机与1片FRAM接成多主-从的I2C总线方式,增加几条握手线,即可得到简单高效的通信硬件电路,在软件方面,只要解决好I2C多主-从的控制冲突与通信协议问题,即可实现简单、高效、可靠的通信了。
三、实例(双单片机结构,多功能低功耗系统)
1、硬件
W78LE52与EMC78P458组成一个电池供电、可远程通信的工业流量计,78P458采用32.768kHz晶振,工作电流低,不间断工作,实时采集传感器的脉冲及温度、压力等一些模拟量;W78LE52采11.0592MHz晶振,由于它的工作电流较大,采用间断工作,负责流量的非线性校正、参数输入、液晶显示、与上位机通信等功能,它的UART用于远程通信。
通信接口部分线路如图1所示,2个单片机共用1片I2C接口的FRAM(FM24CL16)组成二主一从的I2C总线控制方式,W78LE52的P3.5、P3.2分别与78P458的P51、P50连接作握手信号线A与B,我们把握手线A(简称A线)定义为总线控制、指示线,主要用于获取总线控制权与判别总线是否“忙”;握手线B(简称B线)定义为通知线,主要用于通知对方取走数据。
2、I2C总线仲裁
由于我们采用的是二主一从的I2C总线方式,因此防止2个主机同时去操作从机(防冲突)是一个非常重要的问题。带有硬件I2C模块的器件一般是这样的,器件内部有1个总线仲裁器与总线超时定时器:当总线超时定时器超时后指示总线空闲,这时单片机可以发出获取总线命令,总线仲裁器通过一系列操作后确认获取总线成功或失败;超时定时器清零,以后的每一个SCL状态变化对总线所有主机的超时定时器进行清零,以防止它溢出,指示总线正处于“忙”状态,直到一个主机对总线控制结束不再产生SCL脉冲;超时定时器溢出,总线重新回到“空闲”状态。
但是目前大多数单片机没有配备硬件I2C模块,而且当2个主机的工作频率相差较大时,超时定时器定时值只能设为较大的值,这样也会影响总线的使用效率,下面介绍一种用软件模拟I2C总线仲裁的方式(I2C读写操作程序的软件模拟十分多见,这里不再多述):用1条握手线A,流程图如图2所示,当A线高电平时,指示总线空闲;当其中一个主机要获取总线控制权时,先查询总线是否空闲,“忙”则退出,空闲则向A线发送一个测试序列(如:1000101011001011),在每次发送位“1”后读取的A线状态。如果读取状态为“0”,马上退出,说明有其它器件已经抢先获取总线;如果一个序列读取的A线状态都正确,则说明已成功获得总线控制权,这时要拉低A线以指示总线“忙”,直到读写高A线,使总线回到“空闲”状态。不同的主机采用不同的测试序列,或产生随机测试序列,测试序列长度可以选得长一些,这样可以增加仲裁的可靠性。
3、通信协议
一个可靠通信体系,除了好的硬件电路外,通信协议也至关重要,在单片机系统RAM资源与执行速度都非常有限的情况下,一个简捷有效的协议是非常重要的,下面具体介绍一种比较适用于单片机通信的协议,数据以包的形式传送。数据包结构:
①包头——指示数据包的开始,有利于包完整性检测,有时可省略;
②地址——数据包要传送的目标地址,若只有双机通信或硬件区分地址可以省略;
③包长度——指示整个数据包的长度;
④命令——指示本数据包的作用;
⑤参数——需要传送的数据与参数;
⑥校验——验证数据包的正确性,可以是和校验、异或校验、CRC校验等或者是它们的组合;
⑦包尾——指示数据包的结尾,有利于包完整性检测,有时可省略。
4、通信流程
首先,要在FRAM里划分好各个区域,各个单片机的参数区、数据接收区等,然后,单片机可以向另一个单片机发送数据包,发送完毕之后通过向握手线B发送1个脉冲通知对方取走数据;接收方读取数据并进行处理后,向FRAM内发送方的数据接收区写入回传数据或通信失败标志,再向握手线B发送1个脉冲回应发送方,表3是单片机1启动1次与单片机2之间的通信的例子,如果需要单片机2发送的话,只需交换一下操作过程即可。