|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
7 i W( }2 s% l; h
% k1 [- }9 H3 h; O
# [' C1 R3 c0 v8 i/ j8 x" p
图17 n& P( m; }; T( |9 k) r0 I
8 Q( J/ `( @+ |. O t" c' ]
+ [+ F" W9 w, l 第一节SPI Flash硬件电路
m e' l2 r' n( a8 y
+ c9 s$ f0 | @! ]' f5 \; N$ H SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:' Y( p+ v4 u! R7 L& |: H3 a; ]
7 {; Z7 K; r( E3 ?
9 ~6 g6 Q. k4 u1 y9 ?4 x: B 图2 e2 J8 Z+ X/ [9 ~- i
. @) \' }+ W% z* Z+ R# \9 d& W2 {7 H+ |
# ~, S6 o+ |" T
第二节 SPI+寄存器
* m" t5 l6 r. k6 s2 A
6 j% _8 _4 {; C5 [( A9 t 2.1 SPI+介绍
8 }, t, `- p8 [: U6 @9 S' B( `; z: \! |8 C
这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。
1 X4 i9 C3 U3 M" R; R+ G( T* ^ 该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。4 h* D# r& y7 l7 B& L# s
4 T8 x1 Z/ {8 n3 m2 x7 q
2.2 寄存器介绍
2 V# R% }; y4 X3 n2 O& f 2.2.1 SPI控制寄存器0
, D) L4 ]0 j* E b* a- S) B. s5 ~4 W
, [5 a( `' `5 R% x: W! C
9 |# G) e; {, { 图3
- }5 C, ?$ u I) f" Z( U5 ] 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;5 {6 p, |' m+ O4 `8 h2 e8 T1 z
14位:SPI中断使能位,’0’表示无效,’1’表示有效;
5 L2 M% V8 R* x( q3 P) X' [1 h5 I3 W 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;9 D9 x* B# ^; W/ ^* |
12位:返回SPI_DI引脚的状态值;1 z- v- F( ^9 g( j' |( w
11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;: j _! a& R- V; P
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值; b6 v; d. R! y7 c/ }1 h
9位:‘0’正常操作,‘1’复位SPI;- O/ N! h$ A$ p) L% S; Z$ y
8:7位:SPI数据格式;
% O" q1 ?: G+ g- A0 C) L* o. R8 y 6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
" K- ]) o; r" Z4 h 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
* D: k+ m- W( z( K5 K6 W' X 4:3位:SPI在主模式下的时钟频率选择;7 [1 a+ A3 g0 E+ {& a
2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;
& A7 m8 h* X0 V0 v 1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
f( ]: O& X+ _3 Z: q 0位:SPI的开关。
% r( O9 U: y! [3 k3 N9 i) u1 L/ ?# d" G
2.2.2 SPI接收/发送寄存器0! x. B: ^& K2 `9 u E- k; L
+ h( N& H$ n* n3 t$ L
4 j7 Y7 m O% R9 p" d
图4' }1 m$ G- Z* f( P/ D5 F
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
- c: J" S$ f5 `9 ?. {0 x- O. B5 K* m. R7 ~6 n x# {2 u+ X
2.2.3 SPI接收/发送寄存器10 V7 I$ |+ T# n* `' p
/ n% V1 r6 n2 }0 x6 E' b
- z2 E- ^: i, W$ n0 p 图5$ z5 a7 M+ f& m4 B! ~) l. Q
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。( R, ]- |- c* e E
. j. w6 e3 M% k. j
2.2.4 SPI清除中断寄存器$ |4 ?5 r- ^1 k0 j. H" n# k$ _
+ m3 |: J# [; v3 i! G
8 K3 E: n$ A% q, ^1 _( @
图6
/ W% q% l: j( n; z7 B+ G8 { 15:0位:写任意值到该寄存器清除SPI的中断标志。
. g. y; `% @: s6 ?/ }1 g4 O6 g2 Q9 {6 V
2.2.5 SPI控制寄存器1) q4 S( j8 ?! |8 d1 b3 z( R/ ?% y
+ l3 b" V; n! b3 R9 o
7 p4 p) w8 p/ f, t
0 \) m* u; p) y8 G6 D. g
图7, j, [2 C% t$ y- [, ?
15:5位:保留不使用;6 q4 B8 v6 c4 I, X7 W
4位:决定在9位模式下的第一位的值;' N' y/ v5 w1 e# g) Q3 ]
3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;- {5 |2 D e9 `" \7 i0 ?
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;; v+ G7 |- c g3 v- S' r6 Z: Y
1:0位:SPI_FIFO模式。
/ b6 Q3 e5 X& J( y8 Y
0 y; o# q& S/ Q0 P9 D5 Y+ t' p 2.3 寄存器配置讲解
" | t+ S! O& u& i% n/ Y #define CLK_PER_REG (* ( volatile uint16*)0x50000004)
! W1 |4 t( J2 O* \% f' }! l9 A1 F #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200), H7 _" N6 H5 j1 P P
#define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)
) k8 K6 i' x5 P6 v0 n/ N; ^ #define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204): j5 K4 q. k# h1 }! r
#define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
6 h' l3 F& Y: Q* V- R# H #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
9 d% Z: d _9 o. ?) j 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
* N: |( f0 y* q( r x$ Z2 D- o% c" V SPI的初始化配置寄存器:) H4 o z7 i- U) L+ l0 k1 ~! v
先关闭SPI, SPI_CTRL_REG =0x8000;9 W$ {$ C+ ~ }: N
SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000; p; j/ \/ a) Z' N! U; r
开SPI, SPI_CTRL_REG | =0x0001;) _9 P; a! [8 g+ p7 M6 p
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);8 `6 ?( H" s3 h) L# D3 g
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;
5 n1 N6 H6 w: ? K
6 }4 a, X& |) I0 t3 [1 Z- c
0 _# f3 M, |- O" j2 r: M1 `; O% |2 C8 F- ^
第三节 SPI实验
! s% }8 D. X; [/ \
$ g% @6 \& M- r% O2 n) m& F+ B 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
j2 o+ e& q# z$ Q$ T" d1 w 使用USB转串模块连接手机蓝牙串口,连接方式如下:
: f( n1 s. F/ ~+ ~) z9 O; u (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
2 p) U8 p+ p7 I* O. q s0 S2 h7 a* i# Z0 B0 r
$ D/ B4 N1 }1 f 图8. Y, ~$ x* a* T& W, Q' J
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:6 Z) D( F: O: x7 I5 J4 p
0 J9 R+ `' p+ F e, g
% c5 U& [ s w5 U+ r
图9
6 B u! d# _: A x' K 使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:. d6 B: o! h% S$ J$ K. \: z: [* a) @
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:3 L. {+ U& Z! Z7 T
$ L" `9 j* x1 E
; F8 n, i* e7 x0 k( k3 x 图10
1 J+ L) a- M5 }# q (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
! C1 q6 A! b( ]6 h5 g* H# ]
0 o/ o1 n! z: B' C
! ^0 s: D' K9 A0 b2 p4 S/ p8 {, P& W
图11, ?: I" |1 J' v8 f& h6 K; Z
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。; b# m" j+ r! j! h( U( G" c
SPI实验的Keil工程为spi_flash.uvproj,位于目录:
8 u( w( B% c9 R0 F% z ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
4 z' U) Y- R0 q5 v2 o. ]: o, f# Y0 h. Y$ h
/ l8 m0 j' Z9 G, |- G4 ^ 图123 w8 v0 E! u8 L0 J! X$ Y
打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:4 D4 s& P' U5 }$ x |* \5 U
" f! }* V/ V' L( {8 T
: [" X. g4 I- u' }0 o& N" f( ?4 x) j3 ^! N$ r0 ]0 L0 @
3 C* A) |( d" W. A
+ [& w' W, t; {
6 Q0 W0 T* D& m' B; @ 图13
4 E4 m# m2 Z, W! ]+ a# b
$ _# e/ g7 M/ [; t% f7 T0 x* I7 E: q' z ]4 N: W/ g$ q; C& W
' U; B2 v8 [, ?1 |5 N8 Q o/ I 配套资料:http://www.fengke.club
) L2 o+ V7 @6 B1 s6 c4 X# } 套件地址:http://shop115904315.taobao.com/" h8 A' I" t3 R* }
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
, f/ `! U- n+ ~, v# c" G- B4 a* p, D8 t$ q* G1 Y" c
|
|