OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2090|回复: 4

SPI

[复制链接]

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-3 21:51:57 | 显示全部楼层 |阅读模式
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数组中
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10575
金钱
10575
注册时间
2017-2-18
在线时间
1915 小时
发表于 2018-9-3 21:51:58 | 显示全部楼层
重点在这句:secpos=WriteAddr/4096;//扇区地址  。
secpos表示要写入的地址是在第几扇区,
secpos*4096表示该扇区所在的地址。  
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);表示从地址secpos*4096开始读取4096字节的数据到W25QXX_BUF数组中
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 09:05:22 | 显示全部楼层
peng1554 发表于 2018-9-3 21:51
重点在这句:secpos=WriteAddr/4096;//扇区地址  。
secpos表示要写入的地址是在第几扇区,
secpos*4096表 ...

我只是想知道为什么要读4096个字节,我只是想去写几个字节而已,却要读出一个扇区去擦出,然后我有白白多写了4086个字节。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10575
金钱
10575
注册时间
2017-2-18
在线时间
1915 小时
发表于 2018-9-4 09:14:40 | 显示全部楼层
不學會32不改名 发表于 2018-9-4 09:05
我只是想知道为什么要读4096个字节,我只是想去写几个字节而已,却要读出一个扇区去擦出,然后我有白白多 ...

板载的FLASH芯片最小擦除单位为一个扇区(4096字节),在向FLASH写入数据之前必须确保所写入的地址保存的数据为0xff,否则就要擦除,怎么确保写入的地址保存的数据为0xff呢?
那就要先从写入的地址读取数据了,如果读取一个扇区的数据有地址保存的不是0xff,那就要擦除整个扇区了( if(W25QXX_BUF[secoff+i]!=0XFF)break;)
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 12:44:43 | 显示全部楼层
peng1554 发表于 2018-9-4 09:14
板载的FLASH芯片最小擦除单位为一个扇区(4096字节),在向FLASH写入数据之前必须确保所写入的地址保存的 ...

明白了,感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 01:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表