|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多自由度人形双足舞蹈机器人 ——疯壳·机器人开发系列 外部 Flash 读写
; L3 J" z4 ~% F) D4 q1 L3 e: T" O
8 F6 f- t5 Y& `0 G0 g
; T# Y2 ^' j/ Q" M1 N9 }
# P( \- y: c, c. p1 W e0 m 1SPI 简介
- z" P& s# Q# E
: w: L# f7 V' k& a4 k 本章将使用 IAP15W4K61S4 单片机的 SPI 接口,对外部 Flash 进行读写操作。3 E2 T5 J" w5 G2 p0 U9 E
* @& b# r0 \/ p1 H
SPI 是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达 3Mbps 的速率(工作频率为 12MHz 时,如果 CPU 主频率采用 20MHz 到 36MHz,就可以更高,从模式时速度无法太快),还具有传输完成标志和写冲突标志保护。SPI 的功能框图如下图所示:, C1 l' u8 e& T: G( S0 m& H
& F2 c. J' E+ r$ E# f
. @# B1 D( [6 N* J3 M
图 1
9 w' c! R* N' Q) N1 K0 v4 E SPI 接口其实是一个 8 位移位寄存器和数据缓冲器,数据可以同时发送和接收。在 SPI 数据的传输过程中,发送和接收的数据都存储在数据缓冲器中。
5 ^9 r, Y) O( J, T) E! V, z
' c$ |9 @0 \7 }4 [; f 对于主模式,如果要发送一个字节的数据,只需要将这个数据写到 SPDAT 寄存器中。主模式下/SS 信号不是必须的,但是在从模式下,必须在/SS 信号变为有效并接受到合适的时钟信号后,方可进行数据传输。在从模式下,如果一个字节传输完成后,/SS 信号变为高电平,这个字节立即被硬件逻辑标志为接收完成, SPI 接口准备接收下一个数据。" \# P* t( \! v* L! K* k3 ?
2硬件设计1 k5 n) c. B# k; B" B3 H8 |
% \' s$ ]+ R1 L- N* m
本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS 用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash 的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。具体的硬件连接如下图所示。
/ s/ A1 e# Z; ]4 b
, T) N) y2 v2 e# V! b1 H
6 P. q$ I4 g4 M& }/ k# i 图 2
3 d& J9 R& {, D0 W2 Q2 x+ c* z' W; l 3软件设计
1 P$ b3 @) o2 N, g4 W
9 e3 D6 T2 I: r0 h# Q1 g3 w8 A 本次软件设计主要是讲解 SPI 读写外部 Flash,在此之前,先简要介绍 3 个与6 [' `+ U% A, u' h3 \
0 e# x$ X& @8 y' K2 T* ^& T
SPI 相关的主要寄存器,其它相关寄存器可以参考官方数据手册中的相关章节。
% u2 E: D. E6 g6 }% w
- O& L+ k4 q5 a/ X (1)SPI 控制寄存器 SPCTL$ P+ k. r& I- A( V! C+ L
/ Y3 ^9 |9 n4 \# I
7 `: h* t1 x7 x2 c) ?! i 图 3& f8 T5 h* N/ @1 j, }
SSIG:SS 引脚忽略控制位。# ~ r3 U) I0 N8 e
! C1 P* Q, I k9 K
SSIG=1,MSTR(位 4)确定器件为主机还是从机。SSIG=0,SS 脚用于确定器件为主机还是从机。9 ~) h7 U8 C: s+ `3 |
SPEN:SPI 使能位。
2 \3 i/ H6 w e X0 t1 {% w* l5 R% }% X7 x$ T
SPEN=1,SPI 使能。
' u% I4 r: E7 \3 |( b6 x2 r+ j$ ]5 _& }0 g1 E* C* Q
SPEN=0,SPI 被禁止,所有 SPI 引脚都作为 I/O 使用。
8 V! p0 _) w/ ^+ C: B1 u6 g$ ~: D v" `5 ?- O7 O
DORD:设定 SPI 数据发送和接收的位顺序。DORD=1,数据字的最低位最先发送。DORD=0,数据字的最高位最先发送。4 P9 u. N* e+ X
MSTR:主/从模式选择位。CPOL:SPI 时钟极性。
+ i5 V- @" ^( S3 I' U CPOL=1,SCLK 空闲时为高电平。SCLK 的前时钟沿为下降沿而后沿为上升沿。: V1 Q+ s8 p) h! N4 c
: b! b V/ t; W1 z( I. B P0 K$ F
CPOL=0,SCLK 空闲时为低电平。SCLK 的前时钟沿为上升沿而后沿为下降沿。% _1 o1 o& l. w; Q1 J* e& v
2 g: N4 E+ c" V CPHA:SPI 时钟相位选择。' I! }- S' h; Y# }
/ g- `2 q+ B- l3 G, p
CPHA=1,数据在 SCLK 的前时钟沿驱动,并在后时钟沿采样。0 _, @- {& |4 s; D% Q
6 [& u% w, N4 W
CPHA=0,数据在/SS 为低时被驱动,在 SCLK 的后时钟沿被改变,并在前时钟沿被采样。3 {1 d$ E% K* Q$ ^
SPR1、SPR0:SPI 时钟频率选择控制位。如下图所示:" K1 |- d: O$ x/ x
. u* A0 X) x) }* [
9 C ^ H! |7 o& B8 a1 ?( }
图 4
) H9 d+ f. R- ?0 y: Z( f! _' p& s0 U- k (2)SPI 状态寄存器 SPSTAT5 |: o8 H0 M* s( W
0 u/ C9 B9 a( M
7 M: Q$ _7 R8 H6 L, o 图 5
& t- l9 ?4 Z7 J0 S- b0 C; m- b SPIF:SPI 传输完成标志
1 I# m2 e' w W7 d" [3 f: \% b) m. H+ U# n- Z/ y+ p& R9 D
当一次串行输出完成时,SPIF 置位。此时,如果 SPI 中断被打开,则产生中断。当 SPI 处于主模式且 SSIG=0 时,如果/SS 为输入并被驱动为低电平,SPIF 也将置位,表示“模式改变”。SPIF 标志通过软件向其写入“1”清零。WCOL:SPI 写冲突标志。
: Y+ k( h+ A4 K( B$ d0 o# R 在数据传输的过程中如果对 SPI 数据寄存器 SPDAT 执行写操作,WCOL 将置位。WCOL 标志通过软件向其写入“1”清零。' c& m, m b$ r( q* @
(3)控制 SPI 功能切换的寄存器 AUXR1(P_SW1)& g. r% Q) [! U) F
1 T( F( V# Y p5 [9 R6 q
" G( N f5 E s( `; {; o
图 6
" o4 ^. X* S7 `6 {1 J. u
3 }& }3 G# r+ x4 b! @' f
% J5 N1 A- }# X8 f$ Y
图 7
9 C. l, T e2 ^: I- Z- i DSP:SPTR 寄存器选择位。8 M- y9 N5 Z% K/ \
* E, n3 o, q, x1 V" J 0,使用缺省数据指针 DPTR0。
' d8 f% J8 m( N& w3 _8 G1 S+ w 1,使用另一个数据指针 DPTR1。首先看一下 SPI 初始化函数。0 d1 Y! m6 {7 Q" @0 b5 z
4 n6 x+ t1 \# w, W" A
; `0 r' @3 i4 w n, K0 {, F/ s/ ~: [. R 代码1# J4 H! O5 k" t3 H7 F
: x. o# r; C. q
SPI 初始化函数,其实就是配置 SPI 相关寄存器的几个位。当然,大家也可以按照自己的实际需求进行配置。
9 Y+ v: B. t q% _# _ 完成 SPI 初始化之后,就可以使用 SPI 发送接收函数。1 u' y8 @9 G7 P6 J/ v
# E7 o1 n" w9 m2 Y0 D+ l
" L0 s' C( L$ c2 u. ^% h 代码2
; Q* |" R3 d/ I" H
8 ^. j' Y- Z" i 在 SPI_SendByte(u8 SPI_SendData)函数中,首先是将要发送的数据放入 SPI 数据寄存器SPDAT 中,然后判定 SPI 状态寄存器 SPTAT 中的 SPIF 位。等待数据写入完成之后,清除中断标志和写冲突标志。由于 SPI 为双工通讯,最后就能返回得到的数据。
Q5 w w- [- N0 N7 ?7 G 关 于 外 部 Flash W25X20CL 的 使 用 , 其 实 就 是 通 过 SPI_SendByte(u8 SPI_SendData)写指令、写地址、写数据。外部 Flash 的使用方法详情可以读数据手册。
9 k f1 m" U; O6 M P- ^) x) J; u 另外,本次实验还用到了串口,串口的使用方法可以阅读前面的章节:串口控制舵机原理。/ s/ Z5 L! M4 n/ ]% q# j1 o
4 实验现象
4 F" O: l* Z @1 `
2 `: E4 V, T/ ?3 D( G 首先打开下载软件 STC-ISP。6 |- u! ]$ C* k$ q$ _2 d
2 J$ b; K# k4 ^/ L/ u
" G4 {' K6 z9 ~- D, y+ ~ 图 8
! s( H4 A0 K( c8 V (1)点击 Keil 仿真设置,添加 STC 相关的头文件。STC 的相关头文件路径是我们之前安装 Keil C51 的路径,如果之前采用的默认路径,那么选择 C 盘 Keil 文件夹。
# j! ~2 @# @1 \ Z# f7 w5 @( X+ ]2 l1 |' K4 C$ o7 k, F5 X
; a. u) y2 E# S* P7 V
图 9$ i2 ~# b8 J( A/ G
(2)添加完 STC 相关的头文件,点击弹窗中的确定。' h: N, ~9 A. |! s$ g" H
7 }% b% ~! F' g! @7 s g
; ]& ]/ ?0 q4 {- ~: S 图 10
* s/ L4 @' n# @% ]0 e; R) a/ ^1 x0 z6 G8 s* Y. f
(3)设置单片机的型号、最低波特率、最高波特率如下图所示,硬件选项等选项默认即可。串口号根据实际情况选择。9 G0 C# W: H( @1 A& ~2 b0 |
* e4 u# o# C* s! I; \
8 ^$ s$ |- G7 f: L) Z# ~ 图 11
/ A: J- e4 P% |+ v8 E (4)点击打开程序文件,选择我们例程中的.hex 文件。
2 C) \5 S8 E8 L. j/ r- w- d5 A" d" d, M0 [+ O W
2 m7 M! i( @( Q) w( ]8 S: U& Z
图 12
" @* t# }! u, d- d0 s1 @" E! U2 {& r (5)点击下载/编程,下载代码。) L8 l- M0 V% ^" g7 o
2 J$ ~% k; n- I5 Y4 ~0 v1 u
; ^6 I$ K S% D5 X$ v$ d# k. b U
图 13
7 l; o! ~/ x" ~1 i4 l
2 X: S- d3 j. s' Y2 x8 x (6)按一下电路板上面的 RST 按键,完成下载。
' d! n2 d* [4 s! A$ F9 b
. P$ F% L; J0 j
" U, _' H" H7 N8 P% j( p2 _$ e
图 145 j4 g; ^7 }) C$ t+ L( a. i
代码下载完成之后,打开串口调试助手,如下图所示。1 T2 O" K8 X/ R1 F
- S0 F$ V& K2 I/ _ (1)选择串口号,我们图中是 COM1,这个根据实际情况选择。/ b; M' `& o, U- G! _
- D% D8 f( P4 j) x# o5 |) I (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。8 ~! Q/ v( { {1 b+ U& y
(3)点击打开串口。
3 r$ U. @+ a! z! {0 u+ q. a. D/ v7 b8 k, ~* E
2 k( y2 L$ k5 D 图 15
8 }, {3 |* Q2 B 完成上述操作,运行代码之后,就会看到串口调试助手区域 4 中会显示出读写 Flash 的数据信息。
3 u5 c) N+ h5 K4 e T0 D3 j
7 K# y" `. m) s/ {+ [
9 h+ ~5 k+ r) P8 G8 H- t8 m2 Z 图 16- j9 R0 }3 P' e3 E# a/ T# D
7 p$ Y3 {% {& R5 T" i
7 ~4 M7 C$ V6 b- B. N9 O" \1 l
4 u/ \! u- e1 E: y
文件下载请点击:
6_外部Flash的读写.pdf
(1.35 MB, 下载次数: 0)
0 a5 ]+ z5 ~7 b1 R" \2 C# i
0 e8 t9 Q/ F1 L+ l" _3 e4 s1 N9 n2 E [
|
|