|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
——疯壳·开发板系列 SPI教程
$ w V: W0 b, L: f! \# C
( f5 Q9 Z% a8 @1 C' H8 t5 ]% |5 X4 ]" v4 x; K" H
* x$ m. X9 ]3 X( c5 J' a+ r
% d: T6 `: I; i: } 图1
, {7 ]4 g) M1 m1 {" S. {1 a" p+ _% S3 n4 @& D4 u
( X/ ?( d8 A( H3 H# h$ ^
第一节SPI Flash硬件电路, B- }" O! ]) S
9 R0 e# a8 b: i7 |; \1 e5 k
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:+ L ~) @3 H. H
0 ]% G W5 O, @
: |" K6 F5 K2 ^
图28 F4 i, i' v6 f! M, C
& [7 g- X& a+ x/ N
! r3 P2 Y1 B4 i( Q6 x5 U
, Z- l% f6 |/ f* l3 l 第二节 SPI+寄存器
+ y3 V3 H1 H# W' F e; C! p- y0 b7 ~& F7 @# i6 F0 ^ @* \5 o# }" H& l
2.1 SPI+介绍
6 F$ m K5 F" x) c5 A- o2 Z$ q) k1 W! n# _% s& a7 f
这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。' d: h, x( ^- X7 ~, @
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。% `+ C" b/ h, K0 v" E8 P5 l& m+ F# H
! m9 Y, b% S6 e1 A4 z: Q1 u1 O 2.2 寄存器介绍
' q; S% V) F+ }: U' ~% }7 P2 ` 2.2.1 SPI控制寄存器02 M3 Q) C% Y: S, ~/ R* [
& G* o- l. p% m) p
/ W6 E8 k4 d2 L
2 b1 o- M; f( q% M1 n) { 图3
: n+ Z$ i; @. G+ x$ E( d; z& A o 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
' y4 J4 p$ j3 s/ K, a% Y; H 14位:SPI中断使能位,’0’表示无效,’1’表示有效;
8 o5 _( F1 |& n5 f ~ 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;
/ P3 I- w1 D8 q& a* j9 ~ _. S# Y 12位:返回SPI_DI引脚的状态值;
2 E6 _' F8 L( |0 [& {% P 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;1 X7 r Z; l3 O3 ?1 h. j
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;
3 Q5 a/ H% ^$ c9 d' n1 u) `# A 9位:‘0’正常操作,‘1’复位SPI;7 T; `4 Z" ]( W' m2 y
8:7位:SPI数据格式;: L$ z9 K" W- J
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;2 o% y9 e* {4 T
5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
* U; N* N, M) X1 F& c9 w' O# g; ^5 } 4:3位:SPI在主模式下的时钟频率选择;9 b! f0 w, t7 N( s+ h8 _
2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;5 H; s' t% |3 |' A4 x: H
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
& d. N5 {: P, q1 } E+ s. W 0位:SPI的开关。
! x" U5 r6 P, n. e. u' t6 H: N8 v, w9 n) I9 g' o6 c, Z
2.2.2 SPI接收/发送寄存器0
. M4 t# H+ q; [$ {' k5 t3 N1 |8 e
* A6 Z6 m$ G! C3 z1 B: N
& b5 P! v) B8 L4 U4 ]) A8 O
图4
: z& h7 x* |8 Y: M* c 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
% z2 e; |$ H0 l! E; T. m1 w$ j3 w' V5 w1 v. h' y% O! [5 E
2.2.3 SPI接收/发送寄存器15 ]7 \% v o0 m: t: b, m* ^& i
6 A8 k6 \; d8 H+ ]2 _/ [% D
0 L# J4 {! V8 }1 y; j9 ?
图5# ?/ w3 r8 q( O; Y) W8 w+ {: J( v) n
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。! z; e! z+ b) D3 z ]7 Y) a
. {' x0 F% K$ H1 D
2.2.4 SPI清除中断寄存器
- p- C) m! c* v q [2 j
4 n* @) }5 \6 H4 \
& o+ _7 y1 B/ r; S' `3 K. Z 图6
! z% b! i3 R$ h$ Q& _5 n 15:0位:写任意值到该寄存器清除SPI的中断标志。: w- k, @# b& w& d- V
$ e' p$ [1 a& O+ m+ A 2.2.5 SPI控制寄存器14 H( C9 |9 S. q! L
5 t9 m5 U8 |$ _2 {, _4 M
- t5 M+ ]% y2 T' ^8 B7 D( ? P6 f2 W
7 e: {6 c8 g2 o+ {6 y9 g
图7
. B$ [+ v" [* {0 @ c0 f 15:5位:保留不使用;2 Q. X5 `9 s0 g* ^: v5 ~- U. t6 I- ^
4位:决定在9位模式下的第一位的值;
; E: a7 C& I3 J# {" V+ O& M9 P: m 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;7 l3 {! u1 M; L7 o# t w( b
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;, K+ t) J8 P$ u1 \& e7 D/ N6 q. B+ X
1:0位:SPI_FIFO模式。/ n) G* }$ @) o1 A
* l5 P- }! |0 e# W$ k
2.3 寄存器配置讲解* p0 Q9 I& n; [2 ]2 H
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
% ]+ Q$ b% x" j+ k q #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
# Y7 u/ m0 _" d( c7 n, h0 T; { #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)
7 P6 n' U: }9 H #define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)* j* A/ B* D6 T9 v2 a9 A% @
#define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)6 f' F7 X6 s2 y8 C/ X1 e
#define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
9 B1 v$ V) I" w3 _ 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;" R2 [! ~ N1 H" ^
SPI的初始化配置寄存器:1 v* y( x8 K" u% w+ W) c
先关闭SPI, SPI_CTRL_REG =0x8000;
c: T6 Y& ]' K* k& G SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;
# E& t; c; ~- n C* d' E" e( S 开SPI, SPI_CTRL_REG | =0x0001;; p: j' u0 G7 x; E( Y
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);
2 g) S: X1 s+ E 接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;
* O( H4 }" t k" k) ^# z' p3 G9 V; Z8 n6 E. T3 h
4 z, V: |# s2 T# M4 e/ S% ?
* Y+ \ M7 z. y 第三节 SPI实验; H3 h, L& w! f$ w& p
& O% H$ E: j0 E1 x. S& X. Q
实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
( B+ J h5 Z# j# e 使用USB转串模块连接手机蓝牙串口,连接方式如下:
6 Y) U% I C# O F3 {+ C( n (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:. l5 u; ~$ i1 ~7 E
: i8 ~- C, o5 j5 p: N
" }$ I4 M6 W! H) T) T o# T 图8& `- [! ]2 B! L" k" C* z; Q7 f
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:( d' t$ e& F$ T6 `
o p- Y! ^ t! Y2 _- |
( s& O8 ?) C3 s+ e) o 图9* z5 y2 \* y8 y# U* u9 H
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:1 s8 ^9 R9 {6 n; Z( k" G
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示: m+ C* \% G$ m' f* F( }( [9 i
$ L! n8 U. T# h
: @1 N2 b; d2 K' ^ 图10
3 Q- C8 {" k9 ]$ c3 O, J (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:2 b U2 K0 C. A1 ?/ v, a
2 }8 [! [+ e! U4 G
8 ?0 H5 y: @1 c7 E; y9 Y 图11
( o' M/ w- O" }: v# K0 [ 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。4 O+ ]1 p2 j8 F
SPI实验的Keil工程为spi_flash.uvproj,位于目录:4 x9 W4 S4 z2 l. h( L
..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
4 m, G6 `+ H5 q) `( s% P
4 r# P* J6 _+ G' U, @. y* B* r
% \0 Q) f3 {0 I% U0 L0 l3 N! j/ K# H9 W 图12! G3 m0 W' R0 p7 {$ K( F( A$ w
打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:
4 \) d9 ^& {4 t/ X- G) D
3 e" X1 x8 n! l4 B' V2 e$ F
9 T* y0 K, Z7 o. ~% C1 R. y5 v$ ~, t
$ y7 S$ g5 _% ~( k8 _
, K6 b$ ~9 ~" O8 S c/ R# |
4 V* c- S3 ^5 n5 ^- U7 R9 u 图13
0 ^2 [ y, R, C7 K9 _2 q
, W% y' @- U' z% B+ J; C8 I0 r% X" ?% }( z$ p& E1 @
- ]; C9 V$ e& J, o c
" _8 a: r& J6 C+ Z
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
i( ~2 Q, y- L( E7 c% A) E) I. y8 f/ c# v D
! f4 E6 Y p1 b2 e$ y7 O |
|