EDA365电子工程师网

标题: 写一个UART控制器 有啥好的参考手册与资料吗 [打印本页]

作者: mengzhuhao    时间: 2008-12-2 15:32
标题: 写一个UART控制器 有啥好的参考手册与资料吗
写一个UART控制器 有啥好的参考手册与资料吗
$ O4 ^3 o# S. ?* \* Y, g那位清楚呢 % y4 e3 M9 n" B4 w) [8 ^% l
大家写这个控制器的时候都看那些资料
作者: mengzhuhao    时间: 2008-12-2 22:30
大家写UART控制器都参考那些文档与设计?
9 g% y4 ~7 G, M, s4 ~
9 r. r9 ~* U7 Y+ ~2 j. Y7 U* v
+ Z/ F- U7 }2 L9 Z我想知道下面这些在uart里面是如何做到的呢?
, N! h4 g* b, R* ], N2 R$ Z7 V# T(假如有个工作的uart模块), }0 z- x" C: H9 c, i6 o  Y
1、pc与该模块通过串口连接后,pc如何发出控制指令,然后模块在识别命令后再去按步骤接收或发送数据到本地或pc4 j0 R5 v9 N5 r
2、在模块不知道pc发来的数据波特率是多少的情况下是如何去定义识别波特率的呢
! h! I4 E/ m& e( e0 R* ^3 k3、通过pc与模块的串口传输关系如何发图片或其他文件到开发板的指定存储器
  ^' p( h1 q1 s& z* `! y
4 y" D. ^7 S' ]7 H有啥比较详细的规则资料讲这些吗?
作者: shen    时间: 2008-12-3 11:23
标题: 我帮你说说吧,只是想什么说什么,准确性打个折扣的
UART没有你想象中那么功能强,它是一个定义,定义大家(PC或单片机或模块)通信时共用的准则。; b* i4 e- `: X: U, b' \
2 C( D9 y/ H* C2 f! [: M
像PC用UART吧,其要打开COMn,打开时,原先是有默认值的,默认是多少可以通过:我的电脑/右键/属性/硬件/设备管理器/端口/COMn/双击/端口设置,来查看。
$ _# R7 a+ r4 _4 v. L6 j  N( v5 a  x) T9 E' p% }
打开后,设备就会去监听接收端点(理解就行,名词不是这样的),当有信号时,就收下来,并发出有信号接收到的标置。当有标志,处理器就处理啦。
! i. ^& u% B/ o+ m. j5 o2 S& ^" h7 N; M8 D  F0 g5 z
发送同样,当发送完成后,设备就标完成标志。* H( s7 j- |. n; X' R- c
) v1 u. }" h5 b4 F- \8 j# j4 u
而有信号,什么叫有信号呢,这就要看UART的传输中的电平了,大家可以接RS232的资料来看看,RS232和UART的区别是一个是+ -15V,一个是5V,电平不一样。' Y( U( W! y5 n3 f

9 u( l: j* d, F9 }4 R9 z2 K8 dRS232平时没有信号传输时,是-9V的(理论该-15V,呵呵,实际与理论有点出入的),收接脚是高阻,收接脚如果和另一端设备接起来时,会由另一端设备拉到-9V。
- D$ L, b) G. w/ E9 G
- N0 _9 f( s. f% [3 ]当有信号时,其就会跳到0V以上,从而有别与-9V,这是第一位,叫起始位,后面接着8位数据,如果有校检就跟着是校检位,最后是结束位。, G1 [) ~7 k1 r; E- X; _4 z& r# q' X

7 r: \! T" L  R& p0 R# r1 E如何去测定波特率呢,就从这里入手了,把传输数据,噢,该是信号线上数据变为10101010,这样,去测量两位间的时间,从而求出波特率。, T1 E7 M; S  i$ @
8 I. z# N6 e, L
传输中,到底发送了什么数据,接收了什么数据,串口设备不会过问的。
作者: mengzhuhao    时间: 2008-12-4 20:24
我想了解的就是:
5 S) h" f4 q! T2 M$ ?  C0 j( ]; a
虽然rs232是按照固定格式传数据的
! t$ V& {- \0 V$ p, B
5 r$ N0 B$ S+ z3 H但是用rx,tx这两个接口2 ?3 m( x) F3 f5 U- \5 i

5 b9 V/ T* M% B* O- L如何实现交互控制?" a; ]4 s0 W& K6 Z2 e+ H* L
2 P. X; _' L& G# s/ R
是不是需要pc编写一个控制器界面的软件?
2 l' [, o/ C1 k$ ?
$ ]3 N& J+ E1 M" F. l1 U4 ~例如通过这个界面loda数据的时候 1 O' ]+ [, I% b6 q- N5 m

5 @6 Z" O$ r/ X1 p3 L8 C它大概要通过一些什么步骤后 然后作为接收端的控制器开始接收数据?" L0 w; z6 Z- A' c5 y/ A

. Z# R6 H0 A, G% c1 ?7 T/ o1 L7 G

; B. q2 u0 ]; P2 {( o- k是不是可以这样理解:
5 n. U1 Z/ B& E6 R% j
5 ~  T! e: _: b3 N4 A: L3 C, |首先pc先不断发送默认的某种指令信号 直到接收端控制器反馈(也不知道这种指令应该如何定义?)
6 R# z/ G4 p7 G5 t* z) r3 Y) D2 p
接收端连续接收到这个指令后再发送给pc一个特定指令 以表示我知道你想load数据了- b! Q' P+ r6 F" E" b

2 j( `+ d5 p* n2 L3 q: T/ P然后pc停止发指令
3 w$ ^, B5 C0 X" q$ b2 s9 _1 u+ T" L8 ?( l0 D
接下拉就开始发数据了
: r6 |* ~4 p. R, T+ i0 b. g6 S' c7 B3 u$ T
然后数据是一组一组地发
( N/ l3 k$ u5 d) J  e; a. \2 `5 Y& R. ?: p2 _, d+ J! w
控制器一组一组接收
* C/ \5 G  j$ m# y- q
) M% b+ Q, |' n( X" G1 L2 Z5 v. t+ B( b& }# A& B+ i+ O

/ v3 R! o5 c9 G& _
+ D, B/ i( L% y- ^/ ?8 e  {. R# y% e5 ?; D- N
那位高手熟悉可以给讲讲大概的设计思路应该如何比较好?
作者: shen    时间: 2008-12-5 14:00
如何理解交互控制的意思呢?
* {% A/ V* o& c6 T2 \$ c  e- q是需要pc编写一个控制器界面的软件的。基本上和你理解的一样。
5 r7 ~3 e5 z2 I' d2 Q( e4 n3 B如果PC发数据到设备上,不就几个步骤:
7 `; z+ s3 R6 P' \1,设置波特率
+ {3 l* N, a$ V8 O2 t2,打开串口
; O- h, V; }  @- `! Y3,发送个握手信号
( F) V  T* J& p; o3 ~4,等待设备回复握手信号
! r4 l( ^3 S6 Z- V5,发数据,数据可包括很多内容了,如信息头,要传输数据内容。信息头,用来传输用的。如果数据量较大,那就分包发送。如何分就自己订了。
7 Y( {% I5 i3 L: i2 Y2 j6,等待设备的回复,这里可以做校验什么什么的。如果分包发送,就是发一包,收回复,再发一包,再收回复,再……再……这样下去。" y/ D! J! g5 m. b2 _2 ?
7,结束时,发个表示结束的数据,然后大家可以关闭通信了。% B" }6 X0 B4 f

" s: v- H. [1 ]! i1 ]! n如果不是很了解,建议找本网络通信,哦是数据通信的书看看。这个东西三句两语也很难说清的。
作者: shen    时间: 2008-12-5 14:16
看了看,发觉我真的误人了。
$ M9 E* b' }4 @8 a% R6 n/ p
: }, }+ P! z* _* G" M一般通信是这样的,是分层结构的,和你寄快递一样,7 ]# Y) n8 U' r
PC软件告诉串口设备,我要发送什么数据,然后就交给串口设备处理了。. ?' B) t8 ^) x
快递也一样,一个电话把快递叫来,告诉他收件地址,就发过去了。不用理会到底是用火车,汽车,还是船。" T/ @$ W* |9 ^# x0 r. J
如果是接收呢,一是问收到什么没有,另一方法是如果其收到什么就告诉我。
* V8 P/ G1 J9 u5 r/ J+ k/ {* d. J, ~2 n& F3 W! [
设备那边也差不多一样啦。
! h1 J: I  W0 ^3 q! r还有就是标准的串口通信是定好大家的通信波特率是多少,有没有校验,是奇校验还是偶校验,数据是多少位等等,是定好的。
0 l$ T2 ?+ I. f+ f7 |3 W4 B: c; S( p
3 _! J% D2 E1 `当然,这是说标准,但后来,因为速度要求快了,大家用的速度越来越快,结果出现了一个现象,就是一设备能上这么高速,但对方不支持。但又想用最快的,所以才出现个变速度(波特率之说)。变波特率如何做,那就看你如何处理了,建议不算熟悉时,还是先不要搞这个。
作者: mengzhuhao    时间: 2008-12-5 17:14
原帖由 shen 于 2008-12-5 14:00 发表 4 j9 U; r( f3 N' X2 d% _# }
如何理解交互控制的意思呢?; s8 Z# g; L! }/ h1 H
是需要pc编写一个控制器界面的软件的。基本上和你理解的一样。2 }- C" ]$ `5 {' @/ t
如果PC发数据到设备上,不就几个步骤:+ b6 ^, V* x1 Z! P- U
1,设置波特率) I+ }+ d( Q# M% r
2,打开串口
$ u/ F) ~, r4 ?: |4 G3,发送个握手信号
' v8 C/ v& i' L3 h' k8 T4,等待设备回复握手信号8 D' ^3 {4 w' W: h. m
5, ...

' c1 t8 F- e" e/ i) Y  Q* J0 o2 s$ w( ?
兄弟很强悍啊
& {- B$ `/ ~8 U, w/ U: g- k/ k# I5 a( ~
是不是可以这样理解:( z( X" v$ Q. L7 z( l: d: r
设置一个状态机/ k1 K1 H) @  M6 j  p) E: L8 L
上电之后首先等待pc发指令确认波特率(这个状态下只识别指定的数据01010101)由此检测确定分频因子2 I, Z! }4 m: [$ v( l( [
波特率设置初始化结束跳转状态到等待状态
8 T% [8 h. n9 m) l. P" U这个时候按照约定 也是只能接受指定指令(例如接受来自pc的数据指令 )
7 o; J9 O7 C2 \9 `" `* ipc发命令说我要给你传数据了 你准备好没有& [8 A/ B% ?, B2 S% j& A* U5 M+ K1 }
控制器在识别到这个指令再应答给pc一个指令(也是约定好的指定格式数据)# h3 v) D: \) l: n8 O: G
通过这个握手操作后
: A8 V. T5 P  M* W4 |/ c' J. w控制器再跳转到接受数据状态下5 }6 v# y. A- R% F6 ]; D
开始一组一组接收来自pc发来的数据' O6 a! z* x* a( j3 A1 d* U

) D& W7 ]6 u2 \* Q5 l8 x第一组数据是约定的其实数据(约定的指定格式,以让控制器指定开始传数据了)( U. w$ a8 u% Q! j9 ~) X5 z
第二组数据是后续所传数据包的数量是多少,控制器以此控制计数器计数
' d- Z+ W6 K, a" A# Q) n& T8 \3 t) d第三组正式开始接受数据  Z- W, U5 r0 j: v
接收完毕后 计数器满足之前设定的数量后等待pc会再发一个指定结束指令
1 d9 m- L; D7 v& x' i* R0 I% S然后退出接受状态3 Z; E+ u- b8 |% q
返回正常状态" }! k1 ^- b8 F6 ^) b( L
3 u6 A9 l6 q( S8 G4 F9 _: I; h
4 [* j% b% b  W8 @
多指点啊
作者: shen    时间: 2008-12-6 10:59
楼上你理解很强呢!你说的这样做完全可以实现。" [' c; f( ~: F  j9 Q& L' ?
不过,提点问题就是:你可以保证你传的数据没错吗?也就是数据完整地送到对方。
0 u- }5 }6 A6 ]- I& c别人可以做到自动改正错误呢,例如用CRC校验。不过可以降低点要求,当出错时,知道出错就可以了。' O' l2 e, I. V, }
如果知道出错,那再发一次不就一样可以完整的数据传输。
作者: marshal_li    时间: 2009-3-17 15:30
学习了




欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2