OpenEdv-开源电子网

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

w25q64的地址怎么确定的?

[复制链接]

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
发表于 2013-9-13 20:23:28 | 显示全部楼层 |阅读模式
//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
  u16 i;      
SPI_FLASH_CS=0;                            //使能器件   
    SPI2_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI2_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址    
    SPI2_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI2_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        pBuffer=SPI2_ReadWriteByte(0XFF);   //循环读数  
    }
SPI_FLASH_CS=1;            

用的flash是w25q64想问下这里的地址是怎么确定的 24bit表示2的24次方的地址空间吗 为什么是24?
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-13 20:52:08 | 显示全部楼层
回复【楼主位】wan296555869:
---------------------------------
从0开始,25q64的大小是8M字节,最大地址是8*1024*1024.
之所以是24位,是因为W25Q系列还有更高容量的:W25Q128,16M字节,那么地址就是16*1024*1024=2^24。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-13 21:00:15 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥指点
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-13 21:43:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
再请教个问题 
//擦除一个扇区
//Dst_Addr:扇区地址 根据实际容量设置
//擦除一个山区的最少时间:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)   
{  
//监视falsh擦除情况,测试用   
  printf("fe:%x\r\n",Dst_Addr);   
  Dst_Addr*=4096;
    SPI_FLASH_Write_Enable();                  //SET WEL   
    SPI_Flash_Wait_Busy();   
   SPI_FLASH_CS=0;                            //使能器件   
    SPI2_ReadWriteByte(W25X_SectorErase);      //发送扇区擦除指令 
    SPI2_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址    
    SPI2_ReadWriteByte((u8)((Dst_Addr)>>8));   
    SPI2_ReadWriteByte((u8)Dst_Addr);  
SPI_FLASH_CS=1;                            //取消片选            
    SPI_Flash_Wait_Busy();       //等待擦除完成
}  
这里擦除的地址是不是一定要是4K的整数倍 还是我填4K范围内的一个地址 单片机直接判断把地址所处的块区擦掉呢
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-13 23:09:44 | 显示全部楼层
回复【4楼】wan296555869:
---------------------------------
4K的整数倍。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-3-22
在线时间
2 小时
发表于 2019-3-22 10:16:44 | 显示全部楼层
正点原子 发表于 2013-9-13 23:09
回复【4楼】wan296555869:
---------------------------------
4K的整数倍。

for(sum = 0; sum < D_Len; sum++)
     {
      W25QXX_Read(Data, FLASH_SIZE + (User_Info[sum] * 4096), 20);
      
      sprintf((char *)buf, "(%d)用户\r\n", User_Info[sum]);
      printf("%s", buf);
      
      sprintf((char *)buf, "用户名为:%s\r\n\r\n", Data);
      printf("%s", buf);
     }
User_Info[sum] 为1时读取正常
User_Info[sum] 为2时就会连1的一起读出来


W25QXX_Write(USART1_BUF, FLASH_SIZE + (User_zc * 4096), 20);

User_zc和User_Info[sum] 值对应 捕获.PNG

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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