[mw_shl_code=c,true] W25QXX_Init();
while(W25QXX_TYPE!=W25Q64) //?ì??????W25Q128
{
LCD_ShowString(30,150,200,16,16,"W25Q64 Check Failed!");
LCD_ShowString(30,170,200,16,16,"Please Check! ");
}
W25QXX_Erase_Chip();
LCD_ShowString(30,150,200,16,16,"W25Q64 Ready!");
FLASH_SIZE=4*1024*1024; //FLASH ?ó????8M×???
LCD_ShowString(30,170,200,16,16,"Start Write W25Q128....");
W25QXX_Write((uint8_t*)TEXT_Buffer,FLASH_SIZE-100,sizeof(TEXT_Buffer)); //????????100?????·??????,????SIZE?¤????????
LCD_ShowString(30,190,200,16,16,"W25Q128 Write Finished!"); //?á???????ê??
LCD_ShowString(230,190,200,16,16,(uint8_t*)TEXT_Buffer); //??????????×?·??®
LCD_ShowString(30,210,200,16,16,"Start Read W25Q128.... ");
W25QXX_Read(datatemp,FLASH_SIZE-100,sizeof(TEXT_Buffer)); //????????100?????·??????,????SIZE??×???
LCD_ShowString(30,230,200,16,16,"The Data Readed Is: "); //?á???????ê??
LCD_ShowString(30,250,200,16,16,datatemp); //??????????×?·??®[/mw_shl_code]
[mw_shl_code=c,true]#include "w25qxx.h"
#include "spi_flash.h"
#include "uart.h"
uint16_t W25QXX_TYPE=W25Q64; //??????W25Q64
//4Kbytes??????Sector
//16????????1??Block
//W25Q64
//??????8M×???,????128??Block,4096??Sector
void W25QXX_Init(void)
{
SPI_FLASH_Init(); //??????SPI
SPI_FLASH_CS_HIGH();
W25QXX_TYPE=W25QXX_ReadID(); //????FLASH ID.
}
//????????ID
//·?????????:
//0XEF13,±í????????????W25Q80
//0XEF14,±í????????????W25Q16
//0XEF15,±í????????????W25Q32
//0XEF16,±í????????????W25Q64
//0XEF17,±í????????????W25Q128
uint16_t W25QXX_ReadID(void)
{
uint16_t Temp = 0;
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(0x90);//·???????ID?ü??
SPI_FLASH_SendByte(0x00);
SPI_FLASH_SendByte(0x00);
SPI_FLASH_SendByte(0x00);
Temp|=SPI_FLASH_SendByte(0xFF)<<8;
Temp|=SPI_FLASH_SendByte(0xFF);
printf("\r\n%x",Temp);
SPI_FLASH_CS_HIGH();
return Temp;
}
//????W25QXX??×????????÷
//BIT7 6 5 4 3 2 1 0
//SPR RV TB BP2 BP1 BP0 WEL BUSY
//SPR:????0,×????????÷±??¤??,????WP????
//TB,BP2,BP1,BP0:FLASH???ò??±??¤?è??
//WEL:?????????¨
//BUSY:??±ê????(1,??;0,????)
//????:0x00
uint8_t W25QXX_ReadSR(void)
{
uint8_t byte=0;
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_ReadStatusReg); //·???????×????????÷?ü??
byte=SPI_FLASH_SendByte(0Xff); //????????×???
// SPI_FLASH_CS_HIGH(); //????????
return byte;
}
//??W25QXX×????????÷
//????SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)??????!!!
void W25QXX_Write_SR(uint8_t sr)
{
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_WriteStatusReg); //·???????×????????÷?ü??
SPI_FLASH_SendByte(sr); //????????×???
// SPI_FLASH_CS_HIGH(); //????????
}
//W25QXX??????
//??WEL????
void W25QXX_Write_Enable(void)
{
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_WriteEnable); //·?????????
// SPI_FLASH_CS_HIGH(); //????????
}
//W25QXX??????
//??WEL????
void W25QXX_Write_Disable(void)
{
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_WriteDisable); //·?????????????
// SPI_FLASH_CS_HIGH(); //????????
}
//????SPI FLASH
//?????¨???·???????????¨?¤????????
//pBuffer:??????????
//ReadAddr:?????????????·(24bit)
//NumByteToRead:????????×?????(×??ó65535)
void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)
{
uint16_t i;
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_ReadData); //·????????ü??
SPI_FLASH_SendByte((uint8_t)((ReadAddr)>>16)); //·???24bit???·
SPI_FLASH_SendByte((uint8_t)((ReadAddr)>>8));
SPI_FLASH_SendByte((uint8_t)ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
pBuffer=SPI_FLASH_SendByte(0XFF); //???·????
}
SPI_FLASH_CS_HIGH();
}
//SPI??????(0~65535)??????????256??×?????????
//?????¨???·????????×??ó256×?????????
//pBuffer:??????????
//WriteAddr:?????????????·(24bit)
//NumByteToWrite:????????×?????(×??ó256),???????????????????????à×?????!!!
void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
uint16_t i;
W25QXX_Write_Enable(); //SET WEL
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_PageProgram); //·????????ü??
SPI_FLASH_SendByte((uint8_t)((WriteAddr)>>16)); //·???24bit???·
SPI_FLASH_SendByte((uint8_t)((WriteAddr)>>8));
SPI_FLASH_SendByte((uint8_t)WriteAddr);
for(i=0;i<NumByteToWrite;i++)SPI_FLASH_SendByte(pBuffer);//???·????
// SPI_FLASH_CS_HIGH(); //????????
W25QXX_Wait_Busy(); //?????????á??
SPI_FLASH_CS_HIGH();
}
//???ì?é??SPI FLASH
//±????·±??ù???????··??§??????????????0XFF,·??ò??·?0XFF???????????????§°?!
//????×???????????
//?????¨???·???????????¨?¤????????,???????·±????·??????!
//pBuffer:??????????
//WriteAddr:?????????????·(24bit)
//NumByteToWrite:????????×?????(×??ó65535)
//CHECK OK
void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
uint16_t pageremain;
pageremain=256-WriteAddr%256; //???????à??×?????
if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//???ó??256??×???
while(1)
{
W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
if(NumByteToWrite==pageremain)break;//?????á????
else //NumByteToWrite>pageremain
{
pBuffer+=pageremain;
WriteAddr+=pageremain;
NumByteToWrite-=pageremain; //????????????????×?????
if(NumByteToWrite>256)pageremain=256; //????????????256??×???
else pageremain=NumByteToWrite; //????256??×?????
}
};
}
//??SPI FLASH
//?????¨???·???????????¨?¤????????
//??????????????×÷!
//pBuffer:??????????
//WriteAddr:?????????????·(24bit)
//NumByteToWrite:????????×?????(×??ó65535)
uint8_t W25QXX_BUFFER[4096];
void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
uint32_t secpos;
uint16_t secoff;
uint16_t secremain;
uint16_t i;
uint8_t * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//???????·
secoff=WriteAddr%4096;//??????????????
secremain=4096-secoff;//???????à?????ó??
printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//??????
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//???ó??4096??×???
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//??????????????????
W25QXX_Wait_Busy();
for(i=0;i<secremain;i++)//???é????
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//?è??????
}
if(i<secremain)//?è??????
{
W25QXX_Erase_Sector(secpos);//????????????
W25QXX_Wait_Busy();
for(i=0;i<secremain;i++) //????
{
W25QXX_BUF[i+secoff]=pBuffer;
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//????????????
}
else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//??????????????,?±?????????????à????.
if(NumByteToWrite==secremain)break;//?????á????
else//???????á??
{
secpos++;//???????·??1
secoff=0;//??????????0
pBuffer+=secremain; //????????
WriteAddr+=secremain;//?????·????
NumByteToWrite-=secremain; //×?????????
if(NumByteToWrite>4096)secremain=4096; //???????????????????ê
else secremain=NumByteToWrite; //?????????????????ê??
}
SPI_FLASH_CS_HIGH();
};
}
void W25QXX_Erase_Chip(void) //???????????? //?????±?????¤...
{
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_ChipErase); //·??????????ü??
SPI_FLASH_CS_HIGH(); //????????
W25QXX_Wait_Busy(); //?????????????á??
}
//Dst_Addr:???????· ?ù???????????è??
//??????????????×????±??:150ms
void W25QXX_Erase_Sector(uint32_t Dst_Addr) //????????????
{
//?à??falsh?????é??,??????
SPI_FLASH_CS_HIGH();
printf("fe:%x\r\n",Dst_Addr);
Dst_Addr*=4096;
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_SectorErase); //·???????????????
SPI_FLASH_SendByte((uint8_t)((Dst_Addr)>>16)); //·???24bit???·
SPI_FLASH_SendByte((uint8_t)((Dst_Addr)>>8));
SPI_FLASH_SendByte((uint8_t)Dst_Addr);
// SPI_FLASH_CS_HIGH(); //????????
W25QXX_Wait_Busy(); //?????????ê??
SPI_FLASH_CS_HIGH();
}
//????????
void W25QXX_Wait_Busy(void)
{
SPI_FLASH_CS_HIGH();
while((W25QXX_ReadSR()&0x01)==0x01); // ????BUSY??????
SPI_FLASH_CS_HIGH();
}
//????????????
void W25QXX_PowerDown(void)
{
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_PowerDown); //·????????ü??
// SPI_FLASH_CS_HIGH(); //????????
//delay_us(3); //????TPD
}
//????
void W25QXX_WAKEUP(void)
{ SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW(); //?????÷??
SPI_FLASH_SendByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
// SPI_FLASH_CS_HIGH(); //????????
// delay_us(3); //????TRES1
}
[/mw_shl_code]
|