w25q64的地址怎么确定的?

2019-07-21 04:02发布

//读取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?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-07-21 08:02
 精彩回答 2  元偷偷看……
wan296555869
2楼-- · 2019-07-21 11:56
回复【2楼】正点原子:
---------------------------------
谢谢原子哥指点
wan296555869
3楼-- · 2019-07-21 14:19
回复【2楼】正点原子:
---------------------------------
再请教个问题 
//擦除一个扇区
//Dst_Addr:扇区地址 根据实际容量设置
//擦除一个山区的最少时间:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)   
{  
//监视falsh擦除情况,测试用   
  printf("fe:%x ",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范围内的一个地址 单片机直接判断把地址所处的块区擦掉呢
正点原子
4楼-- · 2019-07-21 15:07
回复【4楼】wan296555869:
---------------------------------
4K的整数倍。
Dream丶飞
5楼-- · 2019-07-21 17:01
正点原子 发表于 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)用户 ", User_Info[sum]);
      printf("%s", buf);
      
      sprintf((char *)buf, "用户名为:%s ", 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

一周热门 更多>