找回密码
 注册
关于网站域名变更的通知
查看: 37|回复: 0
打印 上一主题 下一主题

多个单片机的通信方式,这解读也太详细了!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-1-3 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
简述常用单片机之间的通信方式* e: m. E+ ^# k6 ^5 h
' ?$ t4 M- D7 a1. 采用硬件UART进行异步串行通信。这是一种占用口线少,有效、可靠的通信方式;但遗憾的是许多小型单片机没有硬件UART,有些也只有1个UART,如果系统还要与上位机通信的话,硬件资源是不够的。这种方法一般用于单片机有硬件UART且不需与外界进行串行通信或采用双UART单片机的场合。- t$ r; ]* v; p% `2 b' {3 ]

/ d$ x# r3 Z2 B3 e* ]2. 采用片内SPI接口或I2C总线模块串行通信形式。SPI/I2C接口具有硬件简单、软件编程容易等特点,但目前大多数单片机不具备硬件SPI/I2C模块。8 ]; l1 @7 d% j& ]! X- W
7 A. ~- J/ ^7 Z! q2 `7 V5 e$ |& ^3 e/ j; J! F; u$ ]. i
3. 利用软件模拟SPI/I2C模式通信,这种方式很难模拟从机模式,通信双方对每一位要做出响应,通信速率与软件资源的开销会形成一个很大的矛盾,处理不好会导致系统整体性能急剧下降。这种方法只能用于通信量极少的场合。. j0 T! X5 j; }4 y0 h
/ M1 ~: E5 r% j6 h3 C5 @1 T% r% M0 I
4. 口对口并行通信,利用单片机的口线直接相连,加上1~2条握手信号线。这种方式的特点是通信速度快,1次可以传输4位或8位,甚至更多,但需要占用大量的口线,而且数据传递是准同步的。在一个单片机向另一个单片机传送1个字节以后,必须等到另一个单片机的接收响应信号后才能传送下一个数据。一般用于一些硬件口线比较富裕的场合。' ^( N" U8 f& v% z, ~' T/ `
5 C/ R* f1 r8 o% ?9 U# ~. {: E) i3 s  L8 k
$ |: {' K6 e4 X; l/ P5. 利用双口RAM作为缓冲器通信。这种方式的最大特点就是通信速度快,两边都可以直接用读写存储器的指令直接操作;但这种方式需要大量的口线,而且双口RAM的价格很高,一般只用于一些对速度有特殊要求的场合。
4 S  K+ ^1 q: H: N. N- k0 H' V: T1 K- R0 T; A! d4 l, W0 g
从上面几种方案来看,各种方法对硬件都有很大的要求与限制,特别是难以在功能简单的单片机上实现,因此寻求一种简单、有效的,能在各种单片机之间通信的方法具有重要的意义。③、④方案中,双方单片机要传递的每一位或每一个字节做出响应,通信数据量较大时会耗费大量的软件资源,这在一些实时性要求高的地方是不允许的。" p; V( s! q: f. Q) e' H5 f8 L* M( E* C; F/ u

# t! ~! |2 z; ?4 C: a  t3 C8 `, I5 {' B# u2 G  b  O; `3 w; G' `& Z$ o8 E. U# P& N
针对这一问题,假设在单片机之间增加1个数据缓冲器,大批数据先写入缓冲区,然后再让对方去取,各个单片机对数据缓冲器都是主控模式,这样必然会大大提高通信效率。谈到数据缓冲,我们马上会想到并行RAM,但是并行RAM需要占用大量的口线(数据线+地址线+读写线+片选线+握手线),一般在16条以上。这是一个让人望而生畏的数字,而且会大大增加PCB面积并给布线带来一定的困难,极少有人采用这种方式。串行接口的RAM在市场上很少见,不但难以买到而且价格很高。移位寄存器也可以做数据缓冲器,但目前容量最大的也只128位,因为是“先进先出”结构,所以不管传递数据多少,接收方必须移完整个寄存器,灵活性差而且大容量的移位寄存器也是少见难买的。一种被称为“铁电存储器”芯片的出现,给我们带来了解决方法。
7 e: m( b7 m+ f* T6 b( A; R- Y* w' O. A
9 a( j1 [8 x5 m3 l/ U( ]! M, W% z/ \: `+ a1 G8 z6 x. q
0 y4 u1 x, H2 r0 T利用铁电存储器作为数据缓冲器的通信方式
: b# s7 z7 ?( Y$ f$ Q铁电存储器是美国Ramtran公司推出的一种非易失性存储器件,简称FRAM。与普通EEPROM、Flash-ROM相比,它具有不需写入时间、读写次数无限,没有分布结构可以连续写放的优点,因此具有RAM与EEPROM的双得特性,而且价格相对较低。. J4 t8 s8 @7 n7 {
5 q9 V" ^# X5 e5 s" U. P$ w& K9 y0 S4 x5 j/ C' G' Q% c/ W2 F5 J' C/ K: a0 F; H
现在大多数的单片机系统配备串行EEPROM(如24CXX、93CXX等)用来存储参数。如果用1片FRAM代替原有EEPROM,使它既能存储参数,又能作串行数据通信的缓冲器。2个(或多个)单片机与1片FRAM接成多主-从的I2C总线方式,增加几条握手线,即可得到简单高效的通信硬件电路。在软件方面,只要解决好I2C多主-从的控制冲突与通信协议问题,即可实现简单、高效、可靠的通信了。( A  w& [1 r7 e" g2 f$ f( h2 J( l
: d4 q6 N' x- B6 f4 _
, G3 M/ [7 O  W# |1 a, ]7 d, d$ P  H$ y, w
实例(双单片机结构,多功能低功耗系统)& r' y) q# t! v+ M
(1)硬件; \# x) S' Q5 g3 T
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线)定义为通知线,主要用于通知对方取走数据。( [" B4 q/ y, q3 r' B4 b) N. z% F
" T* U' q  p  H" I5 k  `
& \$ f& s: ^% K" G  j6 F; X& O(2)I2C总线仲裁' B; }! g! j0 C6 j' T
8 y( l2 \/ h9 j7 }1 i& ~& A由于我们采用的是二主一从的I2C总线方式,因此防止2个主机同时去操作从机(防冲突)是一个非常重要的问题。带有硬件I2C模块的器件一般是这样的,器件内部有1个总线仲裁器与总线超时定时器:当总线超时定时器超时后指示总线空闲,这时单片机可以发出获取总线命令,总线仲裁器通过一系列操作后确认获取总线成功或失败;超时定时器清零,以后的每一个SCL状态变化对总线所有主机的超时定时器进行清零,以防止它溢出,指示总线正处于“忙”状态,直到一个主机对总线控制结束不再产生SCL脉冲;超时定时器溢出,总线重新回到“空闲”状态。但是目前大多数单片机没有配备硬件I2C模块,而且当2个主机的工作频率相差较大时,超时定时器定时值只能设为较大的值,这样也会影响总线的使用效率。3 l9 q$ P, a0 q# I8 T/ u3 H
% m$ A. E8 f+ Y, U, E2 \( V/ {1 B3 q' L- h$ |
下面介绍一种用软件模拟I2C总线仲裁的方式(I2C读写操作程序的软件模拟十分多见,这里不再多述):用1条握手线A,当A线高电平时,指示总线空闲;当其中一个主机要获取总线控制权时,先查询总线是否空闲,“忙”则退出,空闲则向A线发送一个测试序列(如:1000101011001011),在每次发送位“1”后读取的A线状态。如果读取状态为“0”,马上退出,说明有其它器件已经抢先获取总线;如果一个序列读取的A线状态都正确,则说明已成功获得总线控制权,这时要拉低A线以指示总线“忙”,直到读写高A线,使总线回到“空闲”状态。不同的主机采用不同的测试序列,或产生随机测试序列,测试序列长度可以选得长一些,这样可以增加仲裁的可靠性。
* Y8 H3 U- i5 E( S3 K2 x' \! @4 y( j# A" t! w: y
, [9 [2 X8 {) V  A' h3 ]$ l5 ^7 V(3)通信协议+ F  \& ]% t. m- s2 m+ V/ Q) C, e% a: E' X5 W" l- [; ?
一个可靠通信体系,除了好的硬件电路外,通信协议也至关重要。在单片机系统RAM资源与执行速度都非常有限的情况下,一个简捷有效的协议是非常重要的。下面具体介绍一种比较适用于单片机通信的协议,数据以包的形式传送。数据包结构:
! F, ]9 H) h/ t* `  e) u0 f7 d& t3 ~( A. X7 _
+ y# {7 |# r/ x& v①包头——指示数据包的开始,有利于包完整性检测,有时可省略;! f/ V0 N/ i7 g; k( U5 W) d
3 s' G" f! a5 }" w9 d9 S8 f
* d) h$ L. V# T4 |- Q# x0 C②地址——数据包要传送的目标地址,若只有双机通信或硬件区分地址可以省略;. m9 [% F( H2 [! ?; \+ p/ @7 B9 u. g, R. e8 R& f

# j$ C, d0 f4 F$ _③包长度——指示整个数据包的长度;. }+ R/ M6 U3 Z2 L5 q
# k) S$ a3 K  A' p% Z( r
. H( g, O' f2 B; G5 a. |3 X  `1 {4 j+ ~; J
④命令——指示本数据包的作用;% z" D; ?+ I' Z# H  i

$ G/ e5 u1 p& o7 u) G; k% r0 k⑤参数——需要传送的数据与参数;4 M4 T7 X  e: z. k6 b1 H0 ~4 y% K9 }8 L- K" |$ i! E6 m
/ p( O$ u, j* W  k5 k; s6 w! }
4 \1 x, N+ i7 c" X, Q⑥校验——验证数据包的正确性,可以是和校验、异或校验、CRC校验等或者是它们的组合;. X( ^- ^- q' ]2 n2 c
" N3 ]9 ^3 d& V8 L4 c- B- }' i' ]
⑦包尾——指示数据包的结尾,有利于包完整性检测,有时可省略。) N* e& F" a% u) L. i
8 \; C2 Q0 v# d7 H  f1 E# F7 D; h% n2 ~/ _5 F9 ~# Z
9 Z" m2 C1 m. B. i& }4 ~
(4)通信流程" g$ V! T7 Y8 T, P% g1 S
首先,要在FRAM里划分好各个区域,各个单片机的参数区、数据接收区等。然后,单片机可以向另一个单片机发送数据包,发送完毕之后通过向握手线B发送1个脉冲通知对方取走数据;接收方读取数据并进行处理后,向FRAM内发送方的数据接收区写入回传数据或通信失败标志,再向握手线B发送1个脉冲回应发送方。: J0 @  R' ~- e* D$ l
- a% i( h" P7 r7 r- t- Q( D
8 X* E3 c! O  {; @* }; ~如果需要单片机2发送的话,只需交换一下操作过程即可。  A, |7 S% d' b: s
& i3 W, O  w! X& {  a" l$ U" A2 ?3 s- H; N7 U

8 w$ m1 J% Y) t( f$ t' L总结
+ M5 r, [( {) n6 M) ]8 I$ k通过实践可知,以上方法是可行的。与其它方法相比具有发下优点:  v- B/ H% M$ f6 u

8 m, i5 C" ~- d0 w; @# o0 t①简单。占用单片机口线少(SCL、SDA、握手线A、握手线B)。! X5 @0 _6 k9 A9 U* T6 e7 w* x
. Q( Z1 I5 z( A' x( m! m4 V! v- ^
②通用。软件模拟I2C主机方式,可以在任何种类的单片机之间通信。* N8 o) {7 |- F/ v2 M2 k. @6 c/ E
3 Y7 S4 L* F$ [: S! W- j
③高效。由于采用数据缓冲,可以在不同时钟频率、不同速度的单片机之间通信;读写数据时,可以I2C总线的最高速度进行,可以实现1次传送大量数据;在一个单片机向FRAM传送数据时,另一个单片机无须一一作出响应或等待,可以进行其它程序操作,提高软件工作效率。
) s( ^  L4 E# \' v$ I1 a( e6 {2 N4 f& Z1 H' z  C2 x
④灵活。通信硬件接口对于各个单片机是对等的,通过软件配置,每个单片机既可以根据需要主动发送通信,也可以只响应其它单片机的呼叫。
, ?+ e( a+ L* d8 [6 Q: g6 a9 ~4 c* `, I+ R) X* }# a% P
⑤容易扩展。通过增加地址识别线,修改通信协议,即可做到多机通信。' C5 ~$ w8 L( B$ m- p$ E8 q5 @0 B7 s/ c5 D
; F! C$ M2 l7 m3 V$ @2 I5 L! E  H/ h/ p+ u5 t+ Y
  b4 r6 L8 m! p0 n3 V6 _) m" P6 j
' {7 u9 S$ }; h以下是需要注意的地方:: y4 W' f2 c4 G  h9 @6 U
( `+ C1 D) e% g' }5 `% f+ B1 \4 y6 G
①为了提高通信效率,握手线B最好使用中断端口,负脉冲宽度一定要满足速度较低单片机中断信号要求。如果没有中断的话应增加1条口线,用改变端口状态的方法通知对方,等待对方查询,而不是负脉冲。' e/ L  D7 A/ K: X3 x( y! F& D
3 H+ J& u$ F9 \9 m' [
1 n, C- C0 i( I% I/ x  l②向对方发送负脉冲时,应屏蔽自己的中断。4 P- v" |2 L& P/ o2 I; V7 {
" N0 V1 m! K& @; q, u- k2 [" A6 j7 _7 z: {, d+ \
③由于参数与通信缓冲区同时设在同一片FRAM内,要避免对参数部分的误操作。一个较好的解决办法是把参数存放在地址的后半部分(A2=1),在进行通信操作时,把FRAM的WP引脚拉高(地址在后半部分的单元写保护),这样可以有效地防止测验时对参数区误操作。) p4 m# O/ u9 |1 d
# s) d9 ~( T# {% G: r6 f1 t; u" a1 k' ?8 H) r/ M
& N2 v+ b% e" [4 v5 n④由于I2C总线在一个时间段内只有1个主机和1个从机,所以当1个单片机正在写通信数据时,另一个单片机是不能对FRAM进行操作的。如果需要实时、频繁地读取FRAM中参数的话,请预先将参数读入RAM单元使用或另外增加专门存放参数的芯片。; F1 k, g, d  ^" T* d

  W' Q2 G. `: g+ E! C# {( S% T8 \: E6 `2 L7 f! ?" @# G$ C; }- P; I# |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 02:33 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表