0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

两个MCU之间快速传输数据的,常用方法

哈哈hfgfdf 来源:嵌入式学习资料 作者:嵌入式学习资料 2023-02-05 01:27 次阅读

一、MCU之间通信的主要方式

1、采用硬件UART进行异步串行通信

这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源是不够的。这种方法一般用于单片机有硬件UART且不需与外界进行串行通信或采用双UART单片机的场合。

2、采用片内SPI接口I2C总线模块串行通信形式

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,使它既能存储参数,又能作串行数据通信的缓冲器。

247b7ac8-a4b1-11ed-92c9-dac502259ad0.png

2个(或多个)单片机与1片FRAM接成多主-从的I2C总线方式,增加几条握手线,即可得到简单高效的通信硬件电路。

24a270ce-a4b1-11ed-92c9-dac502259ad0.png

在软件方面,只要解决好I2C多主-从的控制冲突与通信协议问题,即可实现简单、高效、可靠的通信了。

三、通讯实例

实例(双单片机结构,多功能低功耗系统)

(1)硬件

W78LE52与EMC78P458组成一个电池供电、可远程通信的工业流量计。

78P458采用32.768kHz晶振,工作电流低,不间断工作,实时采集传感器的脉冲及温度、压力等一些模拟量。

W78LE52采用11.0592MHz晶振,由于它的工作电流较大,采用间断工作,负责流量的非线性校正、参数输入、液晶显示、与上位机通信等功能,它的UART用于远程通信。

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,当A线高电平时,指示总线空闲;当其中一个主机要获取总线控制权时,先查询总线是否空闲,“忙”则退出,空闲则向A线发送一个测试序列(如:1000101011001011),在每次发送位“1”后读取的A线状态。

如果读取状态为“0”,马上退出,说明有其它器件已经抢先获取总线;如果一个序列读取的A线状态都正确,则说明已成功获得总线控制权,这时要拉低A线以指示总线“忙”,直到读写高A线,使总线回到“空闲”状态。不同的主机采用不同的测试序列,或产生随机测试序列,测试序列长度可以选得长一些,这样可以增加仲裁的可靠性。

(3)通信协议

一个可靠通信体系,除了好的硬件电路外,通信协议也至关重要。在单片机系统RAM资源与执行速度都非常有限的情况下,一个简捷有效的协议是非常重要的。下面具体介绍一种比较适用于单片机通信的协议,数据以包的形式传送。

数据包结构:

① 包头——指示数据包的开始,有利于包完整性检测,有时可省略;

② 地址——数据包要传送的目标地址,若只有双机通信或硬件区分地址可以省略;

③ 包长度——指示整个数据包的长度;

④ 命令——指示本数据包的作用;

⑤ 参数——需要传送的数据与参数;

⑥ 校验——验证数据包的正确性,可以是和校验、异或校验、CRC校验等或者是它们的组合;

⑦ 包尾——指示数据包的结尾,有利于包完整性检测,有时可省略。

(4)通信流程

首先,要在FRAM里划分好各个区域,各个单片机的参数区、数据接收区等。

然后,单片机可以向另一个单片机发送数据包,发送完毕之后通过向握手线B发送1个脉冲通知对方取走数据;接收方读取数据并进行处理后,向FRAM内发送方的数据接收区写入回传数据或通信失败标志,再向握手线B发送1个脉冲回应发送方。

如果需要单片机2发送的话,只需交换一下操作过程即可。

四、项目小节

通过实践可知,以上方法是可行的。与其它方法相比具有发下优点:

① 简单 占用单片机口线少(SCL、SDA、握手线A、握手线B)。 ② 通用 软件模拟I2C主机方式,可以在任何种类的单片机之间通信。 ③ 高效 由于采用数据缓冲,可以在不同时钟频率、不同速度的单片机之间通信;读写数据时,可以I2C总线的最高速度进行,可以实现1次传送大量数据;在一个单片机向FRAM传送数据时,另一个单片机无须一一作出响应或等待,可以进行其它程序操作,提高软件工作效率。 ④ 灵活 通信硬件接口对于各个单片机是对等的,通过软件配置,每个单片机既可以根据需要主动发送通信,也可以只响应其它单片机的呼叫。 ⑤容易扩展 通过增加地址识别线,修改通信协议,即可做到多机通信。 以下是需要注意的地方: ① 为了提高通信效率,握手线B最好使用中断端口,负脉冲宽度一定要满足速度较低单片机中断信号要求。如果没有中断的话应增加1条口线,用改变端口状态的方法通知对方,等待对方查询,而不是负脉冲。 ② 向对方发送负脉冲时,应屏蔽自己的中断。 ③ 由于参数与通信缓冲区同时设在同一片FRAM内,要避免对参数部分的误操作。一个较好的解决办法是把参数存放在地址的后半部分(A2=1),在进行通信操作时,把FRAM的WP引脚拉高(地址在后半部分的单元写保护),这样可以有效地防止测验时对参数区误操作。 ④ 由于I2C总线在一个时间段内只有1个主机和1个从机,所以当1个单片机正在写通信数据时,另一个单片机是不能对FRAM进行操作的。如果需要实时、频繁地读取FRAM中参数的话,请预先将参数读入RAM单元使用或另外增加专门存放参数的芯片。

审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44554

    浏览量

    634652
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350992
  • 数据
    +关注

    关注

    8

    文章

    7002

    浏览量

    88943
  • 通信
    +关注

    关注

    18

    文章

    6024

    浏览量

    135950
  • fram
    +关注

    关注

    2

    文章

    282

    浏览量

    79388
收藏 人收藏

    评论

    相关推荐

    用F28069控制AFE031来实现两个F28069和AFE031之间数据传输,怎么实现?

    我想通过用F28069控制AFE031来实现两个F28069和AFE031之间数据传输。并且我想只依赖HAL的API库来开发,尽量不涉及硬件底层的编程,然后PHY层自己来写,这个思路可行吗? 我
    发表于 12-20 15:59

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    频率是两个关键参数,它们之间存在一定的关系,并且UART串口有一系列常用的波特率。以下是对这两个概念的介绍。 一、UART波特率和传输频率的
    的头像 发表于 10-06 16:12 2541次阅读
    uart波特率和<b class='flag-5'>传输</b>频率的关系 UART串口的<b class='flag-5'>常用</b>波特率为多少

    如何让两个设备通过4G进行点对点数据映射

    4G模块点对点传输是指通过蜂窝网络(如LTE网络)实现两个远程设备之间的直接数据通信。与通过云服务器转发数据不同,点对点通信允许设备通过各自
    的头像 发表于 09-30 12:10 1061次阅读
    如何让<b class='flag-5'>两个</b>设备通过4G进行点对点<b class='flag-5'>数据</b>映射

    ad如何设置两个元器件的距离

    在Altium Designer(简称AD)中设置两个元器件之间的距离,主要是通过设置元器件间的安全间距(Clearance)规则来实现的。这个规则定义了元器件之间、元器件与走线之间
    的头像 发表于 09-02 15:31 6600次阅读

    触发器的两个稳定状态分别是什么

    触发器作为数字电路中的基本逻辑单元,具有两个稳定状态,这两个状态通常用于表示二进制数码中的0和1。
    的头像 发表于 08-12 11:01 1039次阅读

    XTR111输出做隔离的话,是不是需要把OD及EF两个信号与MCU之间做数字隔离?

    如下所示电路设计,XTR111引脚的信号是不是共地的,如果我想要做隔离,是不是需要把OD及EF两个信号与MCU之间做数字隔离?,这边有什么建议吗
    发表于 07-30 08:18

    如何使用freeRTOS在两个任务之间传输任务数据

    /温度。 我想创建一 CSV 文件来记录一段时间内的数据。 我创建 I2C 任务的方法与示例中的 emFIlesystem 任务相同。 者都在运行,做着它们应该做的事情,但我觉得它
    发表于 07-03 07:55

    两个PLC之间如何交互信号

    级别的自动化控制和协调。本文将详细探讨两个PLC之间交互信号的方法、原理、特点以及应用实例,为读者提供全面且深入的理解。
    的头像 发表于 06-14 16:57 4276次阅读

    两个铜片可以形成原电池吗

    两个铜片本身不能形成原电池,因为原电池的工作原理依赖于两个不同电位的电极材料之间的氧化还原反应。
    的头像 发表于 05-21 16:23 940次阅读

    电感两两耦合怎么去耦

    和去耦技术,并探讨其在实际应用中的一些典型场景。 一、电感耦合的原理与方法 电感耦合原理 电感耦合是指通过两个或多个电感之间的磁场相互作用来传输能量或信号的
    的头像 发表于 03-09 10:50 3947次阅读

    两个不同的数据,想用一蓝牙芯片进行传输,可以做到吗?

    现在有两个不同的数据,想用一蓝牙芯片进行传输,可以做到吗?求解
    发表于 03-01 09:37

    arcgis中如何关联两个属性表

    在ArcGIS中,关联两个属性表是一重要的操作,可以通过此操作将两个表中的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGIS中实现属性表的关联。 首先,我们需要明确
    的头像 发表于 02-25 11:01 4187次阅读

    如何启用两个TC275来进行外部数据传输

    你好,我想启用两个TC275来进行外部数据传输? 我已经在两个微控制器之间建立了物理连接,在 COOLDIM_PRG_BOARD的足够引脚(can High 和 canLow)上有
    发表于 01-22 07:47

    两个机器的时钟怎么同步?

    多个机器的时钟保持同步。在本文中,我们将详细介绍如何同步两个机器的时钟,并讨论其原理、方法和实施。 一、时钟同步的重要性 1.数据一致性:在分布式系统中,确保多个机器的时钟同步可以保证数据
    的头像 发表于 01-16 14:26 1615次阅读

    DDR200T开发板中FPGA模块和gd32vf103之间是通过什么传输数据的?

    目前想要通过DDR200T开发板做一基于FPGA的卷积神经网络软硬协同加速器 DDR200T开发板中FPGA模块用的是xc7a200t和gd32vf103(mcu之间是通过什么传输
    发表于 01-10 06:28