|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
——疯壳·开发板系列 SPI教程 . M# s9 y( F5 j' s$ B
! t4 i2 G$ E; v/ t! e. H* z P) f& m
0 ]6 v+ z r3 U* |- }/ M8 w$ g/ \0 @( |# s3 q M1 x ^
( E* U$ Y# a. u; `: @8 Y 图18 K' Z: h" d6 C. S8 i
% ]( C$ j! F4 l' d, M
; h3 s) S2 N* _& l4 q: D 第一节SPI Flash硬件电路
- {! |/ ^! Y6 d. j% T7 A4 ~' |% s3 ~' ^/ ]* Y& S. z0 c" z
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:- P, o6 T6 I& D5 s0 f! I
( N8 \6 V5 V7 t9 Z
: V, z A% L4 S. W/ z6 y! E4 X& o 图2
$ V8 B) r) Q8 y9 N0 t+ I- e7 G" R& F( c# u" Z' e' ?
0 D% k' H: _- ^6 L
+ `/ L2 l! ~: M4 W) S3 B6 Y 第二节 SPI+寄存器
% o$ v, q8 ~, U( K- |& }
4 y* g. R( g6 u4 w) S, n 2.1 SPI+介绍7 e8 F+ O; Y8 ]# M: J- z
2 ]& l4 e" z0 D/ b# U' D6 R 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。2 b/ V, f# O1 [- `* U
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
v- B, M, M& M) Y8 f. P* A4 U2 ]. z% P/ R
2.2 寄存器介绍
/ g6 s* N2 A2 `7 ^3 ^: o 2.2.1 SPI控制寄存器0
9 O! X5 f! t0 e2 o4 s/ j' C; B0 P; Y0 o p
5 w$ L( ^& U6 {/ O% b% z4 f0 v4 [( y1 u
I! y, D- w2 D, K6 r
图3
) c# e" g- B4 p9 i* a. b 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
+ n O' U' u# ~ 14位:SPI中断使能位,’0’表示无效,’1’表示有效;
- d8 r& r; T z" A# v: T 13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;
. B% \* T' _& n 12位:返回SPI_DI引脚的状态值;, T+ _4 r* A( q' l2 z9 _8 q, N+ \" \
11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;
3 `# ?: Q( y; N6 s% g+ R: _% p$ u7 i1 p 10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;
, N- p( E, U! I9 d4 U, e+ Y0 H 9位:‘0’正常操作,‘1’复位SPI;1 ~' @$ v% d' b3 l( |
8:7位:SPI数据格式;
i) h' ?# g) Y, S0 E7 C- e 6位:SPI工作模式,‘0’为主设备,‘1’为从设备;' J) o$ V2 u. k8 j% d! S7 c$ Z$ m- g
5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;) C; Q Y1 _. \: \
4:3位:SPI在主模式下的时钟频率选择;9 K# ]) b) d% N1 [! ?& o5 b3 P4 ^
2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;
! [; o( c1 M/ `$ R 1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)' e5 v- C& z; q1 T
0位:SPI的开关。
* k$ @" _7 }! v0 m) l4 K+ {2 f s6 I: W. Y
2.2.2 SPI接收/发送寄存器0* b9 q% G) F9 ^
, E' p9 O1 }* x
, n. J { L$ P1 ]2 P+ ] 图4
: D+ M. N9 g2 s- }: w2 h; e 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
W+ `. X. x% Y$ d! q2 x% _8 l0 t4 K" g, M! I) V
2.2.3 SPI接收/发送寄存器10 u; W" d/ ^; y8 m5 y+ V. ^
; o1 |( o7 }6 I, }& s3 l, [
0 s3 c7 ?) ~& g# @2 R, x. g
图53 K6 K$ q( _2 T1 b
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。& ]% [' h% H Y, h
* `" c8 L3 s% \+ ^ 2.2.4 SPI清除中断寄存器
& i, F q* u8 {, d
- U% D) v4 F! U/ n% R
# {+ k I6 N1 W# r/ \5 W# _
图6
7 L+ R6 G7 q6 n- j" @" d! N 15:0位:写任意值到该寄存器清除SPI的中断标志。
' q2 B) L8 p# z+ `- L( l
1 w* H9 j2 O0 k: k h 2.2.5 SPI控制寄存器1
# Q( g; ]! \. Z; w+ u0 H' S& q2 p3 ~7 J: U( F# t
) T2 C- u+ M, }# a, I* j
- f" P D; R8 p/ K 图7$ c+ c! H% ?& p% n* ]
15:5位:保留不使用;
* h* }% I k/ `! a$ A5 c1 w 4位:决定在9位模式下的第一位的值;8 x* n# s: L l- a* H
3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;
" {3 I1 V( |- V! v* c# ?. g 2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;/ P7 J) P7 ]' O' g7 g1 |
1:0位:SPI_FIFO模式。
3 E" `+ o$ m k& m$ Y) e8 K& J. d- H8 n' d5 u: F
2.3 寄存器配置讲解
0 C1 k b' {" ~ Y0 y #define CLK_PER_REG (* ( volatile uint16*)0x50000004)# j7 a) M" P8 N" z5 H4 v" _
#define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
- L0 B# z! e7 m0 f/ B7 c/ D #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)- M' u, ?; g, T7 C: {( }, y% ?
#define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)0 |) o, c& m, \8 f
#define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
8 U! m; h8 U3 ]( s! H" ^ h& ` #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
" y+ I5 P: _& u/ I) | 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;' i6 W/ q0 |) |$ `
SPI的初始化配置寄存器:* j. Q7 V. s9 {4 _' ?) K
先关闭SPI, SPI_CTRL_REG =0x8000;7 D+ U6 d6 C, }# u1 g
SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;1 D1 D1 q: e6 R2 P
开SPI, SPI_CTRL_REG | =0x0001;, z; }) X8 P! [5 P( |. j& O
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);, v/ Q2 g# z; `$ v1 i
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;
|: L2 |+ ^9 |: _- e0 `
% x9 d! t& d( ]+ ]8 r4 S) g7 I, J h+ C4 m
; o% U5 F) s4 o2 R( A
第三节 SPI实验) V( C- A1 G3 a+ `8 t
" g* g* s3 M Q+ o 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。- e: Q a/ s) s# Q% a1 i# a
使用USB转串模块连接手机蓝牙串口,连接方式如下:
d' x: E. E+ n6 D# w5 e& w (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
% U9 o; [. F: E. `/ Y% ]& e2 L/ r9 B/ C. W
# Q2 u6 Y+ v+ x5 R6 k
图8
% t, Z3 ]4 Y% F* R6 }9 m" K3 S (2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:9 \' X+ R! F) e4 `1 J( a" I
1 U6 k0 L7 k6 N3 U. T1 P, N9 P
' M& S6 Q! t+ O
图91 z& i1 g1 B+ Q+ H
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:; J R. X) f# M9 p
(1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
# E& |* B+ Z& K6 Y% U8 F* ?. Z, y6 Q7 g N
( O9 A! s3 x3 W 图10
$ t; K- z& _5 [7 I, D (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
/ V) h% Z! X: ?+ o, U, B5 Y, r
* u$ S5 r- A% o 图11( ]& C& ]. l8 w! D; L
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
+ \, O+ _. _: c ]; v) s SPI实验的Keil工程为spi_flash.uvproj,位于目录:
2 w4 C* N& G) d+ M ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:$ [9 P9 M o1 u- f7 f- ?
# ]; B3 s+ c/ f) T
2 t5 ~4 p' j% c, X
图12
! u0 z3 U5 d$ ?4 }8 |* F* o2 @ 打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:. p% L$ T2 V" a2 e: A9 A1 w
0 t4 f: S& F" S( x
5 u* _" ~* i# z
* ]( T# l) `) a$ v" g3 e" D1 j) K3 m
+ W8 b* p5 t8 r$ B8 N" V2 \1 g* i2 m3 U% {0 h' n- X8 B3 S. L
$ h C; L2 X& c, D C2 ? 图13" `* B5 D3 v& l, x0 o- j
1 a7 c/ Q y$ f. e% {, J
- L# V9 r2 j0 j; F- m; `, j6 R
6 Y/ W9 X7 V: ~+ W5 b! a9 k; W# V9 Z7 b# ]* Q" ?, p
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
6 ~+ U! l" o3 S6 b- |2 x. s
0 x2 G# D- L8 L% v3 _3 _0 h/ Y- h! q# c% `0 e( x% z1 J
|
|