STM学習ノート------W 25 Qxx


最初はこれを勉强する时は简単だと思っていたので、メモを取らなくてもいいと思っていましたが、2周间后になってから、振り返って使った时、全部忘れてしまいました.のすべてはまたノートを記録します.
W 25 QXXは1ページあたり256バイトで構成されている.容量は(XX/8)Mバイトです.各ページの256バイトは1ページのプログラミング命令で完了します.1回あたり16ページ(1セクタ、最小消去単位)、128ページ(32 KBブロック)、256ページ(64 KBブロック)、およびフルスライス消去が可能です.記憶データアドレスが24ビットである、
W 25 Qxxデータを書き込む場合:データを書き込むには、まず書き込み可能でなければならない.書き込みデータには、格納されたデータと消去セクタデータ(レジスタ指令を書き込む場合はカウントしない.つまり、チップ選択を選択した場合、直接書き込み、操作するメモリアドレスを書き込むことができる)が含まれる.一方、書き込みデータは、ページごとに命令を書き、最大256バイトでページ全体を書きます.それを超えるとそのページの先頭からもう一度書きますので、すでに書き込まれているデータは上書きされます.データを読み書きする場合は、ステータスレジスタ1の最下位ビットが「0」であること、すなわち、動作状態、読み取り可能書き込み可能状態であることを確認しなければならない.データを読むと、アドレスが自動的に増加し、連続的にデータを読み取ることができます.これは,メモリ全体のデータを読み出し,1つの命令で読み終えることを意味する.
W 25 Qxxアドレスの意味:高性能モード0 xA 3、W 25 Q 128はこのモードがないようです.
#define W25X_WriteEnable 0 x 06//書き込みイネーブル、常用#define W 25 X_WriteDisable 0 x 04//書き込み失敗#define W 25 X_ReadStatusReg 0 x 05//W 25 QXXの状態レジスタ1命令を読み出し、(常用)、0 x 35-SR 2;0x15-SR3 #define W25X_WriteStatusReg 0 x 01//書き込み状態レジスタ1,0 x 31-SR 2;0x11-SR3 #define W25X_ReadData 0 x 03//リードデータ(共通)#define W 25 X_FastReadData 0 sB//クイックリードデータ#define W 25 X_PageProgram 0 x 02//ページ書き込み命令(共通)#define W 25 X_BlockErase 0 xD 8//64 k消去命令#define W 25 X_SectorErase 0 x 20//セクタ消去(共通)#define W 25 X_ChipErase 0 xC 7//または0 x 60、フルシート消去#define W 25 X_PowerDown 0 xB 9//低消費電力指令
#define W25X_ReleasePowerDown 0 xAB//低消費電力または高性能モード#define W 25 Xを解除DeviceID 0 xAB//チップID、上と同じ#define W 25 X_ManufactDeviceID 0 x 90//チップID(検証用)、W 25 Q 64はEF 16、W 25 Q 128はEF 17#define W 25 X_JedecDeviceID 0 x 9 F//JEDECID、何が分からない
書き込み機能:
/*
W25Q64          
  0x06
*/
void W25Q64_WriteEnabled(void)
{
	W25Q64_CS=0;
	SPI_ReadWriteOneData(0x06);
	W25Q64_CS=1;
}

読み出し状態レジスタ1
/*
               。        1   ,    ,0      ,    、    ,         
*/
void W25Q64_GetSR(void)
{
	u8 state=1;
	while(state&0x01)
	{
		W25Q64_CS=0;
		SPI_ReadWriteOneData(0x05);
		state=SPI_ReadWriteOneData(0xff);
		W25Q64_CS=1;
	}
}

ページの書き込み:
/*
  ,        ,            
  256  
    4096  
W25Q64   24 
addr:      ,data     ,len     
    :0x02
*/

void W25Q64_PageWriteData(u32 addr,u8 *data,u32 len)
{
	u32 i=0;
	W25Q64_WriteEnabled();//   
	W25Q64_CS=0;
	SPI_ReadWriteOneData(0x02);//    
	SPI_ReadWriteOneData(addr>>16);
	SPI_ReadWriteOneData(addr>>8);
	SPI_ReadWriteOneData(addr);
	
	for(i=0;i

消去:
/*
    :     sector erase
    :
				u32 addr:          。
  :      4096  。  0~4095        4096+....     

 100、200、345、78     0   
*/
void W25Q64_SectorErase(u32 addr)
{
		W25Q64_WriteEnabled(); //       
	  W25Q64_CS=0; //    
	  SPI_ReadWriteOneData(0x20); //      
		//24    
		SPI_ReadWriteOneData(addr>>16);
	  SPI_ReadWriteOneData(addr>>8);
	  SPI_ReadWriteOneData(addr);
		
	  W25Q64_CS=1; //    
		
		//      
		W25Q64_GetSR();
}

1つのセクタを満たすチェックなし:
/*
       ,      ,    。
addr:
data:
len:
*/
void W25Q64_NoCheckPageWrite(u32 addr,u8 *data,u32 len)
{
	u32 page_remain = 256-addr%256;//                    
	if(page_remain>=len)//                
	{
		page_remain=len;//       
	}
	while(1)
	{
		W25Q64_PageWriteData(addr,data,page_remain);
		if(page_remain==len) break;//      ,               ,          ,            。
		
		addr+=page_remain;//       len page_remain ,            
		data+=page_remain;//    
		len-=page_remain;//            
		if(len<256)//             ,           ,    256
		{
			page_remain=len;
		}
		else
		{
			page_remain=256;
		}
	}
	//W25Q64_GetSR();//      ,   ,       W25Q64_PageWriteData();
}

1つのセクタを満たす原理は、1ページを満たす原理と同じように、オーバーフローはすでに書き込まれたデータをカバーし、すべてのセクタを満たす原理に倣って、上の関数を利用してチップ全体の関数を書くことができます.