|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
. t" C6 K, W z
8 s3 c `7 K+ R% @# ^( Y
3 t& a+ P& y7 ^" O& e: A 图1
0 ~+ N1 d1 W1 Z, F7 S
4 |/ J# x( S6 V' v3 D" [) z, G
* t! a6 t: Z4 j 第一节SPI Flash硬件电路
9 N0 w( o& m4 c$ o' B$ q7 W& l2 c. Q2 A$ O- p4 B
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:8 s) e U. _4 E- S( z2 V& u/ J- K
7 Y1 V4 N& C4 R2 f2 ^! }, J
6 b3 k! S) o/ G# C+ b8 t- w! `
图2
* y3 ^2 Z { l; M9 ~% ?/ A) s; v
9 c, T6 {4 t- J' ^
1 Z, u5 b9 g- n: I, ~. p- [, e
. M9 O7 x8 I ~+ l 第二节 SPI+寄存器7 D1 f5 o* F# r
' n; O$ w- P! e! [' |$ G
2.1 SPI+介绍; P6 N: N" ]8 R1 z w& `
1 X9 ?3 `% T, |* Z ] 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。
6 O& P p# I% \( n: a, Q" o 该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
" T' u) a7 m: f2 L1 x' f% o" m$ w& k- t. h; l; H
2.2 寄存器介绍% I5 S; H% B r: W
2.2.1 SPI控制寄存器0
" K& v- E {& T1 Q( {. d r2 r- b( l' S
1 b6 e8 L# p% N) L, g& r' v
+ G; q9 \4 d% k [4 z* ~
图3
2 r. A/ K6 ^+ Y/ T( g( a 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
1 T* R0 t1 o: W# S- c% x% K 14位:SPI中断使能位,’0’表示无效,’1’表示有效;
; M& y0 d+ n; g( Z2 @* u 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;: o: U3 U% D! L9 A
12位:返回SPI_DI引脚的状态值;" _& R' }) w1 x* F, K- `
11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;' H# F: L: {% a* J, N0 {
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;
7 \/ B+ O+ y9 ^/ T 9位:‘0’正常操作,‘1’复位SPI;9 J) {0 e$ k( A3 }& d" t& z
8:7位:SPI数据格式;; w9 Z5 ], {6 L3 l0 `, ~, m
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;8 J8 G$ ~2 G: N) q
5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
- j$ h1 U4 b9 U& ?( q2 H 4:3位:SPI在主模式下的时钟频率选择;0 f5 G3 o, h! @: [
2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;0 b9 w+ s% E6 x
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
) L% w5 @! h" m+ ` 0位:SPI的开关。
# t8 E: V4 s; l/ u7 D C( l
Q9 T7 U* e O( G# r 2.2.2 SPI接收/发送寄存器01 N7 y: v5 u8 q
) g% i |: b+ h8 n5 X* F! v
8 i: R6 M, ?% p6 [3 W
图4
# n8 ` G! d1 U 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。& t2 h& n+ M; o4 A# V3 X
" X! G& ~4 f; Y% K% v
2.2.3 SPI接收/发送寄存器13 @* j7 r/ e7 N2 I- |4 t
5 I* U+ E" a0 t' t, w4 u' I5 s
% t# U$ {8 D$ y" |9 k
图5# P2 i5 Y8 x7 ^0 `
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。) ?! e$ x7 c, y# f
9 x3 w8 B: |) q! a1 c 2.2.4 SPI清除中断寄存器
' I9 k( F4 m' ~0 |$ X, }' }9 G/ _4 q# U# F
8 C4 v& |8 o: z* r6 @3 m9 F; a+ a 图6
+ P( _5 @2 j$ U- ^5 O0 n% E p6 C 15:0位:写任意值到该寄存器清除SPI的中断标志。* v0 O& J# p- T p; L" {
7 p0 h1 P* q& ]# O) r 2.2.5 SPI控制寄存器1# {2 Y* Y L: W/ N: i5 P
4 l* t7 i* [$ R1 |3 m* ?! R
, K+ ^- p' Z1 j8 b+ O
, I2 {4 ~# p2 Y9 Y
图7. X; m3 \- i1 z' M3 ~+ i$ }
15:5位:保留不使用;
+ w+ _6 ?7 w6 i: l) j 4位:决定在9位模式下的第一位的值;
" X8 U3 o. `( D6 d1 {1 \1 P1 u% y5 T. H 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;; p1 ?0 f8 b7 c6 g3 h( K1 `
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;1 x! W+ p# K; P* I; B$ o
1:0位:SPI_FIFO模式。
' H7 B7 X6 n+ |* n6 R4 u* h5 Y* }2 a0 C6 E, g$ h
2.3 寄存器配置讲解" y9 e5 c; [; B& i7 j/ b
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
. t' w# l" _9 c/ } #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
) [: a5 s: M+ j9 ^% D; ] #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)
- {- j; r$ ~/ l$ s #define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)
8 ^- n( X1 Q$ g #define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)6 m3 @: [+ p1 T! ^1 S( O4 |
#define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)8 \" X/ @) y8 F0 h& K' m* ]4 i5 b
启动SPI模块的时钟:CLK_PER_REG |= 0x0800;4 z5 t: A2 D3 z/ P' Q% a U
SPI的初始化配置寄存器:
0 r3 E4 b9 Y! h- ?: f7 m" Z+ A' ]# V 先关闭SPI, SPI_CTRL_REG =0x8000;
- b2 l% S+ T; Y* Y$ ~' h: w SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;" |( v* t* n9 N$ D& W
开SPI, SPI_CTRL_REG | =0x0001;4 l9 p& m7 z/ X1 Z! [8 Y1 n
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);9 X" }# b D' T6 v9 c! V- o
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;) c' A) Q9 ?7 v
9 p% ?# s2 b+ J: M
' E7 d; J7 y. F9 s. @1 @
6 e( H2 O3 g1 ]+ ^: v0 T# W 第三节 SPI实验# j& s. g' O$ T+ C: A( {
6 y4 d& F b% z 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
1 Y* x- m: z: {- z 使用USB转串模块连接手机蓝牙串口,连接方式如下:
. Y5 i8 Q. e2 e4 w# r; e (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
" K$ J4 Z2 P7 H6 V& ]9 j8 {
+ h& T" L, L( r
' y1 z) M! m b: r: Y! q# V 图8' j; v) L6 E$ j- ?
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:
4 `) [7 B9 V6 b9 e* ^ d1 t x) b6 U7 M: G, ^* ~& U M ^
7 h2 Q% S/ F$ v6 U+ c5 S
图97 q* _" _. Q5 z0 D! G5 \
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:$ n" H) I$ r& |9 A8 ~4 a) R
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
; U; x; ^: l; b2 F" @% I
9 L0 D2 x' p2 s- G5 o
, p& K1 p1 X/ Q8 R& t/ |* A 图105 n0 x* C- J1 ?/ R: T Y$ \1 `
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
4 ~2 [$ o& y+ W+ x0 ?* v$ f$ U! P: j4 P! [, v; ?
( [) h! Q: P/ h 图119 [4 |" m; V3 p' V
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。" N! F- P' Y" ]5 X8 }& V
SPI实验的Keil工程为spi_flash.uvproj,位于目录:
5 ^& n! V# b* m/ U; c0 ] a; c ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
; b) D7 W2 K% l: e% l- X# |# Z% q+ ]' h- [
7 H! e, W6 |5 ~. k* \( |) z% t 图12 @; V& A K4 O2 b4 O- {, F" v
打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:
2 _5 B' Y% t, k n2 {5 |3 [ G
+ ~9 V3 C1 r1 \/ ~# g! f
5 a0 M( {* {) h' E& s6 h
' S U! Y, y- l" v/ E
0 ?, t0 w: c4 z# @- N
i1 D* f# L2 V) C2 B# B% L. F
& K1 ]: e8 R& K8 P& W 图134 X- |2 q; t9 C
( l1 F! B$ B" q; k: l7 l- s' u. Y' z* @6 L) \% @
4 L+ \& |- {; _/ ]; q6 c, R4 g 配套资料:http://www.fengke.club
# e& @4 ]3 A! I3 y) T7 O, U# o 套件地址:http://shop115904315.taobao.com/
8 e4 }6 R9 |( U w 文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
0 C; o+ y+ ]$ B& P0 |" i \; k+ q! L' x5 d X* a
|
|