原子大哥,刚学习到FLASH的读写这一章,有个问题,看了两天也没有看明白,如下:
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * SPI_FLASH_BUF;
SPI_FLASH_BUF=SPI_FLASH_BUFFER;
secpos=WriteAddr/4096;//扇区地址
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小
//printf("ad:%X,nb:%X
",WriteAddr,NumByteToWrite);//测试用
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
//上面这句话,是说扇区地址加1,我还是没有理解,按照我的理解,应该是加4096,比如secpos为扇区的首地址(比如:XX0000H),那么当这个扇区写完后,应该是跳转到写下一个扇区,W25Q64上是XX1000H,加1怎么实现的?还是我把这个概念搞混淆了?恳请原子大哥给指导指导,先谢谢原子大哥!
secoff=0;//偏移位置为0
pBuffer+=secremain; //指针偏移
WriteAddr+=secremain;//写地址偏移
NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}
};
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我的理解是每个扇区是4096
扇区加1等于是从上一个扇区的结束地址转到下一个扇区的开始地址
---------------------------------
兄弟,你从哪里看出secpos为上一个扇区的结束地址?我到觉的secpos应该为扇区的首地址,如我理解有误,请兄弟多多指教。
-------------------------------
是我没说明白
我说的是一个扇区写不下的时候secpos+1 就相当于从上一个扇区的末尾转到下一个扇区的开始接着写
一整个扇区是4096 就像原子老大说的secpos是扇区偏移 从一个扇区移到另一个扇区操作
---------------------------------
原子大哥,secpos+1的本意是指从当前已写完的扇区转移到下一个新的扇区首地址吧(首地址叫法不一定正确),即(secpos+1)*4096为新扇区的首地址吧,这样理解对吗
---------------------------------
呵呵,谢谢兄弟的帮忙,是我理解错了,现在基本上明白了。
一周热门 更多>