|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
/ \! r1 i7 h* |( F1 b' W一、SCI 简介( p+ t4 u% B) k. n( ~: ]
SCI(Serial Communication InteRFace)意为"串行通信接口",是相对于并行通信的,是串行通信技术的一种总称,最早由 Motorola 公司提出的。它是一种通用异步通信接口 UART,与 MCS‐51 的异步通信功能基本相同。(以上内容来自百度)! N& u& X' z4 I+ T
% I2 [8 \! x2 ~$ A3 b# V二、28379D 的 SCI 模块简介/ l+ P3 t, `9 I8 C
2.1 模块功能7 S! C7 N" Y. |6 K5 F' ~; C. G
基本就是 UART,数据格式可编程。28398D 的 SCI 和其他 28 系列的产品基本一样,有两个增强功能。一个是发送和接收缓冲,FIFO。如果启用了发送 FIFO,就可以将要发送的字节先储存在发送 FIFO 里,待发送 FIFO 里的字节数达到设置的上限后,再一起发送出去。如果启用了接收 FIFO,就可以将接收的字节先存在接收 FIFO 里,待接收 FIFO 里的字节数达到设置的上限后,再产生中断来处理接收的数据。另一个是波特率自动检测功能,这个一般不用。
2 @+ H9 j( D: O+ \" m0 G% a( c
# r- ]3 w |' t$ M* u( }
1 B. V! G3 o e: G' ^1 F& U8 Q2.2 28379D 的 SCI 模块引脚
$ C: ?! A" G8 J: _9 n28379D 有 4 个 SCI,即 SCIA,SCIB,SCIC,SCID。每个 SCI 的发送引脚和接收引脚都有很多个,如下表:
: E! ]4 q7 M6 I' u8 l5 E( _& o9 F j5 s1 R) h- U% @ h4 i2 }
三、SCI 配置步骤
! j( E* s0 G8 m3 K3.1 配置 GPIO: s: L7 x8 f) t: {, k
配置相应的 GPIO 为 SCIx 的复用引脚。2 k% M- {) I* k2 Z
8 V5 ^1 C9 ]- b" R! _( o! W
( W$ L* J# d% H, L- L3 g$ s; k& U3.2 配置 SCI 的数据格式: {5 K. A/ C; K4 d# {% ?
配置发送和接收的数据格式,一般是:1 位停止位,无奇偶校验,无回环,空闲线模式(两个对象之间通讯,如果是三个及以上,得用地址线模式),8 位数据位。
3 r! U$ A! \, Z8 Y5 h) J; N
. R: ` j( |+ h1 Q E- S: k7 w8 h5 Z7 ~, w5 U; c
3.3 配置波特率! i& t) ^6 c h8 n
配置波特率,不多说。" [# N. f/ q- U) X3 Q/ e; Q
& Y% F! F( Y8 P+ k" O4 w1 T
1 x, m8 Y% w, U3 |: P
3.4 配置 FIFO, g/ L9 N4 R0 V* d
首先得使能 FIFO,然后根据需要,进行配置。比如使能接收 FIFO 中断,设置 FIFO 的级数,基本的就这些。还可以配置波特率自检的一些设置,不过一般不用。. a s2 q1 ]! [
% ^, k6 O1 n0 c( V' k. B- z! {! Q; _
- l- S; M) d* B% l. W- v: L3.5 使能 SCI
% [/ \- I0 u0 u5 u复位一些标志,比如 SCICTL1 寄存器的 SWRESET,必须被置 1,等等。
' z# c" p# k! T; x! {$ q1 v9 i7 l s
P2 R; C, f4 ~" y8 K
/ W! A8 h8 ~3 r0 z$ \; s3.6 配置 PIE
0 P. D- M" h4 H0 G# U- E, @9 }/ \首先使能 PIE,然后修改 PIE 向量表,然后使能对应的 PIE,以及 CPU 中断。. ^; C3 t+ @9 x3 }" ~6 G# A. b
9 }& S; ]+ {( B2 e# J. n# M& O6 C
& n7 J& F- D" A
四、代码示例& K$ z9 p* Q9 \+ o* v7 |* Z/ u* W
示例使用了 SCIB,引脚使用 GPIO18 为 Tx,GPIO19 为 Rx。
4 U' X, h6 o+ W4.1 配置 GPIO+ `: w6 g0 w: F+ `
) \# X E1 _6 i: NEALLOW;5 U! p0 L: O( S( S. k$ n( X2 Q
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;//开启上拉电阻
. x: U6 P: e/ U) s! ]' I! b GpioCtrlRegs.GPAPUD.bit.GPIO19=0;//开启上拉电阻$ }% \# |6 C& G# B, d0 C- d. {. m
GpioCtrlRegs.GPADIR.bit.GPIO19=0;, k: M, Q( N: L( R" |
GpioCtrlRegs.GPADIR.bit.GPIO18=1;7 o2 R7 ` _) C1 y/ @: j
GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;
0 r8 D- V) J; u* L) j1 Z( v# u GpioCtrlRegs.GPAGMUX2.bit.GPIO19=0;& q$ z- N# {4 f5 _" L4 X! u
GpioCtrlRegs.GPAMUX2.bit.GPIO18=2;//复用为 SCIB 的输出
( P: x% P8 B! F9 N* r) t* _6 f GpioCtrlRegs.GPAMUX2.bit.GPIO19=2;//复用为 SCIB 的输入
. h5 C0 m h$ D5 v9 h* L) x" CEDIS;
: v7 j" l8 S) O' k7 K9 X4 R0 v8 o- g) I) {4 q0 c
4.2 配置数据格式4 H: F; r: w5 r" x' m3 t
( r0 n z, z* m' {5 }7 t
ScibRegs.SCICCR.all = 0x0007;//1 位停止位,无奇偶校验,无回环测试,空闲线模式,8 位数据位
1 S/ h" w# u: a# u% d8 J( B/ E; a+ I& B) L. S* ]: \: \0 @3 @# M) U
4.3 配置波特率
! g. ]6 t% I1 j6 C! ]1 A& l- c' \' O. g4 q
ScibRegs.SCIHBAUD.bit.BAUD=0x0000;//波特率 115200$ ~6 U# d, h9 t, r" r6 a, k
ScibRegs.SCILBAUD.bit.BAUD=0x0036;//波特率 115200/ W" W+ N* b" s' Q* X* \
( {9 ]+ f m3 L% v* S4.4 配置 FIFO
' V' P9 N2 W ]- U/ D* ?9 M" }
: j$ t& p4 W: I* v+ vScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能 FIFO8 ^4 B+ v* w8 Q* B9 b) W9 S7 V% k
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;//使能 FIFO 接收中断
7 r. o. H, o" d: J0 g- RScibRegs.SCIFFRX.bit.RXFFIL=1;//FIFO 接收字节 1) `. m$ q' p9 L! _
ScibRegs.SCIFFCT.all = 0x0;" j; d. c1 N% o. k4 V( S/ ~- b
: D' K+ S. q. c4.5 重新使能 SCI: z$ E& i( J8 O0 V
: |/ {+ b0 l; X7 {2 B- oScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset 重启sci
* o9 ~. H+ ^4 N+ D+ Y, o6 p2 l; D; |
4.6 配置 PIE
; n8 A8 F( A+ U% ^1 z# p2 s1 z6 l# s6 C) _0 t8 C. J* J
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能 PIE
' `& K0 U7 Y/ H4 h% Z! bEALLOW;3 s9 j. T5 h7 T9 V6 x, n. g# |
PieVectTable.SCIB_RX_INT=&ScibInterrupt;//修改中断向量表
3 G" E1 W7 B/ ]- u+ [/ rEDIS;; \, k" a; B: O& T+ v! i
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能 PIE 中断' T3 F* r6 U* C9 c1 _1 E
IER |= M_INT9;//使能 CPU 中断* H- i! [' ]/ r, k6 o8 W
+ H* v7 R; u+ k+ S* l {$ H6 K0 P1 [
4.7 接收中断函数 ScibInterrupt 如下:
0 b- I5 B/ E. q! o9 r9 A8 p
2 |6 T o, K( Q$ Cinterrupt void ScibInterrupt(void)
3 U4 J' i4 [$ o5 H0 a+ S0 W{* Q! Y0 J- t7 L/ o0 k# B. C( w5 L% |
int i=0,data;3 h' m, b/ @# u0 a3 _. |
for(i=0;i<ScibLegnth;i++)6 A7 T) ^) W' [4 N' H
{: \) V9 N* P8 ~/ e0 {* g+ g
data=ScibRegs.SCIRXBUF.bit.SAR;//接收的数据
- b3 i# A% C9 ]/ R B E2 g }
; v3 ~# J7 S$ }8 h" y ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // 清接收中断标志, F0 @* l: u7 c1 q8 m- V2 T
PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;// 清接收中断标志5 \: Z5 v3 M5 A3 O5 x; v
}5 V& h; f) i# M- _0 c8 e3 F
1 }7 [, U9 o/ h* A( o$ x$ d
( _: M3 b/ t, d8 t4.8 发射函数3 V4 C: s8 `2 A5 R$ q1 D. u
3 I( W+ K# i& s, M5 |
9 M4 \. q i' @int ScibSend(int data)$ x) L( g1 Z @* g- A+ M
{
9 I' `6 o* d i5 u% z9 [ while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}
& c- Y- l1 S8 x _ ScibRegs.SCITXBUF.bit.TXDT=0x06;, y& ?& ?5 n' P/ y6 g3 \8 U
return 0;. H* y5 A8 a4 \3 @+ a. n" E' t7 e
}7 r, N) _, u# H# F* p. p* z
; r: `& a* p7 x% R& X0 D6 A$ R/ E
7 E& S0 y% K7 Q/ \+ b |
|