|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
*在通信领域内,有两种数据通信方式:并行通信和串行通信*串口的数据传输是以串行方式进行的。串口在数据通信中,一次只传输一个比特的数据。2 K: o/ H1 t8 N* _6 m) l9 D
*串行数据的传输速度用bps或波特率来描述4 R5 n, U, q- k/ v9 e% V: l$ I
; T/ s: u$ j' a& ]/ n6 u. S【UART】. J9 p5 @% i+ ~0 Y! j% v
发送数据时,CPU将数据写入UART,UART按照一定的格式从一个管脚TxD上串口发出;
/ q- D- @ w% [: Y接受数据时,UART检测另一个管脚RxD上的信号,将串行数据放在缓冲区中,CPU即可读。2 z+ g) L1 b; n' A
(UART之间是以全双工方式传输数据)0 D- H5 r$ a9 I }4 C
# M. i! _/ z0 w4 }
UART使用标准TTL/CMOS逻辑电平表示数据
7 `) V4 l3 U; M7 }+ H' _) s$ m! w- f8 G*0-5v,0-3.3v,0-2.5v或0-1.8v
4 A; b; x' A# r/ v+ Y; w4 T1 ]*高电平表示1,低电平表示0
: b4 v$ s/ j% @8 ^$ O% y
, e0 ~" J- P+ g) h2 x但是在外围电平中,为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平。例如可使用电平转换芯片:MAX3232/ J- Y. Y- i" J( x6 _7 D4 a
RS-232逻辑电平(反逻辑)
. ~0 O0 t X8 N( p4 [3-12V:表示0
8 ~/ V8 }/ |7 Z0 |; b! o1 q+ R-3~-12V:表示1
3 B2 e& _7 A1 a- g
1 }- N# N) Q; W, t1 u- v传输数据前的准备(约定好波特率和传输格式)
- ~! f9 c$ e# w9 E! I*有多少个数据位
1 Z! v2 R5 w, W* W7 S3 g*是否使用校验位1 L2 f+ L) y2 i: b; O. D
*是奇校验还是偶校验
- a: s4 {- x8 v( r- g*有多少个停止位
" O+ j2 G: X% T3 P* F【奇校验/偶校验】5 v; I' @8 f9 m" L; b9 i0 X
奇校验:就是让原有数据数列中,(包括你要加上的一位)1的个数为奇数 ;/ t" M' }& z+ J( A3 R% T% T% q
1000110(0)你必须添0这样原来的3个1已经是奇数了所以添上0还是奇数 ;4 X- Y. e9 G+ T1 i# R
偶校验:就是让原有数据序列中,(包括你要加上的一位)1的个数为偶数 ;
& m) ~+ o' a4 }+ Z# G0 u1000110(1)你必须加1了这样原来的3个1已经是奇数了所以添上1还是奇数 ;: v8 X3 t3 R3 |. _: l
【停止位】: J: S/ H( C% [/ l% K# U5 @7 ]& H* `; E
有效帧之间的空闲位 ;6 `" f2 R6 T! {* }4 U" z$ A
% l* N+ U& Y! m' e5 Y' s【异步数据传输方式】
( Z2 o/ q& Z0 F8 ? i6 ^9 C
& r7 Q3 H, L% G! v1 H1 I& R, \! ]. @5 D) j+ c) E; r
发送数据时,SOC先讲数据写入发送FIFO中,然后UART会自动将FIFO的数据复制到发送移位器中,发送移位器将数据一位一位的发送到TxDn数据线上
$ S* B' g! |1 |% d6 p, F8 U5 _5 T9 A接受数据时,接收移位器将RxDn数据线上的数据一位一位的接收进来,然后复制到接受FIFO中,SOC即可从中读取数据
3 W8 C1 g6 z5 f9 H6 d# b8 ^ [1 F( K9 c' |$ A% p) q
【硬件流控制】
- I: T, D2 e; `& A*如果打开串口硬件流程控制后,串口A只有在nCTS被(串口B的nRTS)激活后才能把数据发送出去 ;
$ L3 d- B# `4 P |5 w& ?*当串口A可以接受数据时,激活nRTS,准备好接受数据2 ]- S( |: M% S3 O+ [" D
' @' J2 V2 l. d
3 J# M& m& X) I7 N; o【UBRDIVn】/ A* U% t: i4 n6 T
*在UART模块中有三个UART波特率除数因子寄存器UBRDIV0,UBRDIV1,UBRDIV2,存储在波特率除数寄存器UBRDIVn中的值用于决定波特率; o; n) D: A. k! Q3 ]
UBRDIVn = (int)(UART Clock / (buad rate*16))- 1
, o+ V* x# G: B) @- ?; t2 d
9 ]# K) G5 {! q& a$ O【ULCON】
& f/ G2 L! t, j3 |( `, _/ [" }# h- n: i# J1 X. ~' b0 ^( _- `. u6 [+ [
& s4 }: ~4 R+ Q( o+ ^5 U# N1 H& u【UCONn】(选择UART时钟源、设置UART中断方式)8 o* l9 c$ i7 I5 l3 B
7 V9 [7 V. ~# q# [
$ B U' S- H2 n/ _& R- x# h+ G
【UFCONn】(该寄存器用于设置是否使用FIFO,设置各个FIFO的触发深度)
5 [- d: v3 S8 ^7 S- K7 p1 r: E& W: i- ?5 L
【UTRSTATn寄存器】$ H/ h& f" L9 @6 L2 z
(用来表明数据是否已经被发送完毕,是否已经接收数据)
$ a: c* l; Z6 L3 }9 Q9 Z. _% E" v: h6 e2 z* J9 N! ^4 R
8 @! u5 Y3 ^7 z- q【UTXHn/URXHn】# S1 n5 R2 o: U9 \- m8 h
UTXHn寄存器:SOC将数据写入这个寄存器,UART会将它保存到发送位移寄存器中,并自动发送出去7 l2 Q. _2 T: U
URXHn寄存器:当UART收到数据时,SOC读取这个寄存器,即可获得数据
) u `4 o- A) H
6 z' k1 T5 |2 }2 C. s( |7 ]' c/ b/ ~4 c+ s) z0 e3 K" ?. H
$ k M& [" k9 W' t9 A& e# s( A4 s) v! i: z
2 A# U( [2 I! G! _1 K; l. r2 u% v
( `! p. Y; p- v: d v$ y |
|