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

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

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-26 23:25 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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