一文讲透SPI总线和IIC总线通信4

电子说

1.3w人已加入

描述

下面将对W25Q128的常用操作方式进行介绍。

1、只发送指令——写使能、写失能

写使能是指状态寄存器中的WEL位置1(发送写使能指令后硬件自动设置),失能就是清零操作。在发送页写,扇区擦除,块擦除,片擦除,写状态寄存器,擦写安全寄存器指令之前,必须先等待WEL 位置1 ,这些操作完成后,WEL会自动硬件清零。写失能是将状态寄存器中的WEL软件清零,写失能这个操作很少用到,大多数情况都是硬件自动完成。

根据SPI的操作时序,将指令(06h或04h)通过DI(MOSI)发送给W25Q128,期间DO(MISO)处于高阻状态,时序图如图6-11和图6-12所示。

单片机

图6-13 写使能时序

单片机 图6-14 写失能时序

2、发送指令,返回数据——读状态寄存器

读状态寄存器指令允许读8位状态寄存器位。读状态寄存指令在任何时间都可使用,可以用05H/35H/15H分别读取W25Q128的三个状态寄存器。实际上用的最多的只有05H读取状态寄存器1的第0位(BUSY位),用来查看相应指令周期是否结束,芯片是否可以接收新的指令。

根据SPI的操作时序,将指令05H通过DI发送,而后通过DO读回状态寄存器的值,时序图如图6-15所示。注意通常我们只读一个字节,时序图后续字节为芯片备用扩展的。

单片机

图6-15 读状态寄存器时序图

3、发送指令+数据——写状态寄存器

写状态寄存器的作用主要实现对Flash某些区域的数据或者状态保护,一旦写入保护状态,在状态解除之前,这块区域是禁止写入和擦除的。这部分在本教程中没有应用,有兴趣的读者可以根据时序图和手册资料了解一下,时序图如图6-16所示。

单片机

图6-16 写状态寄存器时序图

4、读数据

读数据指令允许从存储器读一个字节和连续多个字节。

首先要确认BUSY位为0,然后根据SPI的操作时序,首先写入指令代码03H,而后紧跟3个字节的地址。当W25Q128收到地址后,会将相应地址处的数据根据SPI时序输出来;如果连续读多个字节,那每经过8个时钟周期地址自动加1,并且输出相应数据,一直到CS拉高,时序图如图6-17所示。

单片机

图6-17 读数据时序图

5、写入数据(页编程)

W25Q128一次写入的数据只能小于等于256字节,并且不能一次性跨页写入。当遇到跨页时,应先写满一页,等待BUSY位为0,再次往下一页写。(如果写满一页继续往下写则会跳到缓存区的页首位置开始写,之前数据会被覆盖)

在写入数据之前,该页必须被擦除过,然后根据写入地址和写入的字节数计算是否跨页以及页数。根据SPI的操作时序,首先通过写使能将WEL置1,然后写入指令代码02H,而后紧跟着3个字节的地址,而后接着发送要存储的数据,时序图如图6-18所示。

单片机

图6-18 页编程时序图

写入数据完毕后,W25Q128将数据从缓存搬移到非易失区所消耗的时间要了解一下,在手册的84页有介绍,大概是(30+(x-1)*2.5)us ~ (50+(x-1)*12) us之间(x为写入的字节),搬移完成后,WEL位会自动清零,BUSY自动清零。

6、扇区擦除、块擦除

可以使用20H、52H和D8H分别对扇区擦除、32K块擦除和64K块擦除。根据SPI的操作时序,在写入擦除指令之前首先通过写使能将WEL置1,然后写入指令代码20H/52H/D8H中的一个,而后紧跟着3个字节的擦除首地址。

地址发送完毕后,必须将CS拉高,擦除指令才开始执行,并且需要一定的擦除时间,在这个时间内,只能读状态寄存器,其他操作均不能进行。扇区、32K块和64K的擦除典型时间分别是100ms、120ms和150ms,最大时间分别是400ms、1.6s、2s。当擦除完成,WEL和BUSY位自动清零,就可以再次接收新的操作指令,时序图如图6-19所示。

单片机

图6-19 扇区和块擦除时序图

7、全片擦除

可以使用C7H/60H指令对整片进行擦除操作。根据SPI的操作时序,在写入擦除指令之前首先通过写使能将WEL置1,然后写入指令代码C7H或者60H,发送完毕拉高CS后,擦除指令开始执行。

整片擦除过程中,只能读状态寄存器,其他操作均不能进行。整片擦除的典型时间是40秒,最大时间是200秒。当擦除完成后,WEL和BUSY位自动清零,就可以再次接收新的操作指令,时序图如图6-20所示。

单片机

图6-20 全片擦除时序图

接下来根据W25Q128的时序编写驱动程序,该驱动文件可以驱动W25Qxx系列的Flash存储芯片,不同型号的ID不同,W25Qxx初始化时会通过判断芯片ID来识别是否通信成功。

单片机

单片机

单片机

单片机

单片机

单片机

6.9.3 串口控制Flash读写实验

由于Flash与EEPROM实现的功能类似,本节通过改写串口发送指令控制EEPROM读写数据的例程,设计了串口发送指令控制Flash读写。帮助大家更好的体会串口实用例程以及Flash读写流程。

Flash读数据指令格式:“f-read 地址 字节长度”,其中地址范围为0~1610241024,e2read、地址、字节长度之间由空格隔开,比如从地址1开始读取5字节数据:f-read 1 5。单片机收到指令后执行多字节读操作,通过串口助手返回读出的数据。

Flash写数据指令格式:“f-write 地址 数据”,地址范围为0~1610241024,f-write、地址、数据之间同样由空格隔开,比如从地址1开始写入hello:f-write 1 hello。单片机收到指令后执行多字节写操作,写入成功后通过串口助手返回“f-write done.”

如果发送指令格式错误,返回“bad parameter.”,如果发送指令错误,将返回发送的数据。由于程序中设定的串口接收和发送缓冲区最大为256字节,因此该实验单次读取或者写入的字节数应小于256字节。

单片机

单片机

单片机

单片机

106.10 逻辑分析仪测试SPI信号

当进行SPI通信出现异常时,可以通过逻辑分析仪进行通信时序上的问题查找,如图6-18所示。从图上可以看出SCK空闲时是高电平,即CPOL=1;从CLK的跳沿箭头上可以看出,是后沿读取数据,即CPHA=1。数据分析可以通过MISO和MOSI解析后的数据判断出。通过分析仪的数据解析功能,可以直观看到STM32与Flash之间的通信数据,从而进一步确定问题所在。

单片机

图6-21 Kingst LA5016逻辑分析仪解析SPI数据

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分