找回密码
 注册
关于网站域名变更的通知
查看: 200|回复: 0
打印 上一主题 下一主题

【疯壳·机器人教程7】人形街舞机器人-外部 Flash 读写

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-25 11:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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  [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 02:00 , Processed in 0.140625 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表