好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

华邦W25Q16存储器颗粒SPI编程.doc

9页
  • 卖家[上传人]:桔****
  • 文档编号:466689951
  • 上传时间:2023-12-01
  • 文档格式:DOC
  • 文档大小:78KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 华邦W25Q16存储器颗粒SPI编程W25*16、W25*32 和 W25*64 系列 FLASH 存储器可以为用户提供存储解决方案,具有“PCB 板占用空间少〞、“引脚数量少〞、“功耗低〞等特点与普通串行 FLASH 相比,使用更灵活,性能更出色它非常适合做代码下载应用,例如存储声音,文本和数据工作电压在 2.7V-3.6V 之间,正常工作状态下电流消耗 0.5 毫安,掉电状态下电流消耗 1 微安所有的封装都是"节省空间"型的W25*16、W25*32 和 W25*64 分别有 8192、16384 和 32768 可编程页,每页 256 字节用"页编程指令"每次就可以编程256个字节用"扇区(sector)擦除指令"每次可以擦除 16 页,用“块(block)擦除指令〞每次可以擦除 256 页,用“整片擦除指令〞即可以擦除整个芯片W25*16、W25*32 和 W25*64 分别有 512、1024 和 2048 个可擦除"扇区"或 32、64 和 128 个可擦除“块〞W25*16、W25*32 和 W25*64 支持标准的 SPI 接口,传输速率最大 75MHz四线制:①:串行时钟引脚 CLK;②:芯片选择引脚 CS;③:串行数据输出引脚 DO;④:串行数据输入输出引脚 DIO。

      注意:第④引脚“串行数据输入输出引脚 DIO〞的解释:在普通情况下,这根引脚是“串行输入引脚(DI),当使用了快读双输出指令(Fast Read Dual Output instruction)时,这根引脚就变成了 DO 引脚,这种情况下,芯片就有了两个 DO 引脚了,所以叫做双输出,这时,如果与芯片通信的速率相当于翻了一倍,所以传输速度更快)另外,芯片还具有保持引脚(HOLD)、写保护引脚(WP)、可编程写保护位(位于状态存放器 bit1)、顶部和底部块的控制等特征,使得控制芯片更具灵活性芯片支持 JEDEC 工业标准引脚排布:原理图:控制和状态存放器说明S7S6S5S4S3S2S1S0SRP(Reservd)TBBP2BP1BP0WELBUSY通过"读状态存放器指令"读出的状态数据可以知道芯片存储器阵列是否可写或不可写,或是否处于写保护状态通过"写状态存放器指令"可以配置芯片写保护特征状态存放器:忙位(BUSY)BUSY 位是个只读位,位于状态存放器中的 S0当器件在执行"页编程"、"扇区擦除"、 "块区擦除"、"芯片擦除"、"写状态存放器"指令时,该位自动置 1这时,除了"读状态存放器"指令,其它指令部忽略。

      当编程、擦除和写状态存放器指令执行完毕之后,该位自动变为 0,表示芯片可以接收其它指令了写保护位(WEL)WEL 位是个只读位,位于状态存放器中的 S1执行完"写使能"指令后,该位置 1当芯片处于"写保护状态"下,该位为0在下面两种情况下,会进入"写保护状态"•掉电后•执行以下指令后写禁能、页编程、扇区擦除、块区擦除、芯片擦除和写状态存放器块区保护位(BP2,BP1,BP0)BP2\BP1\BP0 位是可读可写位,分别位于状态存放器的 S4\S3\S2可以用"写状态存放器"命令置位这些块区保护位在默认状态下,这些位都为 0,即块区处于未保护状态下可以设置块区没有保护、局部保护或者是全部处于保护状态下当 SPR 位为 1 或/WP 引脚为低的时候,这些位不可以被更改底部和顶部块区保护位(TB)TB 位是可读可写位,位于状态存放器的S5该位默认为 0,说明顶部和底部块区处于未被保护状态下可以用"写状态存放器"命令置位该位当 SPR 位为 1 或/WP 引脚为低的时候,这些位不可以被更改保存位状态存放器的 S6 为保存位,读出状态存放器值时,该位为 0建议读状态存放器值用于测试时将该位屏蔽状态存放器果护位〔SRP〕SRP 位是可读可写位,位于状态存放器的 S7。

      该位结合/WP 引脚可以实现禁能写状态存放器功能该位默认值为 0当 SRP 位=0 时,/WP 引脚不能控制状态存放器的"写禁能"当 SRP 位=1,/WP 引脚=0 时,"写状态存放器"命令失效当 SRP 位=1,/WP 引脚=1 时,可以执行"写状态存放器"命令状态存放器存储保护模块:1、写使能时序图〔指令:0*06〕:“写使能〞指令将会使“状态存放器〞WEL位置位在执行每个“页编程〞、“扇区擦除〞、“块区擦除〞、“芯片擦除〞、和“写状态存放器〞命令之前,都要先置位 WEL/CS 引脚先拉低之后,“写使能〞指令代码06h 从DI引脚输入,在CLK 上升沿采集,然后再拉高/CS 引脚程序设计流程:1、 使能片选位,拉低CS引脚;2、 CLK起始状态或高电平或低平,配置数据采集从CLK第一个上升沿开场;3、 等待发送缓冲区是否为空,SPI_SR的T*E位;4、 将数据赋值给SPI_DR存放器;5、 等待接收缓冲区是否为空,SPI_SR的R*NE位;6、 返回接收到的数据;7、 禁能片选位,拉高CS引脚例程:unsigned char SPI_SendByte(unsigned char byte){while(!(SPI_SR&0*02)); //等待发送缓冲区为空SPI_DR=byte; //送值到数据存放器whlie(!(SPI_SR&0*01)); //等待接收缓冲区为空return SPI_DR; //返回接收的容}unsigned char SPI_WriteEnable(){Flash_CS=0; //使能CS引脚SPI_SendByte(0*06) //写使能指令Flash_CS=1; //禁能片选引脚}2、写禁能时序图〔指令:0*04〕:“写禁能〞指令将会使WEL位变为0。

      /CS引脚拉低之后,把04h从DIO引脚送到芯片之后,拉高/CS,就完成了这个指令在执行完“写状态存放器〞、“页编程〞、“扇区擦除〞、“块区擦除〞、“芯片擦除〞指令之后,WEL位就会自动变为0程序设计流程:1、 使能片选位,拉低CS引脚;2、 CLK起始状态或高电平或低平,配置数据采集从CLK第一个上升沿开场;3、 等待发送缓冲区是否为空,SPI_SR的T*E位;4、 将数据赋值给SPI_DR存放器;5、 等待接收缓冲区是否为空,SPI_SR的R*NE位;6、 返回接收到的数据;7、 禁能片选位,拉高CS引脚例程:unsigned char SPI_SendByte(unsigned char byte){Flash_CS=0; //使能CS引脚while(!(SPI_SR&0*02)); //等待发送缓冲区为空SPI_DR=byte; //送值到数据存放器whlie(!(SPI_SR&0*01)); //等待接收缓冲区为空return SPI_DR; //返回接收的容Flash_CS=1; //禁能片选引脚}unsigned char SPI_WriteEnable(){Flash_CS=0; //使能CS引脚SPI_SendByte(0*04) //写禁能指令Flash_CS=1; //禁能片选引脚}3、读状态时序〔指令:0*05〕:当/CS拉低之后,开场把05h 从DIO引脚送到芯片,在CLK的上升沿数据被芯片采集,当芯片认出采集到的数据时05h 时,芯片就会把“状态存放器〞的值从DO引脚输出,数据在CLK的下降沿输出,高位在前。

      读状态存放器〞指令在任何时候都可以用,甚至在编程、擦除和写状态存放器的过程中也可以用,这样,就可以从状态存放器的BUSY位判断编程、擦除和写状态存放器周期有没有完毕,从而让我们知道芯片是否可以接收下一条指令了如果/CS 不被拉高,状态存放器的值将一直从DO引脚输出/CS 拉高之后,读指令完毕程序设计流程:1、 使能片选,拉低CS引脚;2、 发送读取指令0*04; 3、 循环发送读伪指令0*FF,等待非忙时跳出循环; 4、 禁能片选,拉高CS引脚例程:void SPI_ReadStatus(){unsigned char Flash_Status;FLASH_CS=0; //使能片选引脚SPI_SendByte(0*05); //发送读状态指令do{Flash_Status=SPI_SendByte(0*FF); //发送伪指令维持时钟等待非空跳出循环,伪指令任意写}while(!(Flash_Status&0*01));FLASH_CS=1; //禁能片选引脚}4、写状态时序〔指令:0*01〕在执行“写状态存放器〞指令之前,需要先执行“写使能〞指令。

      先拉低/CS 引脚,然后把 01h 从 DIO 引脚送到芯片,然后再把你想要设置的状态存放器值通过 DIO 引脚送到芯片,拉高/CS 引脚,指令完毕,如果此时没有把/CS 引脚拉高,或者是拉的晚了,值将不会被写入,指令无效只有“状态存放器〞当中的“SRP、TB、BP2、BP1、BP0 位〞可以被写入,其它“只读位〞值不会变在该指令执行的过程中,状态存放器中的 BUSY 位为 1,这时候可以用“读状态存放器〞指令读出状态存放器的值判断,当指令执行完毕,BUSY 位将自动变为 0, WEL位也自动变为 0通过对“TB〞、“BP2〞、“BP1〞、“BP0〞位写 1,就可以实现将芯片的局部或全部存储区域设置为只读通过对“SRP 位〞写 1,再把/WP引脚拉低,就可以实现制止写入状态存放器的功能程序设计流程:1、 使能片选,CS引脚拉低;2、 发送写状态指令0*01;3、 发送读取指令0*044、 禁能片选,CS引脚拉高例程:void SPI_FLASH_WriteStatus(){FLASH_CS=0; //使能片选引脚SPI_SendByte(0*06); //写使能指令SPI_SendByte(0*01); //写状态指令SPI_SendByte(0*00); //写入状态的数据FLASH_CS=1; //禁能片选引脚}5、读数据时序图〔指令:0*03〕:“读数据〞指令允许读出一个字节或一个以上的字节被读出。

      先把/CS 引脚拉低,然后把03h通过DIO引脚送到芯片,之后再送入24位的地址,这些数据在CLK的上升沿被芯片采集芯片接收完24位地址之后,就会把相应地址的数据在 CLK 引脚的下降沿从 DO 引脚送出去,高位在前当读完这个地址的数据之后,地址自动增加,然后通过DO引脚把下一个地址的数据送出去,形成一个数据流也就是说,只要时钟在工作,通过一条读指令,就可以把整个芯片存储区的数据读出来把/CS 引脚拉高,“读数据〞指令完毕当芯片在执行编程、擦除和读状态存放器指令的周期,“读数据〞指令不起作用程序设计流程〔指令:0*03〕:1、 使能片选,拉低CS引脚;2、 发送读数据指令0*03,紧接着发送24位地址;3、 读以SPI_DR存放器数据4、 禁能片选,拉高CS引脚例程:void SPI_FLASH_BufferRead(unsigned char* pBuffer, unsigned int ReadAddr, unsigned long int NumByte。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.