|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
——疯壳·开发板系列 SPI教程 / a2 L& n" H- a8 n
) i' v! A- }& |: k4 }4 j; ?& G t* d4 g3 l$ h( v* V
. I3 y k* k$ }6 ^* v7 S. s
# Y) r/ o& l$ ~! ]& t1 @5 ]1 a
图11 J% J4 H* A# @* t" M
4 _" y' e q) P( C: q8 u( [' V# k+ c3 w/ T% p& }5 j
第一节SPI Flash硬件电路
: y4 h% c6 R2 z2 q8 U
; S( F/ K. E; J SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:/ F) z' d# [ {& o2 l0 h3 t
0 S* Z1 b) B! S* c R
, n+ u1 F! j1 Q( r$ G' _& i 图28 Q8 n" b6 @" H9 P/ E- ^* R- Z
Q3 j+ X9 S1 ~" s' P& ^# i* q
7 J0 U- s1 p: B
0 _; O7 d% l( a8 P o6 Z 第二节 SPI+寄存器6 f: D- l: g, F& N$ c& U6 B
' T6 a- V7 z$ {, y: K$ J) d
2.1 SPI+介绍
( a2 ~0 @# m# g. O; Y7 |0 X5 y$ T8 {' V, q( ~5 U) g5 r
这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。9 H" |: c* G# X; d7 i, v
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。' d6 i( ]! Z" r$ K! G# S' q( U
% U, ~& c) {) R' u! j2 \, N
2.2 寄存器介绍
. a0 s6 `" h' e3 h( B 2.2.1 SPI控制寄存器0& v# o; v( ]5 |( @3 S
" i! V3 R( `$ [! S, ?" J# M! Z
; m6 n9 R# Q* F$ S N$ p. Z
, m. q5 G0 R7 Y; ]( l) m+ q- {( y
图3
! v/ i( Z. d2 C' X3 r$ a3 b 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;) `: F' _7 C% G9 |8 C2 q
14位:SPI中断使能位,’0’表示无效,’1’表示有效;
; X3 j! p* E2 |* c 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;
( l% r. L5 R6 s, M, Z 12位:返回SPI_DI引脚的状态值;
% s& _& R5 g) T 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;
% a, ?/ i8 v {6 u! V' p 10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;' Y% e. V8 ]2 z" _0 n
9位:‘0’正常操作,‘1’复位SPI;: ~: H: s4 r0 d& H) C# w* y
8:7位:SPI数据格式;
. g4 }: ?( F& ?9 K! `9 w 6位:SPI工作模式,‘0’为主设备,‘1’为从设备;7 M# V% m& s7 z2 d( r" G
5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
% y6 `/ A) p8 U% t9 m 4:3位:SPI在主模式下的时钟频率选择;0 `1 o+ T9 d! G9 H& v* Z! `
2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;1 e/ k* ~1 \# L/ {/ U7 y
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
( Q3 `, ?8 [$ R1 H3 I 0位:SPI的开关。. ~5 d8 f# z7 s" h
3 n9 H# X! Z: ~: r# ^" d- x# `
2.2.2 SPI接收/发送寄存器04 K' b( n6 m {3 v9 H+ t7 n1 r
* O8 h u7 ?9 N5 L. h/ T
2 m& a) v% A! N9 U5 p; r
图4) _9 {7 D1 C& r! @: n' d# G; K
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。( y1 _* l9 T4 |9 a! v1 T! ^
0 N; A( f3 Y- |( `" f$ ?
2.2.3 SPI接收/发送寄存器16 `* I1 P% l) |5 @$ @9 u& I
( j9 A( U- A. {6 c4 d2 B
& P! u; \# H! Z' f# V0 h3 A' q
图5# j! S. e2 F- e, |, s! P2 N
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。- C6 z/ j7 {! S# G j- y/ l K
' C( A, l( |( h* K% _3 v2 x 2.2.4 SPI清除中断寄存器: X& q( r! ~7 t, W
7 o2 z, f' F" B+ Q4 |
/ v4 Q3 p: `+ Y2 v* H$ D+ N$ w
图6
+ B, [# `. z- D }4 W 15:0位:写任意值到该寄存器清除SPI的中断标志。0 S% J1 a5 D0 ^& Y; a
( ]) v& g- B- L4 c
2.2.5 SPI控制寄存器1$ X1 n& ?2 m/ q8 P
0 M) ]3 A0 N4 P0 Q3 I
, r( T5 B2 j8 q: x
: j( Z% l* F, ] c
图7
6 C) @" \; l' N 15:5位:保留不使用;
5 B- |! V' W* ?4 r; |7 W0 x 4位:决定在9位模式下的第一位的值;6 b. X) d. E0 k' h+ _/ A: s
3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;+ R/ }4 b1 S4 N, O: G7 Q2 L" L& ?
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;# ?0 K: y0 t6 A h$ h+ m7 l- k
1:0位:SPI_FIFO模式。+ t |+ {7 s6 c. @) u- ^
& k# M5 i0 r. | 2.3 寄存器配置讲解
, O2 h) X0 }* D5 p #define CLK_PER_REG (* ( volatile uint16*)0x50000004)
; O! K* @* |# T1 D( J #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
1 `9 O( x$ d; j# z% c #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)
* B* ^* U2 z4 D, x( d #define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)
5 k" U' B0 s+ W+ a) Z% n5 f6 ~/ T1 E #define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)9 I% y7 m7 H9 R( r1 g
#define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
" _+ e4 _! K4 C/ X7 l8 M* Y 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
4 q+ Y! r/ r( h' ]5 X( {3 C' A, | SPI的初始化配置寄存器:
- g: Y; b. z7 q s1 b2 f 先关闭SPI, SPI_CTRL_REG =0x8000;
8 v4 I# C2 e6 p2 \ SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;
+ G) L3 l8 X6 U* Y6 {, I& m 开SPI, SPI_CTRL_REG | =0x0001;
% H" W* |( Y' [6 h# d, D 发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);
5 ^% E2 ~7 L" a/ `# G- W' @ 接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;$ L& W p0 e0 y: e- e' U
& z% K; R3 M# b, s
' _" e/ U* }; W7 _3 w
* [8 @( |+ V+ b5 v" C 第三节 SPI实验4 r* c+ ~7 E" T- W. [
+ [; b, e% B. Y2 z
实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
9 k Z( E5 X; Q6 p" q 使用USB转串模块连接手机蓝牙串口,连接方式如下:: X# J. ^, z3 h/ i. K' E
(1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
! R+ z" d! t( x
2 I4 n" n/ ~7 T) K) A* _1 l
" U% i& o, M4 A! E) X$ i 图87 d5 c, n! Z8 X. Q2 V7 r, P
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:+ ^ N0 D3 [ v* {0 M/ @( h" H$ @
% M, u; ]' @4 n
" z1 V1 L; H# ]8 Z4 M- w3 y 图9
8 Q! S/ O9 N7 D# } 使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:
, p' E' S1 O! Y* u (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
- P6 ~3 y \6 t; D1 h0 ]* k( s3 u- s7 q7 P/ F* q8 B* Y, D" F0 v _
, ?) A5 p3 n$ ]% N, I! W 图10
) j! ?4 O! M- { (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:8 _' v9 }% ^: c' f; b
; V. M" o: ~# c, Q
* h9 C" l3 b) `0 h# G; G
图11
. X/ ~) B9 B8 f! ^* t( B 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
5 ^' p5 K. V7 K) r SPI实验的Keil工程为spi_flash.uvproj,位于目录:/ w3 |* P1 N4 z. T4 M
..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:- C' k* h( g/ a$ D( ]* @' B
% I4 E; Q# h6 h! o) [: b6 U9 O- f3 ^0 W
3 _- [4 _, ^, @ 图12
6 P( U: }* O7 l# ?1 S 打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:4 d y* M$ f3 C! M2 h( ` v4 i
8 i, V* b" }" }1 I: }( j; i
* [% ?$ p9 y$ d% u4 f/ L
3 l; L% i2 ?' a [3 p4 C) @
! M' g2 z1 Z2 m
3 H4 q: h }+ @( T3 k) V' N
% t4 J+ {5 {1 m# g% K, w0 K 图13
" D# L( h6 v I& n0 g. V+ w" h- ], ^: [. ]! s; W# P' w$ r
/ }7 I9 |- b9 G) l- @
1 ]' F) k" K+ b* G
$ h5 @7 I! T# l! D 文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
6 z2 I: y& S O0 L# x1 Z: ]
" B1 m! L4 S/ E0 j# K4 t3 o! I; d
$ K3 e5 X" D4 x l: l- Z+ U; t |
|