初级会员

- 积分
- 169
- 金钱
- 169
- 注册时间
- 2020-11-24
- 在线时间
- 38 小时
|
5金钱
你好,请问SPI实验中,为何扇区序号*4096就是24位的地址?具体在附代码中“???”下面那一行。感谢解答。- u8 W25QXX_BUFFER[4096]; // 申请4KB的缓存空间
- void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
- {
- u32 secpos;
- u16 secoff;
- u16 secremain;
- u16 i;
- u8 * W25QXX_BUF; // 所谓u8 *类型,就是存放u8 变量地址的类型
- W25QXX_BUF=W25QXX_BUFFER; // u8 * 类型指针变量指向该缓存空间的第一个地址
- 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);//读出整个扇区的内容
- for(i=0;i<secremain;i++)//校验数据
- {
- if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除
- }
- if(i<secremain)//需要擦除
- {
- W25QXX_Erase_Sector(secpos);//擦除这个扇区
- for(i=0;i<secremain;i++) //复制
- {
- W25QXX_BUF[i+secoff]=pBuffer[i];
- }
- 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; //下一个扇区可以写完了
- }
- }
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
它这个意思不是说secpos*4096代表24位,它的意思是说这个模块可寻地址是24位的,有这么大的空间,您传入的地址要在这个范围,0~2^24-1地址范围内。
|