多自由度人形双足舞蹈机器人
外部 Flash 读写
——疯壳·机器人开发系列
1SPI 简介
本章将使用 IAP15W4K61S4 单片机的 SPI 接口,对外部 Flash 进行读写操作。
SPI 是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达 3Mbps 的速率(工作频率为 12MHz 时,如果 CPU 主频率采用 20MHz 到 36MHz,就可以更高,从模式时速度无法太快),还具有传输完成标志和写冲突标志保护。SPI 的功能框图如下图所示:
图 1
SPI 接口其实是一个 8 位移位寄存器和数据缓冲器,数据可以同时发送和接收。在 SPI 数据的传输过程中,发送和接收的数据都存储在数据缓冲器中。
对于主模式,如果要发送一个字节的数据,只需要将这个数据写到 SPDAT 寄存器中。主模式下/SS 信号不是必须的,但是在从模式下,必须在/SS 信号变为有效并接受到合适的时钟信号后,方可进行数据传输。在从模式下,如果一个字节传输完成后,/SS 信号变为高电平,这个字节立即被硬件逻辑标志为接收完成, SPI 接口准备接收下一个数据。
2硬件设计
本次我们所使用的外部 Flash 是 W25X20CL,它一共有 8 个引脚。1 号引脚 CS 用于芯片的选择。2 号引脚 DO 是数据输出引脚。3 号引脚 WP 是写保护。4 号是GND。5 号 DIO 引脚既可以作为数据输入,也可以作为数据输出。6 脚 CLK 是 Flash 的串行时钟信号。第 7 脚用于暂停 SPI 的通信。最后 VCC 就是电源脚。具体的硬件连接如下图所示。
图 2
3软件设计
本次软件设计主要是讲解 SPI 读写外部 Flash,在此之前,先简要介绍 3 个与
SPI 相关的主要寄存器,其它相关寄存器可以参考官方数据手册中的相关章节。
(1)SPI 控制寄存器 SPCTL
图 3
SSIG:SS 引脚忽略控制位。
SSIG=1,MSTR(位 4)确定器件为主机还是从机。SSIG=0,SS 脚用于确定器件为主机还是从机。
SPEN:SPI 使能位。
SPEN=1,SPI 使能。
SPEN=0,SPI 被禁止,所有 SPI 引脚都作为 I/O 使用。
DORD:设定 SPI 数据发送和接收的位顺序。DORD=1,数据字的最低位最先发送。DORD=0,数据字的最高位最先发送。
MSTR:主/从模式选择位。CPOL:SPI 时钟极性。
CPOL=1,SCLK 空闲时为高电平。SCLK 的前时钟沿为下降沿而后沿为上升沿。
CPOL=0,SCLK 空闲时为低电平。SCLK 的前时钟沿为上升沿而后沿为下降沿。
CPHA:SPI 时钟相位选择。
CPHA=1,数据在 SCLK 的前时钟沿驱动,并在后时钟沿采样。
CPHA=0,数据在/SS 为低时被驱动,在 SCLK 的后时钟沿被改变,并在前时钟沿被采样。
SPR1、SPR0:SPI 时钟频率选择控制位。如下图所示:
图 4
(2)SPI 状态寄存器 SPSTAT
图 5
SPIF:SPI 传输完成标志
当一次串行输出完成时,SPIF 置位。此时,如果 SPI 中断被打开,则产生中断。当 SPI 处于主模式且 SSIG=0 时,如果/SS 为输入并被驱动为低电平,SPIF 也将置位,表示“模式改变”。SPIF 标志通过软件向其写入“1”清零。WCOL:SPI 写冲突标志。
在数据传输的过程中如果对 SPI 数据寄存器 SPDAT 执行写操作,WCOL 将置位。WCOL 标志通过软件向其写入“1”清零。
(3)控制 SPI 功能切换的寄存器 AUXR1(P_SW1)
图 6
图 7
DSP:SPTR 寄存器选择位。
0,使用缺省数据指针 DPTR0。
1,使用另一个数据指针 DPTR1。首先看一下 SPI 初始化函数。
代码1
SPI 初始化函数,其实就是配置 SPI 相关寄存器的几个位。当然,大家也可以按照自己的实际需求进行配置。
完成 SPI 初始化之后,就可以使用 SPI 发送接收函数。
代码2
在 SPI_SendByte(u8 SPI_SendData)函数中,首先是将要发送的数据放入 SPI 数据寄存器SPDAT 中,然后判定 SPI 状态寄存器 SPTAT 中的 SPIF 位。等待数据写入完成之后,清除中断标志和写冲突标志。由于 SPI 为双工通讯,最后就能返回得到的数据。
关 于 外 部 Flash W25X20CL 的 使 用 , 其 实 就 是 通 过 SPI_SendByte(u8 SPI_SendData)写指令、写地址、写数据。外部 Flash 的使用方法详情可以读数据手册。
另外,本次实验还用到了串口,串口的使用方法可以阅读前面的章节:串口控制舵机原理。
4 实验现象
首先打开下载软件 STC-ISP。
图 8
(1)点击 Keil 仿真设置,添加 STC 相关的头文件。STC 的相关头文件路径是我们之前安装 Keil C51 的路径,如果之前采用的默认路径,那么选择 C 盘 Keil 文件夹。
图 9
(2)添加完 STC 相关的头文件,点击弹窗中的确定。
图 10
(3)设置单片机的型号、最低波特率、最高波特率如下图所示,硬件选项等选项默认即可。串口号根据实际情况选择。
图 11
(4)点击打开程序文件,选择我们例程中的.hex 文件。
图 12
(5)点击下载/编程,下载代码。
图 13
(6)按一下电路板上面的 RST 按键,完成下载。
图 14
代码下载完成之后,打开串口调试助手,如下图所示。
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
(2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
(3)点击打开串口。
图 15
完成上述操作,运行代码之后,就会看到串口调试助手区域 4 中会显示出读写 Flash 的数据信息。
图 16