华邦W25Q16存储器颗粒SPI编程Word文档下载推荐.docx
《华邦W25Q16存储器颗粒SPI编程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华邦W25Q16存储器颗粒SPI编程Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
串行时钟引脚CLK;
②:
芯片选择引脚CS;
③:
串行数据输出引脚DO;
④:
串行数据输入输出引脚DIO。
(注意:
第④引脚“串行数据输入输出引脚DIO”的解释:
在普通情况下,这根引脚是“串行输入引脚(DI),当使用了快读双输出指令(FastReadDualOutputinstruction)时,这根引脚就变成了DO引脚,这种情况下,芯片就有了两个DO引脚了,所以叫做双输出,这时,如果与芯片通信的速率相当于翻了一倍,所以传输速度更快。
)
另外,芯片还具有保持引脚(HOLD)、写保护引脚(WP)、可编程写保护位(位于状态寄存器bit1)、顶部和底部块的控制等特征,使得控制芯片更具灵活性。
芯片支持JEDEC工业标准。
引脚排布:
原理图:
控制和状态寄存器说明
S7
S6
S5
S4
S3
S2
S1
S0
SRP
(Reservd)
TB
BP2
BP1
BP0
WEL
BUSY
通过"
读状态寄存器指令"
读出的状态数据可以知道芯片存储器阵列是否可写或不可写,或是否处于写保护状态。
写状态寄存器指令"
可以配置芯片写保护特征。
状态寄存器:
忙位(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、写使能时序图(指令:
0x06):
“写使能”指令将会使“状态寄存器”WEL位置位。
在执行每个“页编程”、“扇区擦除”、“块区擦除”、“芯片擦除”、和“写状态寄存器”命令之前,都要先置位WEL。
/CS引脚先拉低之后,“写使能”指令代码06h从DI引脚输入,在CLK上升沿采集,然后再拉高/CS引脚。
程序设计流程:
1、使能片选位,拉低CS引脚;
2、CLK起始状态或高电平或低平,配置数据采集从CLK第一个上升沿开始;
3、等待发送缓冲区是否为空,SPI_SR的TXE位;
4、将数据赋值给SPI_DR寄存器;
5、等待接收缓冲区是否为空,SPI_SR的RXNE位;
6、返回接收到的数据;
7、禁能片选位,拉高CS引脚。
例程:
unsignedcharSPI_SendByte(unsignedcharbyte)
{
while(!
(SPI_SR&
0x02));
//等待发送缓冲区为空
SPI_DR=byte;
//送值到数据寄存器
whlie(!
0x01));
//等待接收缓冲区为空
returnSPI_DR;
//返回接收的内容
}
unsignedcharSPI_WriteEnable()
Flash_CS=0;
//使能CS引脚
SPI_SendByte(0x06)//写使能指令
Flash_CS=1;
//禁能片选引脚
2、写禁能时序图(指令:
0x04):
“写禁能”指令将会使WEL位变为0。
/CS引脚拉低之后,把04h从DIO引脚送到芯片之后,拉高/CS,就完成了这个指令。
在执行完“写状态寄存器”、“页编程”、“扇区擦除”、“块区擦除”、“芯片擦除”指令之后,WEL位就会自动变为0。
SPI_SendByte(0x04)//写禁能指令
3、读状态时序(指令:
0x05):
当/CS拉低之后,开始把05h从DIO引脚送到芯片,在CLK的上升沿数据被芯片采集,当芯片认出采集到的数据时05h时,芯片就会把“状态寄存器”的值从DO引脚输出,数据在CLK的下降沿输出,高位在前。
“读状态寄存器”指令在任何时候都可以用,甚至在编程、擦除和写状态寄存器的过程中也可以用,这样,就可以从状态寄存器的BUSY位判断编程、擦除和写状态寄存器周期有没有结束,从而让我们知道芯片是否可以接收下一条指令了。
如果/CS不被拉高,状态寄存器的值将一直从DO引脚输出。
/CS拉高之后,读指令结束。
1、使能片选,拉低CS引脚;
2、发送读取指令0x04;
3、循环发送读伪指令0xFF,等待非忙时跳出循环;
4、禁能片选,拉高CS引脚。
voidSPI_ReadStatus()
unsignedcharFlash_Status;
FLASH_CS=0;
//使能片选引脚
SPI_SendByte(0x05);
//发送读状态指令
do
Flash_Status=SPI_SendByte(0xFF);
//发送伪指令维持时钟等待非空跳出循环,伪指令任意写。
}while(!
(Flash_Status&
FLASH_CS=1;
//禁能片选引脚
4、写状态时序(指令:
0x01)
在执行“写状态寄存器”指令之前,需要先执行“写使能”指令。
先拉低/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、发送写状态指令0x01;
3、发送读取指令0x04
4、禁能片选,CS引脚拉高。
voidSPI_FLASH_WriteStatus()
SPI_SendByte(0x06);
//写使能指令
SPI_SendByte(0x01);
//写状态指令
SPI_SendByte(0x00);
//写入状态的数据
5、读数据时序图(指令:
0x03):
“读数据”指令允许读出一个字节或一个以上的字节被读出。
先把/CS引脚拉低,然后把03h通过DIO引脚送到芯片,之后再送入24位的地址,这些数据在CLK的上升沿被芯片采集。
芯片接收完24位地址之后,就会把相应地址的数据在CLK引脚的下降沿从DO引脚送出去,高位在前。
当读完这个地址的数据之后,地址自动增加,然后通过DO引脚把下一个地址的数据送出去,形成一个数据流。
也就是说,只要时钟在工作,通过一条读指令,就可以把整个芯片存储区的数据读出来。
把/CS引脚拉高,“读数据”指令结束。
当芯片在执行编程、擦除和读状态寄存器指令的周期内,“读数据”指令不起作用。
程序设计流程(指令:
2、发送读数据指令0x03,紧接着发送24位地址;
3、读以SPI_DR寄存器数据
4、禁能片选,拉高CS引脚
voidSPI_FLASH_BufferRead(u