查看: 1290|回复: 0

[资料] 【疯壳·人形街舞机器人开发教程7】外部 Flash 读写

[复制链接]
  • TA的每日心情
    开心
    2022-4-17 15:37
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2022-5-31 17:50:24 | 显示全部楼层 |阅读模式
    分享到:
    多自由度人形双足舞蹈机器人
    外部 Flash 读写
    ——疯壳·机器人开发系列



        1SPI 简介

        本章将使用 IAP15W4K61S4 单片机的 SPI 接口,对外部 Flash 进行读写操作。

        SPI 是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达 3Mbps 的速率(工作频率为 12MHz 时,如果 CPU 主频率采用 20MHz 到 36MHz,就可以更高,从模式时速度无法太快),还具有传输完成标志和写冲突标志保护。SPI 的功能框图如下图所示:

    1.png    
        图 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.png    
        图 2
        3软件设计

        本次软件设计主要是讲解 SPI 读写外部 Flash,在此之前,先简要介绍 3 个与

        SPI 相关的主要寄存器,其它相关寄存器可以参考官方数据手册中的相关章节。

        (1)SPI 控制寄存器 SPCTL

    3.png    
        图 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.png    
        图 4
        (2)SPI 状态寄存器 SPSTAT

    5.png    
        图 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.png    
        图 6

    7.png    
        图 7
        DSP:SPTR 寄存器选择位。

        0,使用缺省数据指针 DPTR0。
        1,使用另一个数据指针 DPTR1。首先看一下 SPI 初始化函数。

    代码1.png    
        代码1

        SPI 初始化函数,其实就是配置 SPI 相关寄存器的几个位。当然,大家也可以按照自己的实际需求进行配置。
        完成 SPI 初始化之后,就可以使用 SPI 发送接收函数。

    代码2.png    
        代码2

        在 SPI_SendByte(u8 SPI_SendData)函数中,首先是将要发送的数据放入 SPI 数据寄存器SPDAT 中,然后判定 SPI 状态寄存器 SPTAT 中的 SPIF 位。等待数据写入完成之后,清除中断标志和写冲突标志。由于 SPI 为双工通讯,最后就能返回得到的数据。
        关 于 外 部 Flash W25X20CL 的 使 用 , 其 实 就 是 通 过 SPI_SendByte(u8 SPI_SendData)写指令、写地址、写数据。外部 Flash 的使用方法详情可以读数据手册。
        另外,本次实验还用到了串口,串口的使用方法可以阅读前面的章节:串口控制舵机原理。
        4        实验现象

        首先打开下载软件 STC-ISP。

    8.png    
        图 8
        (1)点击 Keil 仿真设置,添加 STC 相关的头文件。STC 的相关头文件路径是我们之前安装 Keil C51 的路径,如果之前采用的默认路径,那么选择 C 盘 Keil 文件夹。

    9.png    
        图 9
        (2)添加完 STC 相关的头文件,点击弹窗中的确定。

    10.png            
        图 10

        (3)设置单片机的型号、最低波特率、最高波特率如下图所示,硬件选项等选项默认即可。串口号根据实际情况选择。

    11.png    
        图 11
        (4)点击打开程序文件,选择我们例程中的.hex 文件。

    12.png    
        图 12
        (5)点击下载/编程,下载代码。

    13.png           
        图 13

        (6)按一下电路板上面的 RST 按键,完成下载。

    14.png    
        图 14
        代码下载完成之后,打开串口调试助手,如下图所示。

        (1)选择串口号,我们图中是 COM1,这个根据实际情况选择。

        (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
        (3)点击打开串口。

    15.png    
        图 15
        完成上述操作,运行代码之后,就会看到串口调试助手区域 4 中会显示出读写 Flash 的数据信息。

    16.png    
        图 16


        配套资料:https://www.fengke.club/GeekMart/su_fV1WzKsGQ.jsp
        配套视频:https://www.fengke.club/GeekMart/su_fBdB1yTU0.jsp
        文件下载请点击: 6_外部Flash的读写.pdf (1.35 MB, 下载次数: 1)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 10:59 , Processed in 0.125481 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.