|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. g5 ~2 r% K# z! g$ D5 O一、SCI 简介 |+ h! t5 _: ]3 f c, O
SCI(Serial Communication InteRFace)意为"串行通信接口",是相对于并行通信的,是串行通信技术的一种总称,最早由 Motorola 公司提出的。它是一种通用异步通信接口 UART,与 MCS‐51 的异步通信功能基本相同。(以上内容来自百度)
9 H7 d+ [- |1 f: L7 l0 q2 n s2 b' Q0 ^( I/ {4 E9 _9 }4 Z
二、28379D 的 SCI 模块简介
4 y2 z7 ]3 _1 ]6 U- N6 A& I2.1 模块功能
( ^" j% i' F/ A# u6 f0 \* |基本就是 UART,数据格式可编程。28398D 的 SCI 和其他 28 系列的产品基本一样,有两个增强功能。一个是发送和接收缓冲,FIFO。如果启用了发送 FIFO,就可以将要发送的字节先储存在发送 FIFO 里,待发送 FIFO 里的字节数达到设置的上限后,再一起发送出去。如果启用了接收 FIFO,就可以将接收的字节先存在接收 FIFO 里,待接收 FIFO 里的字节数达到设置的上限后,再产生中断来处理接收的数据。另一个是波特率自动检测功能,这个一般不用。
' S, Z0 r6 B. S6 `( F
4 m3 D. k* q) o) e& `0 I% z2 ~0 ?- O; |$ B+ @
2.2 28379D 的 SCI 模块引脚3 O8 @; a! {3 Y2 G1 p, T
28379D 有 4 个 SCI,即 SCIA,SCIB,SCIC,SCID。每个 SCI 的发送引脚和接收引脚都有很多个,如下表:
" t4 D/ p X( [6 p5 {0 \6 V+ P/ O( r; i7 M6 S
三、SCI 配置步骤
7 ?. c6 G+ ^/ ~; C& |" f3.1 配置 GPIO- ~; s& o5 B% r! l X) r
配置相应的 GPIO 为 SCIx 的复用引脚。5 C( N+ _, P3 A( {* a+ {
0 h3 J' d y& E4 b) T% @
0 F! K8 n, E b7 Y- q/ a
3.2 配置 SCI 的数据格式
# G1 u- Z) X- ~配置发送和接收的数据格式,一般是:1 位停止位,无奇偶校验,无回环,空闲线模式(两个对象之间通讯,如果是三个及以上,得用地址线模式),8 位数据位。9 t1 A9 b! Y! Q. v% s! o$ s
( K6 V4 G \5 q" D* c8 w
5 v- Z b- m( C4 c
3.3 配置波特率
9 ]; ^: b ?' B配置波特率,不多说。
+ A9 S. R7 l3 J Q9 O! A6 d& t+ q1 e3 o: @ A1 A2 }, u8 e
E$ U9 n/ S7 ~( Z
3.4 配置 FIFO
5 Q6 }% c$ k3 }6 e3 E, v首先得使能 FIFO,然后根据需要,进行配置。比如使能接收 FIFO 中断,设置 FIFO 的级数,基本的就这些。还可以配置波特率自检的一些设置,不过一般不用。; L7 n& t4 d6 B4 V: u
# m% t2 G; Y1 D7 A' r2 e5 m+ T) g8 ^) J4 L) L
3.5 使能 SCI* w" }- d2 u* W
复位一些标志,比如 SCICTL1 寄存器的 SWRESET,必须被置 1,等等。7 a* E: M$ s% W4 {, D3 v# P
: u- {) J, R9 @" z7 E+ o6 ^/ h/ W8 }9 W) L/ m% W
3.6 配置 PIE+ w, K1 L" G: \! h/ v' a0 j
首先使能 PIE,然后修改 PIE 向量表,然后使能对应的 PIE,以及 CPU 中断。! E: I9 u: v+ F6 ]/ a9 q
, g3 |1 `, L0 u5 O- }
/ o8 ]' e# f" a0 S四、代码示例
& b4 E2 ?2 L: g7 x; U示例使用了 SCIB,引脚使用 GPIO18 为 Tx,GPIO19 为 Rx。
) ^) a2 e, k: l: K4.1 配置 GPIO
6 O9 |/ L# S( D# H5 a9 p7 ^: O1 q2 h4 Z: {: T" I$ A+ c
EALLOW;% @; _ D+ h0 T
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;//开启上拉电阻: X2 M; `0 u' M( o+ ~$ K+ X
GpioCtrlRegs.GPAPUD.bit.GPIO19=0;//开启上拉电阻
2 ~: k2 i) k! E! Q GpioCtrlRegs.GPADIR.bit.GPIO19=0;; r7 ^- y0 c7 l, h( T5 H8 K
GpioCtrlRegs.GPADIR.bit.GPIO18=1;# f) j% L& {9 [8 w$ k/ X
GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;
: f' \/ N! q" e% N) } GpioCtrlRegs.GPAGMUX2.bit.GPIO19=0;; e! y3 P* _4 t$ J- V! o L' b3 D1 c
GpioCtrlRegs.GPAMUX2.bit.GPIO18=2;//复用为 SCIB 的输出
5 n% U: F2 g# ?$ K% U% s# Q: i GpioCtrlRegs.GPAMUX2.bit.GPIO19=2;//复用为 SCIB 的输入
/ B! Q6 N5 ^) R+ ~" L- tEDIS;
4 X& }& U1 Y9 k( |0 e
; J; ?# b/ n7 M) z1 u4.2 配置数据格式1 x. `" ]. O, M) l
# [( i$ \6 [/ [/ o4 }- o# c* h- pScibRegs.SCICCR.all = 0x0007;//1 位停止位,无奇偶校验,无回环测试,空闲线模式,8 位数据位
) B. ?$ F1 {# y c5 j& V) h) w; {# R, b8 S+ S. X# A& f% P
4.3 配置波特率! a2 F/ s$ q9 r. ?: O; g
2 E+ x1 g' G" o7 E: m! y
ScibRegs.SCIHBAUD.bit.BAUD=0x0000;//波特率 1152002 A( O4 U! m7 g' _# x% w: S% L
ScibRegs.SCILBAUD.bit.BAUD=0x0036;//波特率 1152007 u! g* B H& I# g
& B+ V4 v( f6 y$ h/ H
4.4 配置 FIFO
5 x( p4 E% i6 Q0 E. e( l! f: y$ {7 t$ n$ S
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能 FIFO" u1 u: v6 x+ E; g
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;//使能 FIFO 接收中断) t/ j V+ E1 {% |, y& X) x$ ^
ScibRegs.SCIFFRX.bit.RXFFIL=1;//FIFO 接收字节 1! O5 M" o, q: s# T! n
ScibRegs.SCIFFCT.all = 0x0;
8 g1 f! F' x* n. N* ]* @) {' d. V0 ]
4.5 重新使能 SCI
& e* l6 _+ d- w- }0 d
. i \" w$ G! }) d; n% {' U( QScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset 重启sci' S: v+ P: ?% E' t
" c9 [' u& N7 [7 w
4.6 配置 PIE v- F1 y: e: O2 _1 \8 I1 A
3 d& H& U1 m6 ^* K
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能 PIE" I: ^! d: _7 R
EALLOW;
- a0 q4 `. V/ q8 P$ OPieVectTable.SCIB_RX_INT=&ScibInterrupt;//修改中断向量表
. b6 [2 c' h l4 rEDIS;
* Q! w' m9 c& [$ w! Q( H6 IPieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能 PIE 中断
# q- B }% J% |! b" D1 h7 k9 TIER |= M_INT9;//使能 CPU 中断
; n% q% E1 h& e0 M
" E" s" o2 H* P3 l8 n$ B0 t. U- m7 Z
4.7 接收中断函数 ScibInterrupt 如下:, d; n x! N# }5 s: g/ B+ E
$ E1 G* d) [. F4 z0 w
interrupt void ScibInterrupt(void)
7 G" O$ s" w- z# F{+ }, z9 o+ |: r5 T& ^
int i=0,data;3 T7 U2 L; Y3 t( n2 i3 J
for(i=0;i<ScibLegnth;i++)4 }8 f4 H7 n; G2 C# u6 i( z
{! R9 }' L9 V3 E* t/ q/ s
data=ScibRegs.SCIRXBUF.bit.SAR;//接收的数据
* r7 ~2 _3 J6 ^2 ^3 I }, U4 d9 Z) y( T
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // 清接收中断标志
' S# K& q% P0 u% p/ I$ {. E+ x* t PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;// 清接收中断标志
Y" }! B7 @4 n. r+ S2 U2 j* F% C}
( {* g8 A: u1 `+ B/ N: P* s
$ b% A& P$ u5 u$ C) c' a6 P* A( w: Y* J( o- j5 E7 |
4.8 发射函数9 m$ B/ m( H1 Q4 z t9 P
# _1 m! e/ V0 G7 @: B2 @( J$ n( k- V- L8 U% r6 y
int ScibSend(int data)+ a/ j) u& }) R8 o: z& F
{' _% ?( u/ a4 k5 v! A
while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}/ N6 h& {! G, }+ c' e, t2 U% I9 u
ScibRegs.SCITXBUF.bit.TXDT=0x06;8 i4 n, {6 w/ F% ?" m
return 0;5 W% A: R$ R+ y, B% d
}4 @6 ~" [; E+ ]4 D4 E
& ^; K: S2 }$ n# M6 o6 y0 I! S& y3 O# w$ M
|
|