下面是我的理解与疑问
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区
功能为将要写入的数据写入已经擦除好的扇区0中
首先定义了
SPI_Flash_Write((u8*)TEXT_Buffer_SPI,1000,SIZE);
secpos=WriteAddr/4096;
其中WriteAddr为1000,那secpos=0,对吧???
然后调用SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096)函数为
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16
NumByteToWrite)
{ 这里的WriteAddr就应该等于0了吧???
u16 pageremain;
pageremain=(256-WriteAddr%256);
//单页剩余的字节数 每页有256个字节
由上面WriteAddr=0应该可以算pageremain=0吧???
if(NumByteToWrite<=pageremain)
pageremain=NumByteToWrite;//不大于256个字节
while(1)
{
SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain); //往一页中写入数据 最大为256字节 接着调用这个函数SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain)
//单页剩余的字节数 pageremain=0
if(NumByteToWrite==pageremain)break;//写完了1页数据(256字节)
else
//NumByteToWrite>pageremain //写的数据长度大于1页(256字节)
{
pBuffer+=pageremain; //pageremain=24
WriteAddr+=pageremain;
NumByteToWrite-=pageremain; //减去已经写入了的字节数
if(NumByteToWrite>256)pageremain=256;
//一次可以写入256个字节
else
pageremain=NumByteToWrite; //不够256个字节了
}
}
}
接着调用这个函数SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain)
此时WriteAddr=0,pageremain=0吧?
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16
NumByteToWrite)
{ 此时WriteAddr=0,NumByteToWrite
=0吧?
u16 i; //W25X16有8192可编程页,每页256个字节
SPI_FLASH_Write_Enable(); //写使能
SPI_FLASH_CS=0; //使能器件
SPIx_ReadWriteByte(W25X_PageProgram); //发送写页命令
SPIx_ReadWriteByte((u8)((WriteAddr)>>16));
SPIx_ReadWriteByte((u8)((WriteAddr)>>8));
SPIx_ReadWriteByte((u8)WriteAddr);
//发送24bit地址
for(i=0;i<NumByteToWrite;i++) //NumByteToWrite=0
SPIx_ReadWriteByte(pBuffer);//循环写入自己写入的数据 刚好写入一页的数据
SPI_FLASH_CS=1; //取消片选
SPI_Flash_Wait_Busy(); //等待写入结束
}
由上面分析NumByteToWrite
=0吧? 那怎么执行
for(i=0;i<NumByteToWrite;i++) //NumByteToWrite=0
SPIx_ReadWriteByte(pBuffer)
这条语句呢?????怎么将数据写入呢??? |