|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
0 G6 X& n* H$ }+ x2 N+ y
/ t0 X8 U0 {7 @6 n {, p3 u% u
. Q r+ q, I" K 图1# H# b- c( q% z) y" m
6 U% b! K8 _+ A: x: F% B
4 w8 j+ ^5 c; k& s
第一节SPI Flash硬件电路# }$ y. {( {# r, t* s: U5 m
6 z. t3 ~& Z! N5 }
SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:1 l7 m: h1 y" _4 p0 A/ e
3 b' R! y; B5 j: x$ K+ T
; ~( @* y$ C Z+ S6 a) _ 图2# Z6 Y1 G# {% u( g
6 Z) G. ~' h2 n( W! N! _5 n* I; \) a2 z; e/ b9 L
/ j2 } t% ^% [3 X! G% n ] 第二节 SPI+寄存器0 m! p t' K' b) N+ c
6 I l. A# K1 k" l) | u l
2.1 SPI+介绍$ h% _: S: j9 k* b, R6 p
$ I0 O( @ i7 u, U
这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。; L. u7 O- _& a4 r* M5 h
该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
; ]+ O* {& B" @. ]' p' S, x3 C, _$ G X6 E8 E
2.2 寄存器介绍6 z! r! Y& t4 [- r2 L) h3 z
2.2.1 SPI控制寄存器05 X3 V/ }0 [4 t
' G/ q: f3 n# i: j5 b8 |$ ^ i+ _
. \1 S9 X! i, n1 U, S- T8 s
& b n5 f3 n, K9 P9 i
图3
: H: d8 v9 u5 u' N 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
& t5 a' I Y3 e' D3 m- b 14位:SPI中断使能位,’0’表示无效,’1’表示有效;# Q. b: z | L9 [
13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;
4 A4 l4 J3 S+ B5 i! d 12位:返回SPI_DI引脚的状态值;
+ y$ u/ e! D* x 11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;
. q# p2 e# u8 ` 10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;7 I% }; s% q- Q) c0 a
9位:‘0’正常操作,‘1’复位SPI;
1 T8 s: i7 D" Q/ A4 L- B 8:7位:SPI数据格式;4 Z' A/ j% U; r0 e- C& {- n
6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
2 v2 y e4 P: [/ s 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
* I! t2 C0 f8 y/ t) { 4:3位:SPI在主模式下的时钟频率选择;
: B9 @0 b7 I# O! D: i! K* m# s 2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;7 @; _& s9 i/ |; F0 [9 ~1 h
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)$ d3 V6 Q5 N- |4 A1 m6 W |
0位:SPI的开关。
' G& e8 t( `$ q9 w+ u9 Y0 Z
+ e% T+ l8 V& a 2.2.2 SPI接收/发送寄存器0
/ Y0 h; V% \$ E! L5 I+ P
5 P5 ~3 _; w/ k& ^" p
* W5 b: ~7 U ^; J
图4/ k) H8 j( E- U! U
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。
, {& N# @- |$ Q& x' v6 c" K3 b$ y. @8 d" J& H2 s# j! }8 V
2.2.3 SPI接收/发送寄存器1
6 |- @4 B2 M1 S7 t0 C
! o, e% u7 O) A' R
" f! j6 j: T3 `% }5 a4 K7 }$ n 图5 y" b3 `. n3 w1 s8 I/ B* j4 u
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。
. y$ W- ?" {4 V: P/ W
) W2 b/ [/ a3 y5 C9 Z. q8 M 2.2.4 SPI清除中断寄存器$ W% V9 E& }* L8 I# x$ p
& P7 v$ G; @& H" z
# V# d. q: H- E8 U6 B5 {7 E* Y
图6
) b7 t M! \: G 15:0位:写任意值到该寄存器清除SPI的中断标志。( v8 U# n. H3 w* K
+ V9 ^ G+ o- d$ w" R; l; c 2.2.5 SPI控制寄存器1
) N( ]7 k! S# W) Y
0 c) m5 j! K# U, M1 m
: Z3 I- b& |! G; l$ W
J9 z4 B6 J" S 图7, o+ m& M3 k7 t; e: |0 I" [0 s
15:5位:保留不使用;3 I( z5 R" i0 e) N! M& e3 }0 \& }
4位:决定在9位模式下的第一位的值;
5 w2 y5 i# N' i 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;
- K8 p ]: p# [2 W 2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;% k4 U# y/ L- Q2 t/ `
1:0位:SPI_FIFO模式。* `' F, u6 i% f- |! Y8 Y. ^1 k
4 E, X! Q) l3 v 2.3 寄存器配置讲解9 ]& J6 S# N1 O& h, Z
#define CLK_PER_REG (* ( volatile uint16*)0x50000004)
8 C6 }9 ~ G! h F( D* v; X #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
2 F% S6 J" |; F" q2 n #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)
6 c% o& t$ a5 |) Z( ]/ P8 u+ K #define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)
* `: z! e% ^7 O8 k& J) }! F #define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206)
. x% Z: U( W# A* j( y #define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208)
7 J; A) K3 X z& }: C 启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
+ r% u; w- X( `" G. z3 B SPI的初始化配置寄存器:% l; N3 i! M" [8 B1 o. {
先关闭SPI, SPI_CTRL_REG =0x8000;
) \" @1 V: m, f# ^) t6 u4 J c. `* e SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;% c2 x" @6 S9 Y; `( x) G4 W
开SPI, SPI_CTRL_REG | =0x0001;
# M C: r& j3 e1 d 发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000);
" w4 D" ^& s H( V' s6 l* Y 接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;, ^/ s: |& r+ j9 ]4 v) `
K9 g6 ^, x9 M: t9 r e) z
( F8 Y5 b6 e2 ]) e% ?' W" M
0 l+ r: p, B; Z4 K1 R7 `
第三节 SPI实验
) h+ N1 x3 ?6 v G5 Z2 j5 l8 C
6 B- x& P, o1 w7 L! Z 实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。
3 T7 g" V/ n0 o9 @( N% ` 使用USB转串模块连接手机蓝牙串口,连接方式如下:; C3 A) _+ y* ?9 i! K
(1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:- S' d: W9 D6 y+ I
9 B4 W- F( Q( K$ S/ L; O6 u
: q( r5 @8 i" m3 @. x) B _
图8
+ m( ~$ b; O$ v. `( X7 o; ~ (2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:: P6 I; E7 H3 N
' U2 B8 `, W9 z( K8 v. c
( R) I: P6 n! X& j; N" e5 `3 i 图9( s0 a& l v* }, R" |# u4 T' U; I
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:
, f+ a# \% O! c4 ?, p* |6 C (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
, R" c$ J; V9 N4 @ L: U" S! V
- c o) T. N3 ^ h: R# {
+ U4 D* b2 Z I' v7 n
图10! h7 ~# a* d& B7 o' H/ K/ B
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
/ R8 q" ^* l, m9 F0 S1 e' {' V& D- g3 W, J! Z4 V' H, o; k4 ` k' W
) k/ Y: c$ k H) w4 K* A2 h
图11
8 S" l- |# B) R* Y& T+ g9 X 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。9 B9 _. g6 ~4 a/ {; a8 Z- F& N K1 D0 q
SPI实验的Keil工程为spi_flash.uvproj,位于目录:
2 H1 M* [/ I8 j& P$ R ..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
& ?0 S0 D8 H# L6 P8 N/ o* T" C+ b
1 X- p' U k. V
* x* r& f- n5 V2 ~+ I& \' @
图125 O, }! |. K$ Z, k) T% \/ ~, T
打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:, ~& M+ e/ h% c! B% V2 M' E
( d' q/ f' n& E( o# a: E
) H6 s' Y: f8 t5 S
" i1 o. W8 z8 } g5 e6 `( U" F. }0 N
) T" Z) [% D2 e" E3 i3 T- @1 w) Z& z- |: T
7 r4 N! I3 X6 Q. F' [+ P
图13/ M; Q3 R' Y4 e; p- e4 C" R6 I
) j& w2 ?# a+ U, a& J
# i) T5 h. H" a- f% M! n
6 k% d4 i' ^2 T( Q* g7 R1 q6 F- F: f
配套资料:http://www.fengke.club. h+ S$ D+ G! x
套件地址:http://shop115904315.taobao.com/+ t% y, \3 {, v
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
2 H9 K# b7 m9 n
! |, O5 t- F% V6 p! Y/ i6 ? |
|