|
经常遇到初学者,对单片机串行通讯出了问题不知道如何办的情况。其实最有效的调试方法是用示波器观察收发数据的波形。通过观察波形可以确定以下情况: 是否有数据接收或发送; 数据是否正确; 波特率是否正确;一、串行数据的格式% |4 d1 _. T" y# s4 A
异步串行数据的一般格式是:起始位+数据位+停止位,其中起始位1 位,数据位可以是5、6、7、8位,停止位可以是1、1.5、2位。% t# E0 }9 V; [7 g
起始位是一个值为0的位,所以对于正逻辑的TTL电平,起始位是一位时间的低电平;停止位是值为1的位,所以对于正逻辑的TTL电平,停止位是高电平。对于负逻辑(如RS-232电平)则相反。' g+ {" ~: o2 ~8 h5 @/ Z2 ^; r
例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。 # ~ c" O8 i, i* ]
V, ~! o+ _- {3 L: F, `图1 TTL电平的串行数据帧格式(55aah) e/ @' w5 Q) a" S1 W/ ]+ s2 T
/ X3 P& E6 \1 r' m8 [" G/ R L
图2 RS-232电平的串行数据帧格式(55aah)
: F& d: N. w4 ?! C+ p. }& O二、根据波形图计算波特率
7 I3 \$ h3 l8 W# \9 S1 |如图3是图1在示波器中的显示示意,其中灰色线是示波器的时间分度线,此时假设是200ms/格。
/ l; s+ C$ y$ k3 f
: }# a0 W$ K) `! V$ y+ [
图3 波特率计算示意图
0 T- n, N& k( j+ l1 W' n2 n, A" T 可以看了,第一个字节的10位(1位起始位,8位数据位和1位停止位)共占约1.05ms,这样可计算出其波特率约为:2 E% C7 |9 D. z! J" r1 g
10bit / 1.05ms X 1000 ≈ 9600 bit/s5 t5 I ]) }) d6 a6 P# v1 U
如果上图中的时间轴是100ms/格,同样可以计算出波特率应是19200bit/s。. j9 D. m" J( R3 h0 x7 H
当通讯不正常,又能观察到波形时,就可根据上述方法,从波形图计算一下波特率是否正确。, y0 u7 L4 L6 Z- Q$ S
三、根据波形图判断RS-485收发数据的正确与否
6 z$ K3 Z5 Y9 j0 e: i, {% L/ ` RS-485是一种半双工的串行通讯方式,485电平芯片所以要正确接收和发送数据,必需保证控制信号和数据的同步,否则要么发送数据丢失,要么接收数据可能丢失。, ?0 ~0 \* R8 a0 b
RS-485发送数据时的正确时序如图4所示。
4 W* l; k I' I* [8 t
. E0 E1 \' }7 I t$ [图4 RS-485的正确发送数据时序 3 P& ?6 Z3 R# v
在图4中,发送控制信号的宽度基本与数据信号的宽度一致,所以能保证发送数据的正确和发送后及时转为接收。 + x) K6 |3 z" ]" U
图5 和图6 分别是控制信号太短和控制信号太长的情况。
r' J; g( U' U4 s5 n: f4 B
, l) x G1 ^" e U) F0 i/ O4 l图5 RS-485控制信号太短时的时序
$ [, a8 Y$ C1 w! r) p
/ Q* V4 i6 `. g) k
图6 RS-485控制信号太短时的时序 [6 |. D* {6 f
在图5中,由于控制信号关闭过早,则第二个字节的后两位将发送错误;在图6中,由于控制信号关闭过迟,使485芯片在发送数据后,不能及时转到接收状态,此时总线若有数据过来,则本单元将不能正确接收。
" ]) c# n3 V0 u4 I 总结:只要掌握上述波形分析方法,任何异步串行数据的接收和发送问题,基本都可以得到解决。 |
|