高级会员

- 积分
- 637
- 金钱
- 637
- 注册时间
- 2018-7-13
- 在线时间
- 197 小时
|
1金钱
金钱
u8 W25QXX_BUFFER[4096];
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//扇区地址
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小 1个扇区4096个字节
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除
}
}
请教各位 红色的这行程序 为什么要*4096 ,secpos不是已经代表了扇区的地址? 按照原子的程序,我从*4096读取4096个字节不是有可能超出这个扇区?
还有例程里面的写操作,为什么要擦除整个扇区,然后又写了1个扇区的数据。
|
|
最佳答案
查看完整内容[请看2#楼]
重点在这句:secpos=WriteAddr/4096;//扇区地址 。
secpos表示要写入的地址是在第几扇区,
secpos*4096表示该扇区所在的地址。
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);表示从地址secpos*4096开始读取4096字节的数据到W25QXX_BUF数组中
|