MX25L4006E —— SPI Flash调试总结

一直觉得SPI通信很简单,也没怎么重视,结果实际读写SPI Flash的时候调试了很久,还是需要一步一步细心配置啊。

MX25L4006E是一款SPI Flash,主要用于做单片机的外扩FLash,用于与单片机通信从而存储数据

1、支持双输出模式,双输出时SI和SO引脚作为SIO0和SIO1引脚输出数据

2、主要信号线有 SCLK、SI、SO和#CS,当设备不运行且CS#偏高时,将进入待机模式

3、引脚描述

     引脚                        描述
      CS#         片选信号(芯片选择)
  SI/SIO0            串行数据输入
  SO/SIO1            串行数据输出
  SCLK              时钟输入
   WP#                写保护
 HOLD#      不取消设备下暂停设备
   VCC            +3.3V电源供应
  GND               地线

4、共有8个Block(大小为64KB),128个Sector(大小为4KB),每个Sector又分16个Page(大小为256B),Page是擦除和读写的最小单位。

5、设备操作:

  • 发布命令前应检查状态寄存器保证设备已准备好进行接下来的操作
  • 输入不正确的命令时,设备会进入待机状态,一直到出现下一个CS#下降沿为止,且待机状态时SO引脚应该一直保持为高电平
  • 当命令输入正确时,设备进入活动状态,一直到出现下一个CS#上升沿为止
  • 在SCLK上升沿处锁住输入数据,在其下降沿移出数据

6、支持两种采样模式,因此对应的单片机主机也要配置这两种模式

  • 模式0  ——  CPOL=0,CPHA=0,即空闲时SCLK为低电平,第一个跳变沿采样
  • 模式3  ——  CPOL=1,CPHA=1,空闲时SCLK电平为高,第二个跳变沿采样数据

7、保护机制

      SPI Flash共有两种保护机制:软件保护和硬件保护

      硬件保护  ——  通过拉低WP#信号线实现

      软件保护  ——  通过对BP0-BP2位编程来保护部分Flash数据不被更改

Flash与单片机的接线:

      VCC —— VCC        GND —— GND

      MOSI —— MOSI     MISO —— MISO

      HOLD —— 高电平    WP  —— 高电平

      CS  —— 单片机CS的IO口   SCK  —— 单片机SCLK的IO口

实际调试阶段,出了很多问题,一开始是逻辑分析仪上的MISO线读取不到数据,或者全是0xFF或者全是0x00,之后逻辑分析仪MISO有数据之后,但SPI的DR寄存器读出来的数据也一直是0xFF,经过排查,总结注意事项如下:

  • 单片机供电要保证正常,否则会影响SPI的供电和读取数据,下载程序之前,先用万用表测试Flash芯片的各个引脚电平,看是否正常以及保持供电
  • LPC11Uxx的SPI的IO配置要十分仔细,例如MISO和MOSI具体对应的引脚要先取消复位信号再选择SPI功能,CS、WP、SCLK信号接的引脚要配置成输出,且WP要配置成输出高电平,而CS也要先拉高取消片选

SPI通信是通过移位寄存器实现,主机和从机都有移位寄存器,因此每次发送一位数据,设备也会相应的收到一位数据(想象成环回结构,只有数据往外移出去才有空间存放接收的数据)。SPI发送数据和接收数据都通过操纵SPI->DR寄存器实现,但其实是两个不一样的寄存器。当收到数据时,DR寄存器会读取RXFIFO中的数据,发数据时,TXFIFO中的数据也会推送到DR寄存器发送。

SPI发送数据操作:

      1、检测SPI状态寄存器SR,当SPI不处于busy状态且发送缓冲没有满才可进行发送操作

      2、SPI->DR = *buf,将待发送的数据送至DR寄存器中,一旦赋值,数据将立马被发送出去,故调试时应该看不到DR中的待发送的数据,而是显示0

     3、发送数据出去的同时,设备会接收到来自另一台设备的数据,此时忽略即可,但是要执行 Dummy = SPI->DR,读取DR寄存器以清空RXFIFO,否则当真正要读取数据时会读出0xFF

SPI接收数据操作:

      1、SPI->DR = 0xFF,先发一个无意义的数据,以给从机一个时钟和片选信号,才能接收数据

      2、检测SPI状态寄存器SR,待SPI不处于busy状态且RXFIFO有数据,读取数据

      3、*buf = SPI->DR,将从机发来的数据读入到buf中

因为SPI通信中,时钟和片选等控制信号都是由主机控制,所以即便是从机发送数据主机读取实际也需要主机来发起,主机通过发送一个无意义的数据来启动片选和产生时钟信号,从机才能根据这个时钟将要发送的数据发送出去。

我这里因为项目中用到USB中断,所以SPI通信使用的是查询SR状态方式,SPI通信也可以使用中断方式来实现。

   

    

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/82967198