① 使用硬件UART进行异步串行通信。 这是一种有效、可靠的通信方式,占用端口线较少; 但不幸的是,许多小型微控制器没有硬件UART,有的只有一个UART。 如果系统还需要与上位机通信,则硬件资源不够。 这种方法一般用在单片机有硬件UART且不需要与外界串行通信,或者使用双UART单片机时。
② 采用片内SPI接口或I2C总线模块串行通信形式。 SPI/I2C接口具有硬件简单、软件编程方便的特点,但目前大多数微控制器都没有硬件SPI/I2C模块。
③使用软件模拟SPI/I2C模式通信。 这种方法很难模拟从机模式。 通信双方都必须对每一位做出响应。 通信速率和软件资源的开销会形成很大的矛盾。 如果处理不好,将会导致系统整体性能急剧下降。 这种方法只能在流量很少的地方使用。
④端口对端口并行通信,采用单片机的端口线直接连接,加1~2根握手信号线。 这种方式的特点是通信速度快,一次可以传输4位或8位,甚至更多,但需要大量的接口线,而且数据传输是准同步的。 一个微控制器向另一个微控制器发送1个字节后,必须等到另一个微控制器收到响应信号后才能发送下一个数据。 一般用在一些硬件接口线比较丰富的场合。
⑤使用双口RAM作为缓冲通讯。 这种方式的最大特点是通信速度快,双方可以直接使用读写存储器的指令进行操作; 但这种方法需要大量的接口线,而且双口RAM的价格很高,所以一般只用于一些对速度有特殊要求的场合。
从上述方案来看,各种方法对硬件都有很大的要求和限制,尤其是在功能简单的单片机上实现起来比较困难。 因此,我们正在寻找一种简单有效的方法,可以在各种微控制器之间进行通信。 方法具有重要意义。 在③和④方案中,双方的微控制器对要传输的每一位或字节进行响应。 当通信数据量较大时,会消耗大量的软件资源,这在一些实时性要求较高的地方是不允许的。
为了解决这个问题,假设在微控制器之间添加一个数据缓冲区,先将大量数据写入缓冲区,然后再允许对方取回。 每个微控制器对于数据缓冲器都处于主控模式,这必然会大大改善通信。 效率。 说到数据缓冲,我们立刻想到并行RAM,但是并行RAM需要大量的端口线(数据线+地址线+读写线+片选线+握手线),通常超过16条。这是这是一个令人望而生畏的数字,而且会大大增加PCB面积,给布线带来一定的困难。 很少有人使用这种方法。 串行接口RAM在市场上很少见,不仅很难买到,而且价格非常昂贵。 移位寄存器也可以用作数据缓冲器,但目前最大容量仅为128位。 由于是“先进先出”结构,无论传输多少数据,接收方都必须对整个寄存器进行移位,灵活性差,移位容量大。 位寄存器也很少见且难以购买。 一种名为“铁电存储器”的芯片的出现给我们带来了解决方案。
使用铁电存储器作为数据缓冲区的通信方法
铁电存储器是美国Ramtran公司推出的一种非易失性存储器件,简称FRAM。 与普通EEPROM和Flash-ROM相比,具有无写入时间、读写次数不受限制、无分布式结构可连续写入和播放的优点。 因此,它具有RAM和EEPROM的双重特性,而且价格相对较低。
如今,大多数单片机系统都配备了串行EEPROM(如24CXX、93CXX等)来存储参数。 如果用一块FRAM来代替原来的EEPROM,它不仅可以存储参数,还可以作为串行数据通信的缓冲区。 通过连接2个(或更多)微控制器和1个FRAM组成多主从I2C总线,并添加少量握手线,即可获得简单高效的通信硬件电路。 在软件方面,只要解决I2C多主从控制冲突和通信协议问题,就可以实现简单、高效、可靠的通信。
示例(双微控制器结构,多功能低功耗系统)
(1)硬件
W78LE52和EMC78P458组成电池供电的可远程通信的工业流量计。 78P458采用32.768kHz晶振,工作电流低,不间断工作。 实时采集传感器脉冲和温度、压力等一些模拟量; W78LE52使用11.0592MHz晶体振荡器。 由于其工作电流较大,所以采用间歇工作,负责不停流。 线性校正、参数输入、液晶显示、与上位机通讯等功能,其UART用于远程通讯。 两个微控制器共享一块带有I2C接口的FRAM(FM24CL16),形成两主一从的I2C总线控制模式。 W78LE52的P3.5和P3.2分别连接到78P458的P51和P50,作为握手信号线A和B。我们定义握手线A(简称A线)为总线控制和指示线,主要用于获取总线控制权并判断总线是否“忙”; 握手线B(简称B线)定义为通知线,主要用于通知对方拿走数据。
(2) I2C总线仲裁
由于我们采用的是两主一从的I2C总线方式,所以防止两个主设备同时操作从设备(防冲突)是一个非常重要的问题。 带有硬件I2C模块的设备一般都是这样的。 器件内部有总线仲裁器和总线超时定时器:当总线超时定时器超时时,表明总线空闲。 此时,单片机可以发出总线获取命令,总线仲裁器通过一系列操作后,确认获取总线的成功或失败; 超时定时器被清零,随后每次SCL状态改变都会清零总线上所有主机的超时定时器,以防止其溢出并指示总线处于“忙”状态。 在主机完成对总线的控制之前,不再生成 SCL 脉冲; 超时定时器溢出,总线返回“空闲”状态。 然而,目前大多数微控制器都没有配备硬件I2C模块,当两个主机的工作频率相差较大时,超时定时器值只能设置为较大的值,这也会影响总线的效率。
下面介绍一种用软件模拟I2C总线仲裁的方法(软件模拟I2C读写操作程序很常见,这里不再赘述): 使用握手线A,当A线为高电平时,表明总线空闲; 当其中一台主机想要获得总线控制权时,它首先检查总线是否空闲。 如果它是“忙”,则退出。 如果空闲,则向A线发送测试序列(如:1000101011001011)。 每发送一位“1”后,A线状态。 如果读取状态为“0”,则立即退出,说明其他设备已抢占总线; 如果顺序读取的A线状态正确,则表示已成功获得总线控制权。 此时,必须将 A 线拉低至 表示总线处于“忙”状态,直到对高 A 线进行读或写操作使总线返回“空闲”状态。 不同的主机使用不同的测试序列,或者生成随机的测试序列。 测试序列长度可以选择更长,这样可以增加仲裁的可靠性。
(3) 通讯协议
对于一个可靠的通信系统来说,除了良好的硬件电路外,通信协议也至关重要。 在微控制器系统的RAM资源和执行速度非常有限的情况下,简单有效的协议非常重要。 下面详细介绍一种更适合单片机通信的协议。 数据以数据包的形式传输。 数据包结构:
①Baot header——表示数据包的开始,有助于数据包完整性检测,有时可以省略;
②地址——要传输的数据包的目的地址。 如果只有双机通讯或者硬件区分地址,可以省略;
③数据包长度——表示整个数据包的长度;
④Command——表示该数据包的功能;
⑤参数——需要传输的数据和参数;
⑥验证——验证数据包的正确性,可以是和验证、异或验证、CRC验证等或其组合;
⑦End of packet——表示数据包的结束,有助于数据包完整性检测,有时可以省略。
(4) 沟通流程
首先需要在FRAM中划分各个区域,包括各个单片机的参数区、数据接收区等。 然后,该微控制器可以向另一个微控制器发送数据包。 传输完成后,向握手线B发送脉冲,通知对方取走数据; 接收方读取数据并处理后,写入FRAM中发送方的数据接收区。 输入返回数据或通讯失败标志,然后向握手线B发送脉冲,响应发送方。
如果需要MCU 2发送,只需交换操作流程即可。
4 总结
从实践中可以看出单片机仿真软件教程,上述方法是可行的。 与其他方法相比,它具有以下优点:
①简单。 占用微控制器端口线少(SCL、SDA、握手线A、握手线B)。
②通用。 该软件模拟I2C主机模式,可以在任何类型的微控制器之间进行通信。
③高效。 由于使用了数据缓冲,可以在不同时钟频率和不同速度的微控制器之间进行通信; 读写数据时,可以以I2C总线最高速度进行,一次可以传输大量数据; 当一个微控制器向FRAM传输数据时,另一个微控制器不需要一一响应或等待,可以执行其他程序操作,提高软件工作效率。
④灵活。 通信硬件接口相当于每个微控制器。 通过软件配置,每个微控制器可以根据需要主动发送通信,或者只能响应来自其他微控制器的调用。
⑤易于扩展。 通过增加地址识别线和修改通信协议,可以实现多机通信。
以下是需要注意的事项:
①为了提高通信效率,握手线B最好使用中断口,负脉冲宽度必须满足速度较慢的单片机的中断信号要求。 如果没有中断,则应增加端口线,通过改变端口状态通知对方单片机仿真软件教程,等待对方查询,而不是负脉冲。
②向对方发送负脉冲时,应屏蔽自己的中断。
③由于参数和通讯缓冲区同时位于同一个FRAM中,因此需要避免参数部分的误操作。 更好的解决方案是将参数存储在地址的后半部分(A2=1),在进行通信操作时,将FRAM的WP引脚拉高(地址在后半部分的单元被写保护),这样有效防止测试过程中参数误操作。
④ 由于I2C总线在一段时间内只有1个主设备和1个从设备,当一个单片机正在写入通信数据时,另一个单片机无法操作FRAM。 如果需要实时、频繁地读取FRAM中的参数,请提前将参数读入RAM单元中,或者另加一块专门存储参数的芯片。