|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
$ Y' w" ]* W$ b3 U2 F% F5 t& k2 B+ n* ^9 N
/ e# T" `; \7 R$ Q5 M9 p 图1
) K1 I! C+ M. `) K, j7 \" B; C" \1 D1 D. j
/ A( r% C" X4 P0 i k
第一节SPI Flash硬件电路7 W/ x' A& ?- Z2 K( _$ c7 J5 Z
& p- v5 ^+ E' k+ w' r0 L6 H8 ]
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:
, e4 |5 f$ Z# G+ K/ G0 z/ V {4 [: o8 g
5 {. ~6 g+ M& j6 k' p* d
图2, U Y' Q$ Q6 y
, U8 e$ O/ Q4 K- v4 y b! N
1 G p1 V4 r6 x- b k; O$ {2 v6 Z3 Y# v: x. K, r, t o/ D2 A
第二节 SPI+寄存器# E J" \0 O! p- o- G# U* t6 U
, T& |. q( l$ i: L 2.1 SPI+介绍% i) U( Q/ \/ B' t
: T3 d# k- c( y. Z 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。0 i! `8 ~% D% w4 d" @
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。# s* v ]/ C" v) M. y& b: p+ ]
( @ Z4 k5 A& N6 K
2.2 寄存器介绍
) y- e) h3 D6 W: t. Q 2.2.1 SPI控制寄存器0% v z# y' S) n' t! B
A O5 d1 ?4 _4 h- V* @4 n
% y3 k2 P1 o( k
/ k* A x' D, U/ n6 }8 c
图3( r/ x, m3 ~0 R
15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
! M6 X! Q$ N2 a( ~6 u" | 14位:SPI中断使能位,’0’表示无效,’1’表示有效;+ k% M2 u) q/ G" o5 U7 F4 v
13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;: I5 @' ?( x- A4 o# y, F
12位:返回SPI_DI引脚的状态值;
9 M0 r+ _6 g! X! A 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;
6 v: t; z8 q+ o) i2 | 10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;7 R; }3 ?4 _* _# _( `4 U D& n
9位:‘0’正常操作,‘1’复位SPI;
# w2 J- {+ \+ w5 b- } 8:7位:SPI数据格式;5 u' v/ Z6 W6 i6 i' z" u
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
! ]' j+ t& u7 \; J, e6 y 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
# z9 ~5 p& J' V2 P0 H0 U 4:3位:SPI在主模式下的时钟频率选择;
& {; G1 R& ^. B0 ~# R. |) e 2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;
( B9 ?, M' j+ k9 R 1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料), ]) e! g2 i! M' z0 R$ b7 v' \
0位:SPI的开关。3 d1 ^6 [( ]8 [/ q* `6 i0 |
& h3 m9 ~. ^8 l- ^' @4 `% ` 2.2.2 SPI接收/发送寄存器0) y0 ?* f6 I& y& E. y N2 b
5 S/ t" l9 S+ S- s; N& T2 d I
! W9 ], N, K. h
图4
O' Y# V* t, G! j 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
% D2 ]6 V' @* y/ U1 v6 o6 ]
) ?& c, N6 _' @8 U" B( p! ?) u/ ? 2.2.3 SPI接收/发送寄存器1
4 n* x/ m5 f r1 R1 `3 c4 t d1 d" S p- [6 B; q
- o2 N4 C2 B/ \* w
图52 u* Z8 t, E: m% L9 K. ]
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。9 A6 F Y; C+ H3 O+ Z
% A. z. F4 }0 W8 A; v* W" ] |
2.2.4 SPI清除中断寄存器
1 ~# `5 h, V& U. f1 i/ b% m
( j9 \8 t* c0 v9 p. `. Q M( R
; v8 N- {; n: L3 A& `8 d
图68 V6 T6 K0 N5 K4 U
15:0位:写任意值到该寄存器清除SPI的中断标志。- g& M& c7 s- O- {0 |
3 v( @7 d& c5 R 2.2.5 SPI控制寄存器1
7 ?& [* i8 H( U7 z& O1 [( e! p* r8 Y, x% _) J- ~# A3 j. ~9 W- m0 r
) ]5 f) {0 B$ W( m. n
; V E# ~* H1 p) y0 P
图7
# j5 r7 R1 f. ^1 y% M 15:5位:保留不使用;5 ^: I8 U, [4 e
4位:决定在9位模式下的第一位的值;
4 i7 [/ q V' F( H& B 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;: X& e5 t8 g# u
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;- ?( |! r) o0 t# Q* A
1:0位:SPI_FIFO模式。
, D( t( M! G- ^2 [. m3 Q9 H; H' G+ u; {( H* p) I
2.3 寄存器配置讲解9 S" o( T! e1 }6 u/ y* U
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
1 r8 S% \; M& a, r8 S #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
~" K! ^7 D- D ]$ j #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)* T+ ]! q, H( m) Q" d$ `: \
#define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)
+ {+ I: H4 z- o" P0 Z6 s$ h8 B #define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
6 [0 q+ }3 L- v v: R #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
9 K y" o: |1 z6 A 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
; H; `: }/ |8 b) r7 y SPI的初始化配置寄存器:
- r/ X3 k6 t1 v z* d7 w# G6 N( d 先关闭SPI, SPI_CTRL_REG =0x8000;
5 T# ?% Q0 t, g+ h SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;, E' L; `. j7 `. b& H
开SPI, SPI_CTRL_REG | =0x0001;
. t" Y/ f5 s" }& j! m) D% S 发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);
7 z, U) l0 t- I7 ]1 ~1 Y 接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;, ?& A) {$ F" {0 \
) Y+ @- O' @' K6 v
2 Z8 L" Y- E, H8 \3 j9 s( m/ B$ A# f+ D+ f
第三节 SPI实验 ^- G' s Y7 ]% w$ W7 k8 }; q
7 }2 {4 {" N$ y8 W( s
实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
0 ]( I9 D' c! B. M* } 使用USB转串模块连接手机蓝牙串口,连接方式如下:4 A3 p- ~( k4 M$ R( D* b0 ^
(1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
, J% T' Q3 w$ w0 A; g2 H4 K; P. |; r
) M( f& g) `4 B& B% {7 r
图81 H& [% b( ~2 i$ j3 j# Y5 J, I: [
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:+ G& M8 N% i" d: r
4 m4 D0 c8 ?/ `* C
) c8 \, {9 o5 h9 b( q+ t7 {$ u8 y) ~ 图9
$ A$ W, O) i9 R. G8 r$ y' X 使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:6 h4 N; o \. d$ u
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
: L) y% I5 Z$ s4 U6 J) e' Z* X8 H( L; f7 \6 @) X# E6 L) q+ K! T
( M, k6 m& O! c' y! ^; E0 d. n- W% z 图100 D- n6 }5 R- P, t+ W' ]
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
' c0 c4 ]# p7 T! V& S% D* } r3 y9 x$ m- G0 o8 ?
$ u w: D( K# x9 [5 c# u8 A 图119 n: @6 m( D0 ~2 i( \0 ?
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
7 S' [. q- y n) w5 d SPI实验的Keil工程为spi_flash.uvproj,位于目录:" c, A7 s; \2 R J8 L1 @- n; C2 r. U9 ^
..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:7 }( H" e3 h U% I
0 H" \- ~; o+ ~9 m7 u3 J) V
S5 P( T' [" ~/ e% [ 图12
7 I5 o6 {- ? E" I 打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:6 s; b: g7 W$ n7 W/ H1 \# ?
6 @* @% |, N( q) y/ H* @, q4 _: q2 `
4 @& {" n/ N( {- o4 B
" i8 v' Y6 `8 o4 h; w* {- o$ g; G
& K' b( h2 O5 o8 }
7 u$ Z( r/ f/ F
# k6 ?' L2 \, M, Z) a: w N 图13; c1 z% E" v1 y) c* N( p' Y
3 l" r& h/ j" K1 m7 x" j( }
* d U% C4 ]5 u; F, W% y6 c. y7 p+ f; o8 A9 n, z) T4 `) i
配套资料:http://www.fengke.club) G. F4 E) v7 M; K$ I. k( L
套件地址:http://shop115904315.taobao.com/
; ^+ `+ x& e' T; G3 a! Z# ^ 文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
; j2 x5 Z% t6 R" K* G# \1 k" K9 M$ V
|
|