|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
. D, V8 y8 X' C+ s) W9 C/ m3 i: i) i* `$ F/ z7 k/ l
) V5 b- u+ D" t, E# z+ G' q
图1
# A9 E0 `8 X- k N& m* P) R
' h( Z# T% G0 r: x b3 z! o/ J8 A$ o. m7 k
第一节SPI Flash硬件电路" A$ r3 N# E( k4 k
8 q" g: a$ q# t2 h+ {( _- b SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:
" k: {; R1 I, K' g' O. @# Y
0 f4 x J: V6 u& l2 n
* c, }8 Z* `2 j" X% z
图2
9 j; @, G( d0 r& |( p$ |/ }! j
2 ~/ q. ^* w; A& s
6 Y% p, \0 P- W9 `& @5 ` `3 H8 D, u
9 `- s+ u, k; v- H 第二节 SPI+寄存器4 F p( }% w9 T( ^' y
5 H4 S* \7 f; N& t. J' d 2.1 SPI+介绍! \2 e& ?3 K/ }1 P
/ z" a% q4 E2 {9 X1 l 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。
: Q w6 B N/ S9 N6 M& l 该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。1 e- E: B) h# K; @" O
: W4 F& F- G1 h* d7 l
2.2 寄存器介绍
, i7 U- {1 l6 ?5 s% c6 Y 2.2.1 SPI控制寄存器0; F* K1 t9 Y# [: a9 r
- E7 H& d2 q" J4 _
" M2 v* q7 T w3 V
2 Q- J1 ?. R* N# u: e' u$ ? 图3$ f [8 S: V2 U+ w
15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;4 h* p" h0 B/ b% [( v! l( f/ h
14位:SPI中断使能位,’0’表示无效,’1’表示有效;' E* P# s9 D# y0 Y
13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;; C( h# w; b2 w9 x3 \$ W
12位:返回SPI_DI引脚的状态值;
e+ @7 D! f8 {% T) [ 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;0 |# g# ]/ W, v/ o
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;, k4 p0 j% x/ q/ g* B& d
9位:‘0’正常操作,‘1’复位SPI;
) c$ I" w3 Y) } e f 8:7位:SPI数据格式;8 p9 U' M9 y2 V; m/ O8 g0 j
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
& Y: y* _8 D# B- ]" O7 [9 [ 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;6 F7 i" q# l5 Y! p6 u7 F. b
4:3位:SPI在主模式下的时钟频率选择;
1 s- H: ]5 u4 m 2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;5 e7 M' |2 Y9 e3 Y% N
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)) f2 q1 Q/ G, J: O! q9 ?
0位:SPI的开关。
) S: h8 C4 L7 q
" \' ^9 B8 K* W. | 2.2.2 SPI接收/发送寄存器07 }- L& b! e4 P! M2 [! t
7 x4 r' i9 r3 x" U7 i( p* s
( t7 C5 T0 J: B 图4, Y3 t. |, F' J0 D: k: F
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。. b$ T( v' P1 s5 R
. C& ]. M0 w) I) I: G
2.2.3 SPI接收/发送寄存器13 D- u9 i7 t1 r% ^ @
7 k5 {+ r/ P/ n4 F% f
. ^9 D: ^, G& g ]6 s
图5
) B* F* a2 ]/ H# U. S 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。" h; E9 v- g; T, [4 `
% v$ }) |: [4 c# h9 K 2.2.4 SPI清除中断寄存器* @+ v- J% M0 S$ s3 p
% U# |+ n* p; j- l' n1 ~
' l) m! R# Y( q- J2 p0 r' i 图6+ |! Y% o: L- \3 f- w9 I6 c7 ?
15:0位:写任意值到该寄存器清除SPI的中断标志。0 R8 k0 C& M. i
: x3 V4 y5 V0 d- t
2.2.5 SPI控制寄存器1
4 u8 I8 E9 w. D; R% U# g$ B
) e9 c- [* t+ |. q* ^; Z" \: w f
$ y; o; f# m6 v, t
7 c) M1 y6 u$ ^
图7
8 J" V- q0 ] K( d0 J8 l 15:5位:保留不使用;
' E& D/ ?) W, ?/ u0 T0 j% e 4位:决定在9位模式下的第一位的值;' q/ ?0 |2 e. G9 [
3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;4 k) y% f/ W% o5 I0 s
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;0 ^7 w. _3 k6 W% A
1:0位:SPI_FIFO模式。# x4 h- t' R% z
3 O6 X% G4 [% ? E
2.3 寄存器配置讲解6 Q. n# [ f$ O4 n; e# M
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)) Z7 h0 a. Z/ t, @* F
#define SPI_CTRL_REG (* ( volatile uint16*)0x50001200), B: J- s2 J4 P) o4 c( v
#define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202); i5 J6 g# V% ~& M2 h6 W
#define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)3 {, k4 a0 c/ t4 d8 N
#define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
- |, h1 ~ n) m7 ]( [% ]8 t #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)* z9 k( n$ m* y, M/ |
启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
# y: t8 p& n0 \9 j! c; a0 z# [: H0 R SPI的初始化配置寄存器:8 ?9 M- L/ e3 c2 C2 b/ ]3 s9 B
先关闭SPI, SPI_CTRL_REG =0x8000;8 c3 H2 p( S, \' n: U6 S
SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;
: {6 l( }) K+ ?% K; W3 q3 r9 E& F! } 开SPI, SPI_CTRL_REG | =0x0001;
6 N* D2 i6 U3 Q4 H 发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);5 v3 E6 D6 \& r
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;/ p( R' Z \9 [) O; G+ e* k
7 N9 i, b0 S. V& Y8 o& z& Y8 ~3 O0 h/ N( B* a5 z
8 D7 x2 X0 ^6 H, N 第三节 SPI实验
1 {& E7 k2 q' Z5 p% c
: M% R/ n5 h3 q, m 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
; G* B) y" n4 w ]5 V2 E9 M 使用USB转串模块连接手机蓝牙串口,连接方式如下:
# P) ]7 }/ L0 @, @ (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
, G y0 X( \$ C0 \2 B5 ^6 L# p
2 f4 O/ X: A6 l3 ]& y$ W$ X: C
1 Y0 R, K( i# w& I+ ? 图8
/ b" I+ V4 H. z, w, V+ j0 k, y (2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:4 c4 k$ O0 x1 ^" m
: G" e R% w5 \' o t
X" N9 i; H/ Z4 B" @! l 图9( W) T" U( I$ q# z$ J' u) q. N
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:
: p- k7 q+ d1 V" ^5 I( u (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
% |# S s5 Y$ Y! j$ u& _0 Z, y4 y6 j
' P* w) l5 ] _) X6 e+ n8 @# X
6 N* q% H* T5 V/ ?! w 图10
2 ?" |$ s. z5 q& S2 R; g# } (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:$ N0 |- _7 V4 B1 N
" e* s _& ]& ]+ Y2 p$ |' D
% {7 f4 \" p% ?/ V' O2 @* O- T 图11) s- a3 v6 H% x1 M
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
$ ]- d2 e/ w2 i4 Z0 W/ T SPI实验的Keil工程为spi_flash.uvproj,位于目录:
! ^5 s+ t, F3 Z* j ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:8 d- I( w H" m+ E& @; z! @5 d4 L
" L' o: }* Z1 y: A
$ [- r L0 \& U( K: h 图124 |. `( j1 `' h6 Q
打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:: B" c# K/ {3 I, O" q/ j, w
) \8 \8 P+ }% [& h* R0 O
0 |3 H9 w- F5 v0 b; `
- @) O- P: Z: ?
' Y; H P6 r) |' x2 b. T
5 l* Y+ F0 k# e9 y' W2 F
2 V9 V# d$ M: _6 V4 k- C
图13( B: v, p" O) t1 E& k3 ^* \* h
5 I+ n* a/ T8 O/ K
3 I0 Q3 j- M* u7 M0 X7 @
8 ~/ O) q& Z: N$ P9 [, C( `6 @% N 配套资料:http://www.fengke.club
4 N. j5 l+ E6 q* ~. l ~$ y5 p, l/ W 套件地址:http://shop115904315.taobao.com/9 Z) q) P8 ~; o" K- T: @# Y; V
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
/ M, K3 J6 r& M& d
: ]7 B8 q' P2 P0 j8 y7 E% a |
|