想问,w25q64 芯片的最小读写单位是页还是扇区,页是256字节,而扇区是4096字节,可是我看历程里面,有直接对页进行读写操作的,为什么还要弄一个扇区的读写操作呢?
这是对页进行写操作
[mw_shl_code=c,true]void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 i;
SPI_FLASH_Write_Enable(); //SET WEL
SPI_FLASH_CS=0; //?????÷??
SPI2_ReadWriteByte(W25X_PageProgram); //·????????ü??
SPI2_ReadWriteByte((u8)((WriteAddr)>>16)); //·???24bit???·
SPI2_ReadWriteByte((u8)((WriteAddr)>>8));
SPI2_ReadWriteByte((u8)WriteAddr);
for(i=0;i<NumByteToWrite;i++)SPI2_ReadWriteByte(pBuffer);//???·????
SPI_FLASH_CS=1; //????????
SPI_Flash_Wait_Busy(); //?????????á??
}
[/mw_shl_code]
这是对扇区进行写操作
[mw_shl_code=c,true]void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
secpos=WriteAddr/4096;//???????· 0~511 for w25x16
secoff=WriteAddr%4096;//??????????????
secremain=4096-secoff;//???????à?????ó??
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//???ó??4096??×???
while(1)
{
SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//??????????????????
for(i=0;i<secremain;i++)//???é????
{
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//?è??????
}
if(i<secremain)//?è??????
{
SPI_Flash_Erase_Sector(secpos);//????????????
for(i=0;i<secremain;i++) //????
{
SPI_FLASH_BUF[i+secoff]=pBuffer;
}
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//????????????
}else SPI_Flash_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; //?????????????????ê??
}
};
}
[/mw_shl_code]
|