|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) s4 R5 }8 d1 l
一、SCI 简介$ e7 ]. z. E+ r( _# L. F' j- v7 l
SCI(Serial Communication InteRFace)意为"串行通信接口",是相对于并行通信的,是串行通信技术的一种总称,最早由 Motorola 公司提出的。它是一种通用异步通信接口 UART,与 MCS‐51 的异步通信功能基本相同。(以上内容来自百度), ]. s9 t: G K9 t0 b
/ h' h1 l* e. L1 M/ J2 Z二、28379D 的 SCI 模块简介, z8 Q. V# K! v8 B; m5 E4 J
2.1 模块功能
+ O2 D3 n+ Z, ]0 `4 I; b基本就是 UART,数据格式可编程。28398D 的 SCI 和其他 28 系列的产品基本一样,有两个增强功能。一个是发送和接收缓冲,FIFO。如果启用了发送 FIFO,就可以将要发送的字节先储存在发送 FIFO 里,待发送 FIFO 里的字节数达到设置的上限后,再一起发送出去。如果启用了接收 FIFO,就可以将接收的字节先存在接收 FIFO 里,待接收 FIFO 里的字节数达到设置的上限后,再产生中断来处理接收的数据。另一个是波特率自动检测功能,这个一般不用。; U3 c- ]7 }4 O9 [+ J
0 \. \; u, D; t, @: X0 g& x* x6 r" Y. B# J7 @
2.2 28379D 的 SCI 模块引脚+ a0 F d, }' y/ Q( } \) Z: b
28379D 有 4 个 SCI,即 SCIA,SCIB,SCIC,SCID。每个 SCI 的发送引脚和接收引脚都有很多个,如下表:" N6 r0 P5 N, W, \+ N
! s) P4 R8 c0 q% b# j" B$ V三、SCI 配置步骤
- R! m% w- c% n1 T7 R3.1 配置 GPIO
4 A/ e3 c& p$ s8 z7 Z8 _/ \配置相应的 GPIO 为 SCIx 的复用引脚。6 s2 \' n1 M2 r( ` e
4 L! c+ X; O6 E
5 r5 k3 ^" o7 Q/ ]/ _3.2 配置 SCI 的数据格式
/ h. e* i% E3 L& j7 @, H& M配置发送和接收的数据格式,一般是:1 位停止位,无奇偶校验,无回环,空闲线模式(两个对象之间通讯,如果是三个及以上,得用地址线模式),8 位数据位。, H, c5 L& v3 [! c: Y. E
n( x! d; W) g' n0 O }/ }( B; Q, K6 _
3.3 配置波特率
* d6 l# P/ p3 ?0 L( n9 V9 c5 s配置波特率,不多说。
# i: [+ u% A2 d5 Z/ {4 I- z: @7 w0 U5 F
9 V( U, A0 W m& e3.4 配置 FIFO
' ~- R% D1 s7 r/ v/ K* L6 j' ?首先得使能 FIFO,然后根据需要,进行配置。比如使能接收 FIFO 中断,设置 FIFO 的级数,基本的就这些。还可以配置波特率自检的一些设置,不过一般不用。4 i L B% {' Q! H1 y2 K+ Q" N
( W/ ~# F4 {1 m% _
. q* f; v) n( J) Q" o
3.5 使能 SCI) ], P+ {% Y! M$ ], n
复位一些标志,比如 SCICTL1 寄存器的 SWRESET,必须被置 1,等等。
0 ?* _+ \& ]1 s5 c2 d* I* {2 Y9 Y( m' q- \1 U( W
; W: u- _! E/ c8 ?1 g, z8 S" w. ~2 b3.6 配置 PIE
% T" N) h( z5 q% x首先使能 PIE,然后修改 PIE 向量表,然后使能对应的 PIE,以及 CPU 中断。( X D' b. }; f# t
. P" e* x1 c" H2 P. a$ a1 y. `8 b
& ^5 _$ u) L5 G四、代码示例- ]* R+ A2 S; V+ a m
示例使用了 SCIB,引脚使用 GPIO18 为 Tx,GPIO19 为 Rx。# ]5 N4 `$ f* d: K4 x$ w8 f$ A
4.1 配置 GPIO
. f! c) H/ j4 {" S z7 T3 E: q- R2 e% h0 o
EALLOW;& z$ r4 \/ e' D- l. d9 H
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;//开启上拉电阻" p( H% A4 p; N$ U) s9 a
GpioCtrlRegs.GPAPUD.bit.GPIO19=0;//开启上拉电阻" z! y7 J2 Q, R+ b: g2 M9 U
GpioCtrlRegs.GPADIR.bit.GPIO19=0;
9 X8 o# O( z2 D1 _ GpioCtrlRegs.GPADIR.bit.GPIO18=1;
6 f* `+ M0 o9 L! y' D GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;
% C$ X; `) j, ]" U0 X GpioCtrlRegs.GPAGMUX2.bit.GPIO19=0;
; o7 \' G: T! E, P4 ~( Y2 y u' C GpioCtrlRegs.GPAMUX2.bit.GPIO18=2;//复用为 SCIB 的输出
$ k2 B4 s5 r- e) Z0 n' v; y GpioCtrlRegs.GPAMUX2.bit.GPIO19=2;//复用为 SCIB 的输入
: W4 R7 P6 K* sEDIS;- y$ A( f7 K( F; a: \) I
J o' v/ Y% T4.2 配置数据格式
2 l' m* X. d4 Z O2 _
' `. x: M- t* f, F9 D* PScibRegs.SCICCR.all = 0x0007;//1 位停止位,无奇偶校验,无回环测试,空闲线模式,8 位数据位! L' w* I0 z- ?2 w0 R; k, H
) x& y9 L, r1 X: F- {2 t( ^- r6 W7 R4.3 配置波特率
, A& @- x4 |1 ^* g; `+ A1 \0 V$ {
, T, r) P: n3 n+ z$ g% Q( M2 N, Q# `ScibRegs.SCIHBAUD.bit.BAUD=0x0000;//波特率 115200
l! E# ^. F6 k. [ScibRegs.SCILBAUD.bit.BAUD=0x0036;//波特率 115200
) g3 B" b n! h# j0 }! r+ [
) h8 u5 O# @5 x$ F4 X; c# x4.4 配置 FIFO
9 e0 s( G& ^% g, d- e G0 {' O6 j4 s; Q# X9 L7 m9 I3 E$ u$ K% B
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能 FIFO& ~% a" l5 E- i) X9 I2 o
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;//使能 FIFO 接收中断
+ L% E( o7 J y) o7 aScibRegs.SCIFFRX.bit.RXFFIL=1;//FIFO 接收字节 1# Y" d7 j4 S2 u2 S# g; l
ScibRegs.SCIFFCT.all = 0x0;
1 x) ^1 @) T$ L' W0 N* O: H0 I8 n
4.5 重新使能 SCI
4 s- d" @: u/ z$ ?/ o# I# L4 m& g( U7 ~0 g. G/ D7 T
ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset 重启sci, X; p& y+ n" {: P) n. `- I
- ? E o. L9 w' N# T. }
4.6 配置 PIE
; }9 v- V& I/ p
7 V% g4 S) j2 m' FPieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能 PIE
+ s2 l- B3 c! ^2 s; YEALLOW;
2 [ J1 d' h# x* E; E mPieVectTable.SCIB_RX_INT=&ScibInterrupt;//修改中断向量表3 b5 c6 g3 x, W( M/ ^
EDIS;
, k$ C2 V$ J" ?) w9 |+ \; x4 iPieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能 PIE 中断2 |3 Z5 a+ e/ ?* H1 V
IER |= M_INT9;//使能 CPU 中断% W. Q0 l- A7 a% \4 y
: ~9 l3 p3 s7 Z3 g/ A4 ]) h8 e! W0 Q& [0 }1 t
4.7 接收中断函数 ScibInterrupt 如下:
, y& g5 B( s3 O R: r9 D
0 _6 K8 V+ U. |. A0 Z5 h- Z* xinterrupt void ScibInterrupt(void)1 R* a9 ]/ O5 ^. B+ c
{$ w! J6 S. z! P- n/ i9 u* a
int i=0,data;
+ E2 e- y1 f$ p8 Y' b+ L! G# e for(i=0;i<ScibLegnth;i++)9 Z6 {, p7 |# u: ]! J
{: P$ ~; | W: s6 U* h4 S. L
data=ScibRegs.SCIRXBUF.bit.SAR;//接收的数据1 c% A, A( w c: T% N! g
}' w7 R' ]7 L% b$ x: T2 P
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // 清接收中断标志
: e D% v, p/ M* N. n! e% c# a5 g PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;// 清接收中断标志
- B, d7 j. _) A( P3 q: r' n}9 l% F7 r# |: ?5 ~7 p q8 J% ~1 R
! } b/ X8 u, ]6 }
Y; D! I* P( \9 Y4.8 发射函数
/ L; r6 z/ i0 R5 g' b8 Z+ r2 e: t . Z$ n# N5 u# z h9 p
5 c( u7 T h3 L! z
int ScibSend(int data)8 J* _# e7 b( ]* L6 g
{6 W" t# h2 n$ s8 e# X$ S
while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}
$ k: o& J5 l+ b+ L ScibRegs.SCITXBUF.bit.TXDT=0x06;
; t; q8 ]$ j* F1 _% } return 0;
: z4 Z8 Y1 S! U+ F' Y# @% M9 t9 O}& r9 a/ ~: R+ c) S
/ a/ z- @8 h, z/ G& I# l& @: p9 A
4 Q3 r e; `6 }9 D- e. q$ [ |
|