|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
SPI教程 ——疯壳·开发板系列
" O. V* f! X; n9 H3 V( c& ^ F4 g9 n! K* |; D! c
: l/ n2 J2 Z. J) b( Q q) K 图17 ^+ e5 ^4 L; L: H
1 d/ v' ~+ ?+ D7 P1 z
9 N( Z+ t0 a( j C1 X
第一节SPI Flash硬件电路; K c8 F1 p# V! t9 H/ Z
+ Y& O, _# E% y( Z7 @ K SPI_Flash可用于存储程序以及一些数据,如果需要存储程序则必须连接在规定的引脚,开发板上选用的mcu引脚分别为:P00,P03,P05,P06,如下图所示:' e, M" A8 v' V* u" S
7 o+ L# P3 C1 ?/ B8 n9 F' `
2 y: A' q, A9 }2 c3 p
图2
) B0 u6 _# n" q+ N9 m, @, Z, C/ @8 I+ Y, \3 T& o' [" L
0 {4 f- g1 i2 o# ~0 S# o% \
/ I1 s6 Y. J8 h) o
第二节 SPI+寄存器, y+ C, d0 N; M# k' M k: z6 W- r& x
6 d# [ _/ G4 I$ ]: }9 C# a
2.1 SPI+介绍
8 G5 U1 m1 d+ _
% C& H1 i2 X6 U% \6 O* i3 o( v& A 这个接口支持SPI总线的一个子集。这个串行接口在主/从模式可以发送和接收8、16或32位,并且在主模式可以发送9位。SPI+接口有双向的2×16位字的FIFO,功能得到了增强。
' e( i' e6 b4 p6 c5 K: a0 ~ 该接口可以工作在主或从模式;有8、9、16、32位的操作方式;SPI控制器的时钟达到16MHz,SPI时钟源可以通过编程进行1、2、4、8分频;SPI的时钟线达到8MHz;支持SPI的0、1、2、3四种工作模式;SPI_DO的空闲电平可以通过编程设置;可屏蔽的中断发生器;单向读和写模式降低总线负载。
- L' D( [6 x" d$ j! q
8 y9 {0 }7 z9 H8 M w9 q% M0 y 2.2 寄存器介绍4 [' f* s7 I3 G" ]) T+ o e
2.2.1 SPI控制寄存器0
7 b( T2 H8 g- J( \; t: b% {2 u+ m' o* p0 t' c* ]
% H% t- l' q* Z2 @ g
: f: d1 k7 r0 `! l( {: C 图3
7 k& F0 |& M0 w- x5 G" A4 r, W 15位:SPI_EN引脚是否有效,’0’表示无效,’1’表示有效;
5 E5 `1 G+ U0 V$ M6 r5 x- z- | 14位:SPI中断使能位,’0’表示无效,’1’表示有效;8 z2 T+ @- z8 g) \
13位:’0’表示接收寄存器或FIFO为空,’1’表示SPI中断,数据已经被发送或接收,该位必须通过软件写SPI_CLR_INT_REG清零;' @0 W0 x7 R1 @& w% a
12位:返回SPI_DI引脚的状态值;0 v6 `4 k5 W9 ~$ n/ _, [
11位:‘0’表示发送FIFO满,‘1’表示发送FIFO空;& {$ _7 h! c; C( O
10位:‘0’正常模式,‘1’使SPIDO的值等于SPI_DO的值;; w# f# V1 K! n z
9位:‘0’正常操作,‘1’复位SPI;
! k( ^( G \- @: | 8:7位:SPI数据格式;
* I# M5 W9 {5 `1 o$ t. u; c 6位:SPI工作模式,‘0’为主设备,‘1’为从设备;
, y! Q& S5 V7 a# n w! s ]5 K7 o/ } 5位:当SPI处于空闲模式或者当SPI_FORCE_DO=1时引脚SPI_DO的值;
- i7 l1 V6 e: L( O 4:3位:SPI在主模式下的时钟频率选择;
& z2 n+ W+ O4 _( c2 ]% o2 s 2位:SPI时钟初始电平的高低,‘0’为低,‘1’为高;' t4 y' J% Q! |5 U/ H, R% d- x
1位:SPI时钟的相位选择,具体看SPI的时序图;(SPI的资料)
8 z! n& S% X. V& Q8 U 0位:SPI的开关。
# W" M0 d& {* [5 d: P- U
& Z# ~& o4 R0 M5 V" |2 a 2.2.2 SPI接收/发送寄存器0 @9 o7 |6 Z0 ~( e# Y( X6 q% ^( X1 l
b- q5 j: m4 E' e
* I4 Y2 e& t6 B- f& i% m
图4( ~. E; V, l% Z, P: t- Y) P( Q( l
15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据。 a8 b6 T5 W% T0 m3 v3 ?$ J- d
* h7 I( ~4 N% I9 D: b
2.2.3 SPI接收/发送寄存器1
8 m4 }! S) |' ^ K9 z
+ D m$ r, i9 t \, O
5 p+ K# [* K- s% N/ E+ s1 h" R 图5
2 x9 s; R) v1 W 15:0位:SPI发送或接收的数据,写操作是,存储发送的数据,读操作时,为接收到的数据;为32位模式的高16位数据。, G8 i2 `1 N+ Y3 |8 S* A9 y3 l4 |% v
1 F! y. @0 G: [. C. u4 o- y
2.2.4 SPI清除中断寄存器" e5 b* j& t) a* V3 a% ?2 E/ J( U
! z0 k( v, g2 o% T2 S+ I
) |) ~. B; D) O( T' |
图6
/ b' X6 `3 {% t7 Z 15:0位:写任意值到该寄存器清除SPI的中断标志。
( o, a% u5 l n& R$ ^0 Z5 [2 q6 ?1 m& K
2.2.5 SPI控制寄存器18 \! a4 s; n% Y" v
6 g# Q/ N5 H! w! h8 J
6 l- {; r( X- I# [, J
1 _4 I5 l; c. B* D 图7
) T% Q+ n l# H: q5 s 15:5位:保留不使用;7 x' U' R2 L6 n S/ H& D
4位:决定在9位模式下的第一位的值;
6 u/ a5 W; n+ G; M8 D 3位:SPI忙标志位,‘0’表示SPI空闲,‘1’表示SPI忙;+ J* h6 ^6 T* B' F$ O# M% s
2位:SPI优先级选择位,‘0’低优先级,‘1’高优先级;
) e Y9 b# R( x0 C 1:0位:SPI_FIFO模式。
9 }+ J5 G, n' `. ~/ l, U! f4 D n3 d
2.3 寄存器配置讲解
. W9 e U: l r; [1 a #define CLK_PER_REG (* ( volatile uint16*)0x50000004)
" |3 U0 C8 ~+ S$ X1 }* @ #define SPI_CTRL_REG (* ( volatile uint16*)0x50001200)
8 V2 K( D3 L6 I #define SPI_RX_TX_REG0 (* ( volatile uint16*)0x50001202)5 U. w" N5 O. ]& a
#define SPI_RX_TX_REG1 (* ( volatile uint16*)0x50001204)) ?, V/ ~/ M# F
#define SPI_CLEAR_INT_REG (* ( volatile uint16*)0x50001206) Q1 U1 T& @; o- q! _
#define SPI_CTRL_REG1 (* ( volatile uint16*)0x50001208). u8 E$ P0 Q3 O& Z L
启动SPI模块的时钟:CLK_PER_REG |= 0x0800;
v9 b7 r+ x6 p6 e3 ?4 O# {0 u SPI的初始化配置寄存器:$ c0 i+ y" R. N% Y2 f: {3 ^
先关闭SPI, SPI_CTRL_REG =0x8000;
# Z' c, i7 e5 ^2 s! K+ g SPI配置为8位模式,主模式,时钟空闲为低电平,相位模式0,关闭SPI中断,时钟8分频(0x1000000000000000),则SPI_CTRL_REG =0x8000;
% q, V6 d! O; V F 开SPI, SPI_CTRL_REG | =0x0001;0 t* e6 q$ i) J
发送一个字节0x55,将数据填充进发送寄存器SPI_RX_TX_REG0 = 0x55;等待发送寄存器为空while(SPI_CTRL_REG&0x2000); E+ P u" C+ r. }" `& u0 E) D1 H
接收一个字节,读取接收寄存器rx_data = SPI_RX_TX_REG;. ~ c5 a( a7 T: i5 l! e* y3 _
/ d2 W8 c. f) Q. _8 O ]
5 `7 g6 H3 u4 y7 n( _% k9 ]. B* b
& l7 ^2 H Q; `- _0 z0 E5 e. {3 g: j 第三节 SPI实验 j9 V. j+ _2 `5 `1 `
# y$ ~. Q( \" N- P! E- }: o7 `
实验需要使用的模块有:手机开发板底板,Jlink调试工具,USB转串模块、杜邦线、3.7V锂电池或Mocro USB线。. d7 W" u& i0 Y5 ]0 i8 |
使用USB转串模块连接手机蓝牙串口,连接方式如下:
u4 y, e# ?7 R" M2 l (1)USB转串模块一端只需要使用杜邦线连接RXD、TXD、GND三个引脚,如下图所示:
; s. d) A- F& G; r- a! m. H2 [, U7 X) Y
* J/ `0 u1 N; z
图8' j2 k/ J: `1 u o
(2)手机主控底板一端需要使用杜邦线连接左侧J7三个引脚,与USB转串模块的引脚一一对应(串口引脚交叉),分别为RXD-->TXD、TXD-->RXD、GND-->GND,如下图所示:
8 o/ o$ S" Z) U( k1 K5 o$ `; L/ p `. N
. x; N! ^7 ?- P, {* M. h) D1 p 图9# p& x1 z' `7 T& R5 |/ L$ i& E9 ?
使用JLINK通过杜邦线连接手机蓝牙,连接方式如下:
8 T9 ]0 S; r& t( M y" X/ H (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
v" b ?$ b8 {8 {5 S
7 x' O) G0 C1 U% X& P1 P
3 |, `7 z$ o9 o$ @
图104 ?; f- y! T. r/ t9 _6 D# X v
(2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
6 I) {3 A. u5 X# W' |( k7 w
2 u4 z7 S% K4 ?8 V j2 w* k
0 ~7 u! e3 a6 Z- E 图11
0 n5 i- p* r8 F0 p8 l1 `: ? 将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。+ y- d$ h! X6 X r: z3 |7 V( V. K
SPI实验的Keil工程为spi_flash.uvproj,位于目录:2 B5 t6 L; y* |6 V" \3 _8 I
..\WT_Mobile\1.初级教程\DA14580\6_初级_SPI\projects\target_apps\peripheral_examples\spi\spi_flash\Keil_5,如下图所示:
2 u0 j$ L! T, [/ N! k/ l+ ~$ \" ?- H% I6 V+ U7 a/ N
8 F. P$ B1 {1 l( q) Q4 q$ _ 图12
. \, i. A7 i( o* C# ?4 x 打开串口调试助手连接串口模块。在KEIL中编译源代码,点击DEBUG,然后点击全速运行,就看到串口打印出的读写Flash的信息,如下图所示:8 y2 e, V5 V; H. }
; w: V% n# `. t9 W) E
9 a: K% e, E: N2 Z
2 i0 ?, n' Z. \. ~# O4 u4 o
% O0 b0 z; N% d' a6 v4 h ^/ f/ ?$ m9 B% m1 C I
! ?' G4 ?4 M( f6 J1 m
图13' c. G$ g0 e# s) V
; v' ^0 ^6 ~! }- Y- t
0 n0 s0 P, |1 V1 M, E& z- _1 C! K5 P8 q' O
配套资料:http://www.fengke.club; c1 E: o5 V0 M6 k/ C$ E
套件地址:http://shop115904315.taobao.com/. A* z! L+ |- F+ p, u
文件下载请点击:
SPI教程.pdf
(1.03 MB, 下载次数: 0)
( z* x# f" ~9 n7 V- F! k
, W( E5 g) H4 ^1 o! J5 K5 \ |
|