華邦W25Q16存儲器顆粒SPI編程_第1頁
華邦W25Q16存儲器顆粒SPI編程_第2頁
華邦W25Q16存儲器顆粒SPI編程_第3頁
華邦W25Q16存儲器顆粒SPI編程_第4頁
華邦W25Q16存儲器顆粒SPI編程_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、華邦W25Q16存儲器顆粒SPI編程W25X16、W25X32 和 W25X64 系列 FLASH 存儲器可以為用戶提供存儲解決方案,具有“PCB 板占用空間少”、“引腳數(shù)量少”、“功耗低”等特點。與普通串行 FLASH 相比,使 用更靈活,性能更出色。它非常適合做代碼下載應用,例如存儲聲音,文本和數(shù)據(jù)。工作電 壓在 2.7V-3.6V 之間,正常工作狀態(tài)下電流消耗 0.5 毫安,掉電狀態(tài)下電流消耗 1 微安。所 有的封裝都是"節(jié)省空間"型的。W25X16、W25X32 和 W25X64 分別有 8192、16384 和 32768 可編程頁,每頁 256 字節(jié)。 用&qu

2、ot;頁編程指令"每次就可以編程256個字節(jié)。用"扇區(qū)(sector)擦除指令"每次可以擦除 16 頁,用“塊(block)擦除指令”每次可以擦除 256 頁,用“整片擦除指令”即可以擦除 整個芯片。W25X16、W25X32 和 W25X64 分別有 512、1024 和 2048 個可擦除"扇區(qū)"或 32、64 和 128 個可擦除“塊”。W25X16、W25X32 和 W25X64 支持標準的 SPI 接口,傳輸速率最大 75MHz。四線制:串行時鐘引腳 CLK;:芯片選擇引腳 CS;:串行數(shù)據(jù)輸出引腳 DO;:串行數(shù)據(jù)輸入輸出引腳 DI

3、O。(注意:第引腳“串行數(shù)據(jù)輸入輸出引腳 DIO”的解釋:在普通情況下,這根引腳是“串行輸入引腳(DI),當使用了快讀雙輸出指令(Fast Read Dual Output instruction)時,這根引腳就變成了 DO 引腳,這種情況下,芯片就有了兩個 DO 引腳了,所以叫做雙輸出,這時,如果與芯片通信的速率相當于翻了一倍,所以傳輸速度更快。)另外,芯片還具有保持引腳(HOLD)、寫保護引腳(WP)、可編程寫保護位(位于狀 態(tài)寄存器 bit1)、頂部和底部塊的控制等特征,使得控制芯片更具靈活性。芯片支持 JEDEC 工業(yè)標準。引腳排布:原理圖:控制和狀態(tài)寄存器說明S7S6S5S4S3S2

4、S1S0SRP(Reservd)TBBP2BP1BP0WELBUSY通過"讀狀態(tài)寄存器指令"讀出的狀態(tài)數(shù)據(jù)可以知道芯片存儲器陣列是否可寫或不可寫,或是否處于寫保護狀態(tài)。通過"寫狀態(tài)寄存器指令"可以配置芯片寫保護特征。狀態(tài)寄存器:忙位(BUSY)BUSY 位是個只讀位,位于狀態(tài)寄存器中的 S0。當器件在執(zhí)行"頁編程"、"扇區(qū)擦除"、 "塊區(qū)擦除"、"芯片擦除"、"寫狀態(tài)寄存器"指令時,該位自動置 1。這時,除了"讀狀態(tài)寄 存器"指令,其它

5、指令部忽略。當編程、擦除和寫狀態(tài)寄存器指令執(zhí)行完畢之后,該位自動 變?yōu)?0,表示芯片可以接收其它指令了。寫保護位(WEL)WEL 位是個只讀位,位于狀態(tài)寄存器中的 S1。執(zhí)行完"寫使能"指令后,該位置 1。 當芯片處于"寫保護狀態(tài)"下,該位為0。在下面兩種情況下,會進入"寫保護狀態(tài)" 掉電后 執(zhí)行以下指令后寫禁能、頁編程、扇區(qū)擦除、塊區(qū)擦除、芯片擦除和寫狀態(tài)寄存器塊區(qū)保護位(BP2,BP1,BP0)BP2BP1BP0 位是可讀可寫位,分別位于狀態(tài)寄存器的 S4S3S2。可以用"寫狀態(tài)寄存器"命令置位這些塊區(qū)保護位。

6、在默認狀態(tài)下,這些位都為 0,即塊區(qū)處于未保護狀態(tài)下。 可以設置塊區(qū)沒有保護、部分保護或者是全部處于保護狀態(tài)下。當 SPR 位為 1 或/WP 引腳 為低的時候,這些位不可以被更改。底部和頂部塊區(qū)保護位(TB)TB 位是可讀可寫位,位于狀態(tài)寄存器的 S5。該位默認為 0,表明頂部和底部塊區(qū)處于未被保護狀態(tài)下??梢杂?quot;寫狀態(tài)寄存器"命令置位該位。當 SPR 位為 1 或/WP 引腳為低 的時候,這些位不可以被更改。保留位狀態(tài)寄存器的 S6 為保留位,讀出狀態(tài)寄存器值時,該位為 0。建議讀狀態(tài)寄存器值用于測試時將該位屏蔽。狀態(tài)寄存器果護位(SRP)SRP 位是可讀可寫位,位于狀

7、態(tài)寄存器的 S7。該位結(jié)合/WP 引腳可以實現(xiàn)禁能寫狀態(tài)寄存器功能。該位默認值為 0。當 SRP 位=0 時,/WP 引腳不能控制狀態(tài)寄存器的"寫禁能"。當 SRP 位=1,/WP 引腳=0 時,"寫狀態(tài)寄存器"命令失效。當 SRP 位=1,/WP 引腳=1 時,可以執(zhí)行"寫狀態(tài)寄存器"命令。狀態(tài)寄存器存儲保護模塊:1、寫使能時序圖(指令:0x06):“寫使能”指令將會使“狀態(tài)寄存器”WEL位置位。在執(zhí)行每個“頁編程”、“扇區(qū)擦除”、“塊區(qū)擦除”、“芯片擦除”、和“寫狀態(tài)寄存器”命令之前,都要先置位 WEL。/CS 引腳先拉低之后,“

8、寫使能”指令代碼06h 從DI引腳輸入,在CLK 上升沿采集,然后再拉高/CS 引腳 。程序設計流程:1、 使能片選位,拉低CS引腳;2、 CLK起始狀態(tài)或高電平或低平,配置數(shù)據(jù)采集從CLK第一個上升沿開始;3、 等待發(fā)送緩沖區(qū)是否為空,SPI_SR的TXE位;4、 將數(shù)據(jù)賦值給SPI_DR寄存器;5、 等待接收緩沖區(qū)是否為空,SPI_SR的RXNE位;6、 返回接收到的數(shù)據(jù);7、 禁能片選位,拉高CS引腳。例程:unsigned char SPI_SendByte(unsigned char byte)while(!(SPI_SR&0x02);/等待發(fā)送緩沖區(qū)為空SPI_DR=byt

9、e;/送值到數(shù)據(jù)寄存器whlie(!(SPI_SR&0x01);/等待接收緩沖區(qū)為空return SPI_DR;/返回接收的內(nèi)容unsigned char SPI_WriteEnable()Flash_CS=0;/使能CS引腳SPI_SendByte(0x06)/寫使能指令Flash_CS=1;/禁能片選引腳2、寫禁能時序圖(指令:0x04):“寫禁能”指令將會使WEL位變?yōu)?。/CS引腳拉低之后,把04h 從DIO引腳送到芯片之后,拉高/CS,就完成了這個指令。在執(zhí)行完“寫狀態(tài)寄存器”、“頁編程”、“ 扇區(qū)擦除”、“塊區(qū)擦除”、“芯片擦除”指令之后,WEL位就會自動變?yōu)?。程序設計流

10、程:1、 使能片選位,拉低CS引腳;2、 CLK起始狀態(tài)或高電平或低平,配置數(shù)據(jù)采集從CLK第一個上升沿開始;3、 等待發(fā)送緩沖區(qū)是否為空,SPI_SR的TXE位;4、 將數(shù)據(jù)賦值給SPI_DR寄存器;5、 等待接收緩沖區(qū)是否為空,SPI_SR的RXNE位;6、 返回接收到的數(shù)據(jù);7、 禁能片選位,拉高CS引腳。例程:unsigned char SPI_SendByte(unsigned char byte)Flash_CS=0;/使能CS引腳while(!(SPI_SR&0x02);/等待發(fā)送緩沖區(qū)為空SPI_DR=byte;/送值到數(shù)據(jù)寄存器whlie(!(SPI_SR&0

11、x01);/等待接收緩沖區(qū)為空return SPI_DR;/返回接收的內(nèi)容Flash_CS=1;/禁能片選引腳unsigned char SPI_WriteEnable()Flash_CS=0;/使能CS引腳SPI_SendByte(0x04)/寫禁能指令Flash_CS=1;/禁能片選引腳3、讀狀態(tài)時序(指令:0x05):當/CS 拉低之后,開始把 05h 從DIO引腳送到芯片,在 CLK 的上升沿數(shù)據(jù)被芯片采集,當芯片認出采集到的數(shù)據(jù)時05h 時,芯片就會把“狀態(tài)寄存器”的值從DO引腳輸出,數(shù)據(jù)在CLK 的下降沿輸出,高位在前?!白x狀態(tài)寄存器”指令在任何時候都可以用,甚至在編程、擦除和寫狀

12、態(tài)寄存器的過程中也可以用,這樣,就可以從狀態(tài)寄存器的BUSY位判斷編程、擦除和寫狀態(tài)寄存器周期有沒有結(jié)束,從而讓我們知道芯片是否可以接收下一條指令了。如果/CS 不被拉高,狀態(tài)寄存器的值將一直從DO引腳輸出。/CS 拉高之后,讀指令結(jié)束。程序設計流程:1、 使能片選,拉低CS引腳;2、 發(fā)送讀取指令0x04;3、 循環(huán)發(fā)送讀偽指令0xFF,等待非忙時跳出循環(huán);4、 禁能片選,拉高CS引腳。例程:void SPI_ReadStatus()unsigned char Flash_Status;FLASH_CS=0;/使能片選引腳SPI_SendByte(0x05);/發(fā)送讀狀態(tài)指令doFlash_

13、Status=SPI_SendByte(0xFF);/發(fā)送偽指令維持時鐘等待非空跳出循環(huán),偽指令任意寫。while(!(Flash_Status&0x01);FLASH_CS=1;/禁能片選引腳4、寫狀態(tài)時序(指令:0x01)在執(zhí)行“寫狀態(tài)寄存器”指令之前,需要先執(zhí)行“寫使能”指令。先拉低/CS 引腳,然 后把 01h 從 DIO 引腳送到芯片,然后再把你想要設置的狀態(tài)寄存器值通過 DIO 引腳送到芯 片,拉高/CS 引腳,指令結(jié)束,如果此時沒有把/CS 引腳拉高,或者是拉的晚了,值將不會 被寫入,指令無效。只有“狀態(tài)寄存器”當中的“SRP、TB、BP2、BP1、BP0 位”可以被寫入

14、,其它“只讀位”值不會變。在該指令執(zhí)行的過程中,狀態(tài)寄存器中的 BUSY 位為 1,這時候可以用“讀狀態(tài)寄存器”指令讀出狀態(tài)寄存器的值判斷,當指令執(zhí)行完畢,BUSY 位將自動變?yōu)?0, WEL位也自動變?yōu)?0。通過對“TB”、“BP2”、“BP1”、“BP0”位寫 1,就可以實現(xiàn)將芯片的部分或全部存儲區(qū)域 設置為只讀。通過對“SRP 位”寫 1,再把/WP引腳拉低,就可以實現(xiàn)禁止寫入狀態(tài)寄存器的功能。程序設計流程:1、 使能片選,CS引腳拉低;2、 發(fā)送寫狀態(tài)指令0x01;3、 發(fā)送讀取指令0x044、 禁能片選,CS引腳拉高。例程:void SPI_FLASH_WriteStatus()FL

15、ASH_CS=0;/使能片選引腳SPI_SendByte(0x06);/寫使能指令SPI_SendByte(0x01);/寫狀態(tài)指令SPI_SendByte(0x00);/寫入狀態(tài)的數(shù)據(jù)FLASH_CS=1;/禁能片選引腳5、讀數(shù)據(jù)時序圖(指令:0x03):“讀數(shù)據(jù)”指令允許讀出一個字節(jié)或一個以上的字節(jié)被讀出。先把/CS 引腳拉低,然后把03h通過DIO引腳送到芯片,之后再送入24位的地址,這些數(shù)據(jù)在CLK的上升沿被芯片采集。芯片接收完24位地址之后,就會把相應地址的數(shù)據(jù)在 CLK 引腳的下降沿從 DO 引腳送出去,高位在前。當讀完這個地址的數(shù)據(jù)之后,地址自動增加,然后通過DO引腳把下一個地址

16、的數(shù)據(jù)送出去,形成一個數(shù)據(jù)流。也就是說,只要時鐘在工作,通過一條讀指令,就可 以把整個芯片存儲區(qū)的數(shù)據(jù)讀出來。把/CS 引腳拉高,“讀數(shù)據(jù)”指令結(jié)束。當芯片在執(zhí)行編程、擦除和讀狀態(tài)寄存器指令的周期內(nèi),“讀數(shù)據(jù)”指令不起作用。程序設計流程(指令:0x03):1、 使能片選,拉低CS引腳;2、 發(fā)送讀數(shù)據(jù)指令0x03,緊接著發(fā)送24位地址; 3、 讀以SPI_DR寄存器數(shù)據(jù)4、 禁能片選,拉高CS引腳例程:void SPI_FLASH_BufferRead(unsigned char* pBuffer, unsigned int ReadAddr, unsigned long int NumByt

17、eToRead) FLASH_CS=0;/拉低片選線選中芯片 SPI_SendByte(READ);/發(fā)送讀數(shù)據(jù)命令 SPI_SendByte(ReadAddr & 0xFF0000)>>16);/發(fā)送24位FLASH地址,先發(fā)高8位 SPI_SendByte(ReadAddr & 0x00FF00)>>8);/再發(fā)中間8位 SPI_SendByte(ReadAddr &0x0000FF);/最后發(fā)低8位 while(NumByteToRead-)/計數(shù) *pBuffer = SPI_SendByte(Dummy_Byte);/讀一個字節(jié)的數(shù)據(jù)

18、pBuffer+;/指向下一個要讀取的數(shù)據(jù) FLASH_CS=1;/拉高片選線不選中芯片6、快讀時序圖(指令:0x0B):“快讀”指令和“讀數(shù)據(jù)”指令很相似,不過,“快讀”指令可以運行在更高的傳輸速率下。先把/CS 引腳拉低,然后把 0Bh 通過引腳 DIO 送到芯片,然后把 24 位地址通過 DIO 引腳送到芯片,接著等待8個時鐘,之后數(shù)據(jù)將會從 DO 引腳送出去。程序設計流程(指令:0x0B):1、 使能片選,拉低CS引腳;2、 發(fā)送快讀數(shù)據(jù)指令0x0B,緊接著發(fā)送24位地址; 3、 發(fā)送8個字節(jié)偽指令等待8個時鐘4、 讀以SPI_DR寄存器數(shù)據(jù)5、 禁能片選,拉高CS引腳例程:void

19、SPI_FLASH_BufferRead(unsigned char* pBuffer, unsigned int ReadAddr, unsigned long int NumByteToRead) FLASH_CS=0;/拉低片選線選中芯片 SPI_SendByte(READ);/發(fā)送讀數(shù)據(jù)命令 SPI_SendByte(ReadAddr & 0xFF0000)>>16);/發(fā)送24位FLASH地址,先發(fā)高8位 SPI_SendByte(ReadAddr & 0x00FF00)>>8);/再發(fā)中間8位 SPI_SendByte(ReadAddr &a

20、mp;0x0000FF);/最后發(fā)低8位SPI_SendByte(0xFF);/發(fā)送8個字節(jié)偽指令,等待8個時鐘。 while(NumByteToRead-)/計數(shù) *pBuffer = SPI_SendByte(Dummy_Byte);/發(fā)送偽指令讀出一個字節(jié)的數(shù)據(jù) pBuffer+;/指向下一個要讀取的數(shù)據(jù) FLASH_CS=1;/拉高片選線不選中芯片7、快速讀雙輸出(指令:0x3B):“快讀雙輸出”指令和“快讀”指令很相似,不過,“快讀雙輸出”指令是從兩個引腳上輸出數(shù)據(jù):DI和DIO。這樣,傳輸速率就相當于兩倍于標準的SP看傳輸速率了。這個指令特別適合于需要在一上電就把代碼從芯片下載到內(nèi)

21、存中的情況或者緩存代碼段到內(nèi)存中運行的情況。“快讀雙輸出”指令和“快讀”指令的時序差不多。先把/CS引腳拉低,然后把 3Bh通過引腳 DIO送到芯片,然后把 24 位地址通過 DIO 引腳送到芯片,接著等待8個時鐘,之后數(shù)據(jù)將會分別從DO 引腳和 DIO 引腳送出去,DIO 送偶數(shù)位,DO 送寄數(shù)位。程序設計流程:1、 使能片選,拉低CS引腳;2、 寫快讀雙輸出指令0x3B,緊接著寫24位地址;3、 寫1個字節(jié)的偽指令,等待8個時鐘;4、 讀取SPI_DR寄存器5、 禁能片選,拉高CS引腳例程(參考完整例程):暫無。8、頁編程時序圖(指令:0x02):執(zhí)行“頁編程”指令之前,需要先執(zhí)行“寫使能

22、”指令,而且要求待寫入的區(qū)域位都為1,也就是需要先把待寫入的區(qū)域擦除。先把/CS引腳拉低,然后把代碼02h通過DIO引腳送到芯片,然后再把24位地址送到芯片,然后接著送要寫的字節(jié)到芯片。在寫完數(shù)據(jù)之后,把/CS引腳拉高。寫完一頁(256個字節(jié))之后,必須把地址改為0,不然的話,如果時鐘還在繼續(xù),地址將自動變?yōu)轫摰拈_始地址。在某些時候,需要寫入的字節(jié)不足256個字節(jié)的話,其它寫入的字節(jié)都是無意義的。如果寫入的字節(jié)大于了256個字節(jié),多余的字節(jié)將會加上無用的字節(jié)覆蓋剛剛寫入的的256個字節(jié)。所以需要保證寫入的字節(jié)小于等于256個字節(jié)。在指令執(zhí)行過程中,用“讀狀態(tài)寄存器”可以發(fā)現(xiàn)BUSY位為1,當指

23、令執(zhí)行完畢,BUSY位自動變?yōu)?。如果需要寫入的地址處于“寫保護”狀態(tài),“頁編程”指令無效。程序設計流程:1、 寫使能指令0x06,將芯片WEL位置0;2、 擦除芯片需要寫入的區(qū)域,可以用扇區(qū)、塊、芯片擦除指令; 3、 使能片選,拉低CS引腳 ;4、 發(fā)送“頁編程”指令0x02,接著發(fā)送24位地址、發(fā)送要寫入的數(shù)據(jù);5、 發(fā)讀狀態(tài)指令0x05檢查芯片BUSY位操作是否結(jié)束6、 禁能片選,拉高CS引腳。例程:void SPI_FLASH_PageWrite(unsigned char* pBuffer, unsigned long int WriteAddr, unsigned int NumB

24、yteToWrite) SPI_FLASH_WriteEnable();/先使能對FLASH芯片的操作 FLASH_CS=0;/拉低片選線選中芯片 SPI_SendByte(WRITE);/發(fā)送頁寫命令 SPI_SendByte(WriteAddr&0xFF0000)>>16);/發(fā)送24位FLASH地址,先發(fā)高8位 SPI_SendByte(WriteAddr&0xFF00)>>8);/再發(fā)中間8位 SPI_SendByte(WriteAddr&0xFF);/最后發(fā)低8位 while(NumByteToWrite-)/發(fā)送地址后緊跟欲寫入數(shù)據(jù)

25、SPI_SendByte(*pBuffer);/發(fā)送欲寫入FLASH的數(shù)據(jù) pBuffer+;/指向下一個要寫入的數(shù)據(jù) FLASH_CS=1;/拉高片選線不選中芯片 SPI_FLASH_WaitForWriteEnd();/等待寫操作結(jié)束程序說明:* pBuffer是一個指針,是讀取數(shù)據(jù)后的存儲區(qū),通常指向一個數(shù)組;WriteAddr是24位芯片地址,需要把數(shù)據(jù)寫到芯片什么位置就靠它了。NumByteToWrite是寫入字節(jié)的數(shù)量,例如需要寫入50個字節(jié),這里就給50。寫入的數(shù)據(jù)不可以大于256Byte,否則頁地址會溢出,地址會從0開始,最前面寫入的數(shù)據(jù)會被破壞,寫入的數(shù)據(jù)大于256Byte時

26、,重新用下一頁的起始地址來寫剩余的數(shù)據(jù)(處理翻頁問題請在本章末尾查看完整例程)。頁編程完整流程圖:W25Q16總共有16Mbit空間,合計2MByte,共8192個頁,每頁256Byte。因為每頁是一個獨立的單元,所以在寫入數(shù)據(jù)時不支持自動翻頁,如果寫入的數(shù)據(jù)超出256Byte,那么頁地址就溢出歸零,數(shù)據(jù)又從零開始寫,也就是說最先寫入的數(shù)據(jù)會被破壞。數(shù)據(jù)寫入時可能碰到有幾種情況,一種情況是:頁地址對齊的情況,就是頁地址可以被256整除,且寫入的數(shù)據(jù)不夠256Byte,這種情況直接寫入即可,不需要考慮翻頁問題;第二種情況是:寫入的數(shù)據(jù)剛好是256Byte或者多一點點,這種情況寫完一整頁的數(shù)據(jù)后,

27、就要把頁地址加256跳到下一頁的開始位置寫剩余的數(shù)據(jù);第三種情況是:頁地址不對齊情況,也就是頁地址不能被256整除,這種情況說明,某頁被用掉一部分,現(xiàn)在從剩余的空間繼續(xù)向下寫,如果空間夠?qū)懢椭苯訉懭?,不需要考慮翻頁問題,如果空間不夠?qū)懢鸵獙㈨摰刂芳由鲜S嗫臻g的數(shù)跳轉(zhuǎn)到下一頁寫剩余的數(shù)據(jù),如果剩余的數(shù)據(jù)等于或大于256Byte,頁地址還需要 加256再向下進行翻頁。9、扇區(qū)擦除時序圖(指令:0x20):“扇區(qū)擦除”指令將一個扇區(qū)C4K字節(jié))擦除,擦除后扇區(qū)位都為1,扇區(qū)字節(jié)都為FFh。在執(zhí)行“扇區(qū)擦除”指令之前,需要先執(zhí)行“寫使能”指令,保證WEL位為1。先拉低屬CS引腳,然后把指令代碼20h通

28、過DIO引腳送到芯片,然后接著把24位扇區(qū)地址送到芯片,然后拉高屬CS引腳。如果沒有及時把屬CS引腳拉高,指令將不會起作用。在指令執(zhí)行期間,BUSY位為1,可以通過“讀狀態(tài)寄存器”指令觀察。當指令執(zhí)行完畢,BUSY位變?yōu)?,WEL位也會變?yōu)?。如果需要擦除的地址處于只讀狀態(tài),指令將不會起作用。程序設計流程:1、 先執(zhí)行寫使能指令;2、 使能片選,拉低CS引腳;3、 發(fā)送扇區(qū)擦除指令0x20,緊接著發(fā)送擦除的24位地址;4、 等待擦除指令結(jié)束,發(fā)送讀狀態(tài)指令查看BUSY位狀態(tài)是否為0;5、 禁能片選,拉高CS引腳。例程:void SPI_FLASH_BlockErase(unsigned lon

29、g int BlockAddr) SPI_FLASH_WriteEnable();/FLASH寫使能(該函數(shù)請查閱完整例程) FLASH_CS=0;/拉低片選線選中芯片 SPI_SendByte(0xD8);/發(fā)送塊或扇區(qū)(0x20)擦除命令 SPI_SendByte(BlockAddr&0xFF0000)>>16);/發(fā)送24位FLASH擦除地址,先發(fā)高8位 SPI_SendByte(BlockAddr&0x00FF00)>>8);/再發(fā)中間8位 SPI_SendByte(BlockAddr&0x0000FF);/最后發(fā)低8位 FLASH_CS

30、=1;/拉高片選線不選中芯片 SPI_FLASH_WaitForWriteEnd();/等待塊清除操作完成(該函數(shù)請查閱完整例程)10、芯片擦除時序圖(指令:0xC7):“芯片擦除”指令將會使整個芯片的存儲區(qū)位都變?yōu)?1,即字節(jié)都變位 FFh。在執(zhí)行“芯片擦除”指令之前需要先執(zhí)行"寫使能"指令。先把/CS 引腳拉低,然后再把指令代碼 C7h 通過 DIO 引腳送到芯片,然后拉高/CS 引腳。 如果沒有及時拉高/CS 引腳,指令無效。在“芯片擦除”指令執(zhí)行周期內(nèi),可以執(zhí)行“讀狀態(tài)寄存器”指令訪問 BUSY 位,這時 BUSY 位為 1,當“芯片擦除”指令執(zhí)行完畢,BUSY 變

31、為0,WEL位也變?yōu)?0。任何一個塊區(qū)處于保護狀態(tài)(BP2BP1BP0),指令都會失效。程序設計流程:1、 發(fā)送0x06寫使能;2、 使能片選,拉低CS引腳;3、 發(fā)送擦除指令0xC7,緊接著發(fā)送24位擦除地址;4、 禁能片選,拉高CS引腳5、 等待操作完成。例程:void SPI_FLASH_ChipErase(void) SPI_FLASH_WriteEnable();/FLASH寫使能 FLASH_CS=0;/拉低片選線選中芯片 SPI_SendByte(Chip_E);/發(fā)送芯片擦除命令 FLASH_CS=1;/拉高片選線不選中芯片 SPI_FLASH_WaitForWriteEnd();/等待寫操作完成11、“釋放掉電/器件ID”指令(命令:0xAB):這個指令有兩個作用。一個是“釋放掉電”,一個是讀出“器件ID”。 當只需要發(fā)揮“釋放掉電”用途時,指令時序是:先把/CS引腳拉低,然后把代碼“ABh”通過 DIO 引腳送到芯片,然后拉高/CS引腳。然后經(jīng)過tRES1時間間隔,芯片恢復正常工作狀態(tài)。在編程、擦除和寫狀態(tài)寄存器指令執(zhí)行周期內(nèi),執(zhí)行該指令無效。程序設計流程:暫無例程:暫無12、掉電指令(指令:0xB9):盡管在待機狀態(tài)下的電流消耗己經(jīng)很低了,但“掉電”指令可以使得待機電流消耗更低。這個指令很適合在電池供

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論