Files
player/Project_App_Calendar/App_Src/drive/w25qxx.c

375 lines
9.5 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "stm32f4xx.h"
#include "base.h"
#include "w25qxx.h"
static void (*p_delay_us)(u32);
static int (*p_printf)(const char *,...);
static u8 (*p_writeReadByte)(u8);
static void (*p_csPointHigh)(void) ;
static void (*p_csPointLow)(void);
static u8 W25Q_INITED=0;
2025-07-05 19:47:28 +08:00
static u16 W25QXX_TYPE=W25Q128; //Ĭ<><C4AC><EFBFBD><EFBFBD>W25Q128
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//4KbytesΪһ<CEAA><D2BB>Sector
//16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31>Block
2025-06-27 00:32:57 +08:00
//W25Q128
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>Ϊ16M<36>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD>128<32><38>Block,4096<39><36>Sector
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F><>ʼ<EFBFBD><CABC>SPI FLASH<53><48>IO<49><4F>
2025-06-27 00:32:57 +08:00
int W25QXX_Init(W25QXX_InitStruct *init)
{
if (init->writeReadByte&&init->csPointHigh&&init->csPointLow)
{
p_delay_us=init->delay_us;
p_printf=init->printf;
p_writeReadByte=init->writeReadByte;
p_csPointHigh=init->csPointHigh;
p_csPointLow=init->csPointLow;
W25Q_INITED=1;
}
else
{
W25Q_INITED=0;
return -1;
}
p_csPointHigh();
2025-07-05 19:47:28 +08:00
W25QXX_TYPE=W25QXX_ReadID();//<2F><>ȡFLASH ID.
2025-06-27 00:32:57 +08:00
return 0;
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡW25QXX<58><58>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
2025-06-27 00:32:57 +08:00
//BIT7 6 5 4 3 2 1 0
//SPR RV TB BP2 BP1 BP0 WEL BUSY
2025-07-05 19:47:28 +08:00
//SPR:Ĭ<><C4AC>0,״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ,<2C><><EFBFBD><EFBFBD>WPʹ<50><CAB9>
//TB,BP2,BP1,BP0:FLASH<53><48><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//WEL:дʹ<D0B4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//BUSY:æ<><C3A6><EFBFBD><EFBFBD>λ(1,æ;0,<2C><><EFBFBD><EFBFBD>)
//Ĭ<><C4AC>:0x00
2025-06-27 00:32:57 +08:00
u8 W25QXX_ReadSR(void)
{
u8 byte=0;
if (W25Q_INITED==0) return 0;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_ReadStatusReg); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
byte=p_writeReadByte(0Xff); //<2F><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
return byte;
}
2025-07-05 19:47:28 +08:00
//дW25QXX״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
//ֻ<><D6BB>SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)<29><><EFBFBD><EFBFBD>д!!!
2025-06-27 00:32:57 +08:00
void W25QXX_Write_SR(u8 sr)
{
if (W25Q_INITED==0) return ;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_WriteStatusReg); //<2F><><EFBFBD><EFBFBD>дȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(sr); //д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//W25QXXдʹ<D0B4><CAB9>
//<2F><>WEL<45><4C>λ
2025-06-27 00:32:57 +08:00
void W25QXX_Write_Enable(void)
{
if (W25Q_INITED==0) return ;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_WriteEnable); //<2F><><EFBFBD><EFBFBD>дʹ<D0B4><CAB9>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//W25QXXд<58><D0B4>ֹ
//<2F><>WEL<45><4C><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void W25QXX_Write_Disable(void)
{
if (W25Q_INITED==0) return ;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_WriteDisable); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ָֹ<D6B9><D6B8>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡоƬID
//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>:
//0XEF13,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q80
//0XEF14,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q16
//0XEF15,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q32
//0XEF16,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q64
//0XEF17,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q128
2025-06-27 00:32:57 +08:00
u16 W25QXX_ReadID(void)
{
u16 Temp = 0;
if (W25Q_INITED==0) return 0;
p_csPointLow();
2025-07-05 19:47:28 +08:00
p_writeReadByte(0x90);//<2F><><EFBFBD>Ͷ<EFBFBD>ȡID<49><44><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
p_writeReadByte(0x00);
p_writeReadByte(0x00);
p_writeReadByte(0x00);
Temp|=p_writeReadByte(0xFF)<<8;
Temp|=p_writeReadByte(0xFF);
p_csPointHigh();
return Temp;
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡSPI FLASH
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼ<EFBFBD><CABC>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//ReadAddr:<3A><>ʼ<EFBFBD><CABC>ȡ<EFBFBD>ĵ<EFBFBD>ַ(24bit)
//NumByteToRead:Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
2025-06-27 00:32:57 +08:00
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
if (W25Q_INITED==0) return ;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_ReadData); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
p_writeReadByte((u8)((ReadAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
2025-06-27 00:32:57 +08:00
p_writeReadByte((u8)((ReadAddr)>>8));
p_writeReadByte((u8)ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
2025-07-05 19:47:28 +08:00
pBuffer[i]=p_writeReadByte(0XFF); //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
p_csPointHigh();
}
2025-07-05 19:47:28 +08:00
//SPI<50><49>һҳ(0~65535)<29><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>256),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʣ<EFBFBD><CAA3><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>!!!
2025-06-27 00:32:57 +08:00
void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 i;
if (W25Q_INITED==0) return ;
W25QXX_Write_Enable(); //SET WEL
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_PageProgram); //<2F><><EFBFBD><EFBFBD>дҳ<D0B4><D2B3><EFBFBD><EFBFBD>
p_writeReadByte((u8)((WriteAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
2025-06-27 00:32:57 +08:00
p_writeReadByte((u8)((WriteAddr)>>8));
p_writeReadByte((u8)WriteAddr);
2025-07-05 19:47:28 +08:00
for(i=0;i<NumByteToWrite;i++)p_writeReadByte(pBuffer[i]); //ѭ<><D1AD>д<EFBFBD><D0B4>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>޼<EFBFBD><DEBC><EFBFBD>дSPI FLASH
//<2F><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>д<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>Ϊ0XFF,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>0XFF<46><46>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD>ʧ<EFBFBD><CAA7>!
//<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ҫȷ<D2AA><C8B7><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Խ<EFBFBD><D4BD>!
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
2025-06-27 00:32:57 +08:00
//CHECK OK
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 pageremain;
2025-07-05 19:47:28 +08:00
pageremain=256-WriteAddr%256; //<2F><>ҳʣ<D2B3><CAA3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽ<EFBFBD>
2025-06-27 00:32:57 +08:00
while(1)
{
W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
2025-07-05 19:47:28 +08:00
if(NumByteToWrite==pageremain)break; //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
else //NumByteToWrite>pageremain
{
pBuffer+=pageremain;
WriteAddr+=pageremain;
2025-07-05 19:47:28 +08:00
NumByteToWrite-=pageremain; //<2F><>ȥ<EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>˵<EFBFBD><CBB5>ֽ<EFBFBD><D6BD><EFBFBD>
if(NumByteToWrite>256)pageremain=256; //һ<>ο<EFBFBD><CEBF><EFBFBD>д<EFBFBD><D0B4>256<35><36><EFBFBD>ֽ<EFBFBD>
else pageremain=NumByteToWrite; //<2F><><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
};
}
static u8 *W25QXX_BUFFER;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4KB
//<2F>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>-1
2025-06-27 00:32:57 +08:00
int W25QXX_SetWorkSpace(void *buff,u32 size)
{
if (buff&&(size>=4096))
{
W25QXX_BUFFER=buff;
return 0;
}
else
{
return -1;
}
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void W25QXX_ClearWorkSpace(void)
{
W25QXX_BUFFER=0;
}
2025-07-05 19:47:28 +08:00
//дSPI FLASH
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
2025-06-27 00:32:57 +08:00
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
if (p_writeReadByte==0) return;
W25QXX_BUF=W25QXX_BUFFER;
if (W25QXX_BUF==0) return;
2025-07-05 19:47:28 +08:00
secpos=WriteAddr/4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
secoff=WriteAddr%4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><C6AB>
secremain=4096-secoff;//<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>С
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4096<39><36><EFBFBD>ֽ<EFBFBD>
2025-06-27 00:32:57 +08:00
while(1)
{
2025-07-05 19:47:28 +08:00
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++)//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
if(W25QXX_BUF[secoff+i]!=0XFF)break;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
if(i<secremain)//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
W25QXX_Erase_Sector(secpos); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++) //<2F><><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
W25QXX_BUF[i+secoff]=pBuffer[i];
}
2025-07-05 19:47:28 +08:00
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
}else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//д<>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><><D6B1>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(NumByteToWrite==secremain)break;//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else//д<><D0B4>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
secpos++;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>1
secoff=0;//ƫ<><C6AB>λ<EFBFBD><CEBB>Ϊ0
pBuffer+=secremain; //ָ<><D6B8>ƫ<EFBFBD><C6AB>
WriteAddr+=secremain; //д<><D0B4>ַƫ<D6B7><C6AB>
NumByteToWrite-=secremain; //<2F>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݼ<EFBFBD>
if(NumByteToWrite>4096)secremain=4096;//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
else secremain=NumByteToWrite; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
};
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ
//<2F>ȴ<EFBFBD>ʱ<EFBFBD><EFBFBD><E4B3AC>...
2025-06-27 00:32:57 +08:00
void W25QXX_Erase_Chip(void)
{
if (W25Q_INITED==0) return ;
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_ChipErase); //<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Dst_Addr:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:150ms
2025-06-27 00:32:57 +08:00
void W25QXX_Erase_Sector(u32 Dst_Addr)
{
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>falsh<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if (W25Q_INITED==0) return ;
if (p_printf) p_printf("fe:%x\r\n",Dst_Addr);
//Dst_Addr*=4096;
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_SectorErase); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
p_writeReadByte((u8)((Dst_Addr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
2025-06-27 00:32:57 +08:00
p_writeReadByte((u8)((Dst_Addr)>>8));
p_writeReadByte((u8)Dst_Addr);
2025-07-05 19:47:28 +08:00
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void W25QXX_Wait_Busy(void)
{
2025-07-05 19:47:28 +08:00
while((W25QXX_ReadSR()&0x01)==0x01); // <20>ȴ<EFBFBD>BUSYλ<59><CEBB><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
2025-06-27 00:32:57 +08:00
void W25QXX_PowerDown(void)
{
if (W25Q_INITED==0) return ;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_writeReadByte(W25X_PowerDown); //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
if (p_delay_us)
2025-07-05 19:47:28 +08:00
p_delay_us(3); //<2F>ȴ<EFBFBD>TPD
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void W25QXX_WAKEUP(void)
{
if (p_writeReadByte==0) return;
2025-07-05 19:47:28 +08:00
p_csPointLow(); //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
p_writeReadByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
2025-07-05 19:47:28 +08:00
p_csPointHigh(); //ȡ<><C8A1>Ƭѡ
2025-06-27 00:32:57 +08:00
if (p_delay_us)
2025-07-05 19:47:28 +08:00
p_delay_us(3); //<2F>ȴ<EFBFBD>TRES1
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡ<EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
u16 W25QXX_GetType (void)
{
return W25QXX_TYPE;
}
u32 W25QXX_GetFlashSize(void)
{
switch (W25QXX_TYPE)
{
case W25Q80:
return 1<<20;
case W25Q16:
return 2<<20;
case W25Q32:
return 4<<20;
case W25Q64:
return 8<<20;
case W25Q128:
return 16<<20;
}
return 0;
}