|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多自由度人形双足舞蹈机器人 ——疯壳·机器人开发系列 外部 Flash 读写 / Z+ u q( I" F& _
. R/ c& R; Q% S6 m/ \
3 j6 V9 i9 `7 @. L* C( Z' P# X4 Z/ X. R
1SPI 简介
2 {2 C4 ^- C8 l2 G. B% i7 h* U3 `1 u8 \6 t2 D
本章将使用 IAP15W4K61S4 单片机的 SPI 接口,对外部 Flash 进行读写操作。
- l" Y7 T* z6 m; a' o3 V2 \$ W
' K" t/ |3 G, A2 B! }" y SPI 是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达 3Mbps 的速率(工作频率为 12MHz 时,如果 CPU 主频率采用 20MHz 到 36MHz,就可以更高,从模式时速度无法太快),还具有传输完成标志和写冲突标志保护。SPI 的功能框图如下图所示:3 K s! h6 j+ d( S6 R
p& T: o0 I2 R9 ]% i
5 d' w! C$ L: i$ W6 w k
图 1
3 I; U' c# ~, {; k SPI 接口其实是一个 8 位移位寄存器和数据缓冲器,数据可以同时发送和接收。在 SPI 数据的传输过程中,发送和接收的数据都存储在数据缓冲器中。
6 q/ Y' R/ ?; d+ h; ^# o7 p3 Z( R3 b6 W! N& v$ r
对于主模式,如果要发送一个字节的数据,只需要将这个数据写到 SPDAT 寄存器中。主模式下/SS 信号不是必须的,但是在从模式下,必须在/SS 信号变为有效并接受到合适的时钟信号后,方可进行数据传输。在从模式下,如果一个字节传输完成后,/SS 信号变为高电平,这个字节立即被硬件逻辑标志为接收完成, SPI 接口准备接收下一个数据。, c. F6 I8 a. t1 o* H& D O W
2硬件设计
( c5 I7 k* x* g: D( q6 B6 E3 }) [; T, P/ P* z# a. B
本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS 用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash 的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。具体的硬件连接如下图所示。
* d( k/ i: `8 L5 t. p1 e& q: M8 I" r4 n* Y- q0 |
, _; e; S2 j4 ]- o
图 2
' A4 B# @4 [. M. |1 `3 z1 `, U 3软件设计5 |7 u! r. H, B7 W
) A# `' g' r+ ^
本次软件设计主要是讲解 SPI 读写外部 Flash,在此之前,先简要介绍 3 个与* k1 l6 u# p+ ?1 q( n
( k* z8 g7 O: p J0 S8 q SPI 相关的主要寄存器,其它相关寄存器可以参考官方数据手册中的相关章节。/ I J, L! C3 K
9 P- ?& j' g# g
(1)SPI 控制寄存器 SPCTL
" t% \6 B' m) f
+ }: {% [5 _# S
5 k0 I7 j- D! R 图 3
& Y, L8 t: p9 ~ SSIG:SS 引脚忽略控制位。
" s" N" n+ [$ e1 C5 [0 W2 |$ E
7 f) r* w( |/ h$ [7 J2 p SSIG=1,MSTR(位 4)确定器件为主机还是从机。SSIG=0,SS 脚用于确定器件为主机还是从机。
% F" b" u# \( F; F, ^ SPEN:SPI 使能位。
+ R1 Q! t. u4 G& f( ]( V& ^# O
- Y) r, t% x. l) J0 e. M3 D SPEN=1,SPI 使能。$ _- S4 z+ q0 W+ l9 v
8 U6 j5 U1 o; U- X
SPEN=0,SPI 被禁止,所有 SPI 引脚都作为 I/O 使用。6 C4 t- b2 D; z6 E. U1 B7 j
U. H1 W. I; T DORD:设定 SPI 数据发送和接收的位顺序。DORD=1,数据字的最低位最先发送。DORD=0,数据字的最高位最先发送。! H4 N+ ^2 H0 C* [
MSTR:主/从模式选择位。CPOL:SPI 时钟极性。
$ `+ r/ ~$ H7 [' ~, p" b CPOL=1,SCLK 空闲时为高电平。SCLK 的前时钟沿为下降沿而后沿为上升沿。
" m, q6 ?" x$ c" B$ I; r J, X: \; P! u, }% ^8 s1 ?
CPOL=0,SCLK 空闲时为低电平。SCLK 的前时钟沿为上升沿而后沿为下降沿。
6 c7 V$ B! j P' t' w& h
9 b: N1 z8 v0 r- |- Y. `2 ~6 p% k CPHA:SPI 时钟相位选择。
2 @" z! A- O4 A- G6 u7 u1 @- y7 J0 u, K& A5 f& H% D; E
CPHA=1,数据在 SCLK 的前时钟沿驱动,并在后时钟沿采样。# E M8 r7 [, V, C& y& G! ^
9 y- [7 B* q2 Q) u0 D
CPHA=0,数据在/SS 为低时被驱动,在 SCLK 的后时钟沿被改变,并在前时钟沿被采样。
$ y# D- @ p: F0 k/ Z" E0 B SPR1、SPR0:SPI 时钟频率选择控制位。如下图所示:
- l. v" T! V' o+ ~7 q3 T, ^8 w7 |: h7 W: f M1 l8 M
) Y* c m5 |8 s# l+ p+ ~- V
图 4* N# U: F2 b4 @" P! H/ d- O
(2)SPI 状态寄存器 SPSTAT
6 ?" d, @! b i# G# X, _' [% n. J, u( Y" n b
1 l( t. T& c ?$ q0 ]$ s* |# | 图 5- e9 n/ i3 w) _7 M n
SPIF:SPI 传输完成标志8 ]& e4 H( o v2 h3 J5 x7 b. d
( A7 Z; l7 D0 ^( S' j
当一次串行输出完成时,SPIF 置位。此时,如果 SPI 中断被打开,则产生中断。当 SPI 处于主模式且 SSIG=0 时,如果/SS 为输入并被驱动为低电平,SPIF 也将置位,表示“模式改变”。SPIF 标志通过软件向其写入“1”清零。WCOL:SPI 写冲突标志。
' s" ^9 v( h9 [# E5 a2 j 在数据传输的过程中如果对 SPI 数据寄存器 SPDAT 执行写操作,WCOL 将置位。WCOL 标志通过软件向其写入“1”清零。
. G& F/ O5 w8 @ (3)控制 SPI 功能切换的寄存器 AUXR1(P_SW1)% }; M5 x2 C% {8 h
: X* }% ?7 C1 l. Z. [3 o9 t) ~
0 s( W5 C) S4 w
图 6
/ ?- X+ w; `1 R" \
9 S6 m; i5 V3 H
: I1 J5 y& d: C, C D
图 7
/ w% A3 n: w0 r# h DSP:SPTR 寄存器选择位。
8 v2 S, c( k7 J f) ?4 K& r9 V" }& Q1 @9 P' R- D# |; |- _6 ]
0,使用缺省数据指针 DPTR0。% p, s( ^ Z. _1 v A- \ k
1,使用另一个数据指针 DPTR1。首先看一下 SPI 初始化函数。5 X5 `% |# A0 ]2 j& y
0 O. O* G+ a6 G+ d& F
) `4 D, F1 y' W- C" p0 ~
代码16 i; x# _ }- F! k w1 L% i; M
2 A; ]: B; z7 S( I9 M SPI 初始化函数,其实就是配置 SPI 相关寄存器的几个位。当然,大家也可以按照自己的实际需求进行配置。
2 G Z' ^ M& s8 q7 m9 r5 p 完成 SPI 初始化之后,就可以使用 SPI 发送接收函数。# w+ j* z+ k1 }/ T7 M& m6 P
( s# M5 |$ l7 }+ `6 {$ y5 v
4 P+ d" R# Q. z5 ]( T
代码26 W7 L: s6 o$ Q3 Z4 { e: Q) R6 W
+ i3 f& W; V$ F3 Q: X 在 SPI_SendByte(u8 SPI_SendData)函数中,首先是将要发送的数据放入 SPI 数据寄存器SPDAT 中,然后判定 SPI 状态寄存器 SPTAT 中的 SPIF 位。等待数据写入完成之后,清除中断标志和写冲突标志。由于 SPI 为双工通讯,最后就能返回得到的数据。0 Z8 E5 r8 J3 x& B6 B/ k
关 于 外 部 Flash W25X20CL 的 使 用 , 其 实 就 是 通 过 SPI_SendByte(u8 SPI_SendData)写指令、写地址、写数据。外部 Flash 的使用方法详情可以读数据手册。
8 w5 s1 [4 [& f* B8 x3 e 另外,本次实验还用到了串口,串口的使用方法可以阅读前面的章节:串口控制舵机原理。. U1 ~* }# W. t) f: \( J
4 实验现象
7 W+ B2 \+ K% s* S2 M+ e2 K$ P6 v; i% c) ]2 g0 y) J# l- q
首先打开下载软件 STC-ISP。
- i* J8 v( L' q2 D: @$ m7 g* r. w" W. I7 y/ s( l# m( K
/ c2 h% l2 A- h
图 8
4 f& S5 Q5 T) A- ?( ?9 c5 ` (1)点击 Keil 仿真设置,添加 STC 相关的头文件。STC 的相关头文件路径是我们之前安装 Keil C51 的路径,如果之前采用的默认路径,那么选择 C 盘 Keil 文件夹。$ U* t, [, z8 a# O7 I
/ @. |+ Y9 ]) m4 p- x* F: C( G
- z3 \ D3 p& m& o/ v
图 9% z9 F# v; A$ m: v* s ~3 s
(2)添加完 STC 相关的头文件,点击弹窗中的确定。
; k) C; S4 B6 G+ Z. l8 H$ a u9 o5 o! j, k: q/ h
* x8 h, Q6 x$ D" s3 G 图 10( d% s$ {: Z! C8 D# b" y5 l
: c9 m0 {& i I) Z5 w6 d3 P (3)设置单片机的型号、最低波特率、最高波特率如下图所示,硬件选项等选项默认即可。串口号根据实际情况选择。
* s# P& J' u7 e( a, d$ C& @
+ @' O; N" J4 m4 y2 A
3 s* S* K* X4 O9 k4 f9 U! N3 a; \. B
图 11
. A9 c/ L {4 t (4)点击打开程序文件,选择我们例程中的.hex 文件。
7 m7 H' D& o8 }) k* e
( P; O! \" C& }6 F( O
2 k! ^7 ^% w7 J/ p, n7 C4 t8 M1 t! a% L 图 12* P% ]* B- G& E6 @% m1 z% |: N
(5)点击下载/编程,下载代码。# F; I1 B7 ^: q; d4 R- b( B
: X7 z2 o5 K4 F$ ?1 P) p8 F+ I
+ n; P% t( Z% D3 {4 d4 M8 l 图 13
9 d7 D$ Y% L1 N: F0 h) L- j3 \* p2 F- i! Y$ U" c& b2 o# y' z, o; }
(6)按一下电路板上面的 RST 按键,完成下载。* \5 p% o0 {; P$ E6 d$ ~+ U
8 C7 L" l0 @3 n# w1 D, s; L8 r5 O
0 d( ]7 o, s8 Y3 a8 J 图 14
, m. D0 |8 q, p5 |9 V 代码下载完成之后,打开串口调试助手,如下图所示。" y, O! S* e2 V3 D
0 C* s& H! x' |9 W3 ]. W (1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
9 g7 D: q' {$ Y; E1 U; u1 G% _
% j# S+ x& X7 ^ (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。8 O: N) n) r; X- T8 ~& w- Z0 b
(3)点击打开串口。2 X' G* m! k- X3 M: \: o' ^
9 t& ?6 U8 v3 j. [" A" _6 G# [* @
: X' s2 z/ P9 M! p; Z- B' H& B 图 15
1 C7 z; w- B% l$ h4 a& @* K 完成上述操作,运行代码之后,就会看到串口调试助手区域 4 中会显示出读写 Flash 的数据信息。 P7 _. w* N5 m9 s$ w
1 c- ]: g* N* y, ^6 [: O
8 m$ P/ b& c# w/ m5 E 图 169 p2 Z7 O, q, l4 a \* R$ I, o
; f1 F1 L5 q6 s4 d2 ?; a- ]. F) i6 \$ E0 B% x
( f% F- E% I* m
文件下载请点击:
6_外部Flash的读写.pdf
(1.35 MB, 下载次数: 0)
2 A2 W7 P6 l+ T8 N5 ^' k/ ^
, V4 J/ j0 _" X; f7 a" H9 D- O' u2 a/ N' ^
|
|