zoukankan      html  css  js  c++  java
  • STM32:SPI&w25qxx的配置与代码

    本文的话,我们首先了解一下SPI协议是什么,然后通过SPI的工作框图了解原理,然后根据代码对使用进行一下概括;

    1 SPI协议

      1.1 工作模式

        SPI总线有四种工作模式,由CPOL和CPHA决定,模式xx = mode[CPOL:CPHA];不同模式的采样点不同;

        CPOL(clock polarities时钟极性):决定SCK的起始电平是0还是1,CPOL=0表示时钟的起始电平为低;

        CPHA(clock phase时钟相位):    决定数据采样点是在SCK的第1个跳变沿还是第二个跳变沿,CPHA=0表示取样点为第一个跳变沿;

        就像目前遇到过的串口协议都是1bit开始位,8bit数据位,1bit停止位,无校验位;遇到的SPI协议也清一色是模式0;

      

      1.2 数据收发

        假设器件为主器件,工作在全双工模式,然后工作模式为模式0;

        在SCK的上升沿时,需要MI,MO都是有效数据;所以数据应该在CS使能前或SCK采样前的下降沿准备好;(意思是数据在下降沿变化,上升沿采样)

        spi的数据帧为4-32bit,数据发送以数据帧为单位,先使能片选,然后发送数据帧,然后取消片选使能;以此循坏收发数据;

      1.3 注意事项

        SPI协议大部分用在EEPROM和FLASH存储器上,作为板间通信协议较为常用;

        SPI协议对数据的收发时序要求不高,也没有应答位;协议简单,速度较快;只要SCK和CS使能,MI,MO就可以传递数据了;

        许多设备都更愿意支持模式0和模式3,因为这样的话取样的数据点都是在上升沿取样;

        (上升沿通常由D触发器生成,较为稳定;下降沿的触发器触发时会有一些组合逻辑的延时,不如上升沿稳定;)  

    2 SPI框图

      各种外设的了解无非是首先了解该外设的时钟,时钟决定传输性能;然后了解该外设的工作模式和配置原理;然后根据代码了解接口如何使用;

      

      2.1 SPI时钟域

        SPI外设的时钟域可以分为三个完全独立的时钟域,但是这些域之间的控制和状态信号需要严格同步,确保收发数据的正确;

        2.1.1 spi_pclk时钟域:APB总线的工作时钟,用来访问spi寄存器时使用;

        2.1.2 spi_ker_ck时钟域:主器件的SCK工作时钟,由rcc时钟生成,hal库函数中默认对其2分频后作为sck时钟;从器件的该时钟域由主器件生成;

        2.1.3 串行接口时钟域:由spi_ker_ckf分频而来的时钟,用来给收发数据的移位寄存器使用;

    3 hal库接口

      https://www.cnblogs.com/armfly/p/12523671.html

    4 W25Q128FV特性总结,随便看看 

        

      4.1 结构框图

        /CS引脚:未使能前,引脚属于高阻态,芯片待机状态;片选使能,芯片电压上来,芯片自动准备收发指令数据;

        /WP引脚:使能后,状态寄存器不能被修改;目的是为了防止掉电状态下的SR寄存器可能被噪音之类的修改;下面有图;

        /HOLD引脚:使能CS后,如果使能HOLD,则DO为高阻态,DI,SCK信号无效;

              使用spi时,可以将引脚配置为通用IO口,然后拉高,高电平不使能该引脚;

        /RESET引脚:将/HOLD引脚的功能改为复位引脚,然后硬件配置复位;也可以使用复位指令软件复位;

        /WP, /HOLD, /RESET引脚的功能都与QSPI的功能冲突,如果芯片配置成qspi模式,则引脚功能无效;

        WEL出厂默认为0,;当WEL为1时,/WP引脚可与SR寄存器的多bit一起决定block的写保护;

        

        w25qxx只支持spi模式的模式0和模式3,为什么呢?先占个坑;

        w25qxx在SCK的上升沿读取DI的数据,在SCK的下降沿发送数据到DO;

      4.2 状态寄存器

        w25qxx一共有3个状态寄存器;

        读操作状态寄存器可以知道各种指令操作之后寄存器的状态,可以通过状态寄存器判断指令操作是否完成;

        写操作状态寄存器可以配置芯片的各种功能,如写保护功能,QSPI模式,复位引脚复用等;

        4.2.1 SR1和SR2:初始化值为0x00;

      (S0)BUSY:当busy为1时,芯片正在执行指令,且不接收新的指令;当busy为0时,芯片不在执行指令,准备接收指令;

      (S1)       WEL:当wel为1时,芯片可以执行写指令;当wel为0时,不能执行写指令;上电后以及执行完各种指令后,wel会被置位为0;

      (S4-S2) BP[2:0]:当配置后,对应地址的擦写操作受到保护,需要先取消保护才能修改;BP[2:0]默认初始化为0,即所有地址均可执行擦写操作;

      (S5)      TB:同BP[2:0]一起决定block protected;默认初始化为0;//可以通过配置SRP[1:0]和WEL来配置TB bit;

      (S6)      SEC:当SEC为1时,BP[2:0]的写保护单位是sector;当SEC为0时,写保护单位是block;

      S[6:2]用来决定数据存储区的非易失性存储功能是否启用;如果启动,则特定block或sector不能直接擦写操作;具体见数据手册第七章末尾的表格;  

      (S8-S7) SRP[1:0]:决定/WP控制状态寄存器的功能是否有效;是针对状态寄存器操作的配置;如下图所示:

      (S9)       QE:当置1后,表示为QSPI模式,且/WP引脚和/HOLD引脚功能无效,将对应引脚杜勇为QSPI数据引脚;

          当QE为0时,/WP和/HOLD引脚功能有效;

          QEbit需要先配置为1,然后执行Enter QPI(38h)指令,才能进入QPI模式;

      (S13-S11) LB[3:1]:当置1后,对应的256bytes的security register永久性只读;是针对安全性寄存器的配置;

      (S14)    CMP:配合前面5bit一起配置非易失性保护;默认初始化为0;

      (S15)    SUS:当SUS为1时,表示执行完了擦写操作75h;当SUS为0时,表示执行完了擦写操作暂停指令7Ah;默认上电初始化为0;

     

      (S18)     WPS:当WPS为0时,决定存储区域的非易失性写保护由寄存器的5bit决定;

             当WPS为1时,表示存储区域的写保护通过发送指令来决定;具体见第7章末尾的表格;

      (S22-S21)DRV[1:0]:用来决定驱动输出数据的强度,默认为11b,25%;

      (S23)    HOLD/RESET:默认为0,表示引脚功能为/HOLD;当配置为1时,表示引脚功能为/RESET;

      4.3指令操作

        芯片为SPI/DSPI/QSPI提供了45条基本指令。这些指令在CS拉低后便准备好接收了;数据传输高位在前先传输;

        芯片为QPI提供了32条基本指令;QSPI接口仅支持从SPI接口使用38h指令切换过去,然后使用FFh切换回QSPI;

        QSPI和QPI的主要差别在于QPI发送指令也是通过4线进行传输的,QSPI发送指令同SPI一样是通过1线进行传输的;

        必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!

        SPI的解码缓存是256字节,所以每次执行写操作的时候,写入数据的大小不大于256字节;

        所以执行读写操作数据的时候都要先使能WEL,然后等BUSY位为0;

    5 源码:https://gitee.com/caesura/stm32h7_demo

  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/caesura-k/p/13154546.html
Copyright © 2011-2022 走看看