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

  • 相关阅读:
    @responseBody注解的使用
    springmvc下的省市县三级联动
    select 动态添加option函数
    清空select标签中option选项的4种不同方式
    javascript删除option选项的多种方法总结
    js如何获取select下拉框的value以及文本内容
    如何设置select下拉禁止选择
    java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
    转:通过他人完成任务的艺术
    ***周鸿祎谈创业:很多程序员高智商 但我一看就知道他们不会成功
  • 原文地址:https://www.cnblogs.com/caesura-k/p/13154546.html
Copyright © 2011-2022 走看看