|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列 3 V3 e' m" `) `; J3 [, `* T" P
0 ?! r2 T; u% U# X
2 j+ M) c2 w) d! [" g 图1
& p3 Y: Z- R! v5 Y' p- K# D
+ v4 M( T, d& a% t5 Y
" I% H) ^; \, o. n% M% @ 第一节SPI Flash硬件电路! Y# J( v9 l) \
3 M5 c" x9 ]; I& F4 b. X6 b; }2 ?
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:
2 Q1 k# ^- |8 ?4 ]' Y4 K9 Q+ W& j: [+ m# [. d4 d
& C1 B% t5 c- V
图2
. R; c4 ~" j6 f0 J: m% X& s T: I( a; ~" `# n3 K
4 P/ a' a9 Q' i6 v
6 v( `8 P; Z) U5 w- }( ^, x% w
第二节 SPI+寄存器
6 J4 J, ]. ]2 r" A5 S' o1 T
" A/ I) u' \1 c. @7 } 2.1 SPI+介绍+ J# O) c- P- E7 a% [( ^' w
% }1 p4 Y: J) p2 |3 F! g 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。* y' h0 i! y# k* S! N& ?$ N9 _
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。, `) [) B" R4 D) k
/ r8 c5 }- N% m. ~2 w 2.2 寄存器介绍. ^" Y3 H# c9 q5 r* e- R" e
2.2.1 SPI控制寄存器00 F& [3 S- I) |4 ^# ^$ u/ [
# z# K9 a8 e" G" O# ?, x! s; M# L6 A" N
' M8 l" k& ?1 F" r P: U
% D1 p! e: ^5 K' k& \3 |& N: P
图3+ L* f0 F, K" v
15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
1 z5 P9 t; g- F6 C* c7 g0 d 14位:SPI中断使能位,’0’表示无效,’1’表示有效;
, h9 Q8 t% T# ^6 U 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;
3 q# O! O2 [0 f H1 J8 W 12位:返回SPI_DI引脚的状态值;
. Y/ b( Q9 M0 k) F# d3 p 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;6 G: @3 H; q1 q. T8 ^
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;
0 z$ ?7 u2 E3 f' _, W l* d 9位:‘0’正常操作,‘1’复位SPI;
! E, N) k; y0 T+ S% I, p5 R& i4 ~ 8:7位:SPI数据格式;! Z) U. B0 S9 `7 J0 t
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
0 q# q2 J% \/ a# o# T 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
- |( O4 o6 K4 b" h, a9 ` 4:3位:SPI在主模式下的时钟频率选择;
5 @: ]0 u$ o6 C" s: r: ^6 k 2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;% p4 J8 I3 L$ r) Y3 T/ q$ w
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
Z, n0 r% \7 [6 g3 }' B 0位:SPI的开关。
?* n" ^. e% I; H
2 r1 F5 s% ^: B 2.2.2 SPI接收/发送寄存器0' o% w; a; N j4 L4 s$ r6 A" r6 t2 W
2 \1 y0 e4 d: ^) P8 m
q& q* U$ t5 d5 _3 m. |7 [4 P 图4
( h: W6 b' y! y1 g( O" ]1 _7 j 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
9 \3 K$ _4 H! {8 e I+ I1 g, Y( H
* T1 H6 X# U+ W8 k0 ^ 2.2.3 SPI接收/发送寄存器13 |1 X5 ~- v/ ~6 \9 K4 _
) O1 [, Q/ v- @0 Z/ x
, Z# G( r9 v2 A* ~7 C. b) y, O# v& ^ 图5
. t0 [4 g$ C: u3 G$ O1 Q 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。
! K4 {7 Y( j+ [# d9 ]2 f3 p. n: U! E' [( o9 g, S
2.2.4 SPI清除中断寄存器9 T2 [0 y9 w8 B3 [: S
, X4 W: i/ r4 w9 _
$ N4 h1 }! j* W6 e* Q
图6$ h8 `# W, p* u2 b4 W/ a
15:0位:写任意值到该寄存器清除SPI的中断标志。$ d6 c' q4 w- t4 x% c& l! |
: \1 _% K+ Y, T2 w# C9 { 2.2.5 SPI控制寄存器1
( q, e( M* t- K: O0 t% \8 ^; f. h% t% }. _4 F: y o% f j
$ [8 |# J& ]" e7 x) F7 ~9 |
/ I5 Y- W# B* Y% Z0 q5 S1 U; p
图7' T& I/ c2 w$ s
15:5位:保留不使用;! ?* S/ `% D0 E1 w
4位:决定在9位模式下的第一位的值;
: @" n4 K( `/ ]4 }: d 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;
- v, U4 q! f% S9 T 2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;. {% K, Y; ^) d9 X8 a& n* P* F/ [2 e
1:0位:SPI_FIFO模式。2 _0 @! W* B$ X0 r5 `$ j
o8 q0 T: T- Y9 c5 P" [2 P8 s. y 2.3 寄存器配置讲解
, r" |% T8 f* i8 I% I #define CLK_PER_REG (* ( volatile uint16*)0x50000004): Z7 X( Z1 V( G. z9 Z. }
#define SPI_CTRL_REG (* ( volatile uint16*)0x50001200): |) m5 Q5 o% G
#define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)( ^& D. n0 B7 k
#define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)
% m9 J. S. k+ q3 \7 } #define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
+ G0 ]0 W4 b c/ n/ L: n #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
% K- A( n" t& K 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;0 Q+ ^2 x# W& I9 o4 j' r
SPI的初始化配置寄存器:5 a* d3 b( G$ h' P& d% \
先关闭SPI, SPI_CTRL_REG =0x8000;
, A# }% Q9 f2 d9 i# | SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;
K e1 V+ h% i1 ~, a9 u- k 开SPI, SPI_CTRL_REG | =0x0001;! I+ q! [5 r. c- t# ~$ [9 p
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);& V- n! z- B8 A
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;# d3 a* C& d7 g/ J6 O4 L# q3 T% d
Y6 Z8 l/ b5 F% _
( d& m$ h' H2 ]3 n! ~
0 U: d6 C8 { I6 J9 J8 S1 {* R
第三节 SPI实验% D& U7 f% ~7 h* t+ {" c6 y8 l
- n/ k% V) ?& s4 {, D 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。( x6 S# p/ I: I, o& y
使用USB转串模块连接手机蓝牙串口,连接方式如下:
2 T L. N" E9 L( s* B; Y (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:: D7 D- }& C% V/ C0 }
. g( x, z8 z+ m% M; t/ Q" z
% F* c, c! u4 i6 h 图8$ s: ^# A" b4 Y+ ?7 E
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:
, v+ q7 i; | b$ j" i- `/ e5 Y" t) ?4 y) E: m5 ^
! ?6 l" ?$ i. m; P" C8 B
图9) j1 K r# P" @/ d4 O
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:
. }7 a. s) D/ d (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:" y. M# p; n! R8 h% ~
& F* Y# D, ^9 h
! s/ G" U$ ^# x P" `- K 图10
5 K# X: ~! `0 j (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
; q4 u: P( x! R% k( f: O# b' {
0 C' k3 }. A2 \0 |1 K: k
& _. X" y9 c4 U* l& h- R 图11
1 [ m- \$ F& C& J' d 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。! V) n% M1 Y% t, O& U& @
SPI实验的Keil工程为spi_flash.uvproj,位于目录:. f8 S7 \% x& {6 t0 f8 l
..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
$ W* q, h5 ~! k3 R4 M. Y+ Z
" ~/ D4 C0 B6 j+ T# e Z4 j
4 j% u" t& M9 J$ T+ I 图12
) V. Y( A+ @4 T: [. A3 j4 T5 Q$ w, N! L 打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:
/ M0 s. t" P5 Y$ S8 @; }( r+ b8 M6 Q1 H. U7 C) w' j% J
2 S Q: J# t6 ?- Z9 i+ i! Q; X) L9 ]) y6 U
5 I+ E4 |. ~, \ }( O2 F) }6 P- {2 L6 M' b
! P$ d/ F: A& S* S9 r& M( s7 `& b' C9 ]
图131 O+ G$ K+ q& t3 s: O
. L8 E7 l& N4 W& @ J
4 y/ r. k5 R/ q& u ^8 C9 z8 I% B- w( ~% m N% B0 q/ V, P5 Z
配套资料:http://www.fengke.club- M; e! p' n- G) {9 M" Q' o
套件地址:http://shop115904315.taobao.com/* I4 A9 F6 M) t. |1 j0 g; N
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
% c7 ^+ }9 B, |3 i% H
. j3 K- m6 J( B- l7 K# \) u( H$ w |
|