[开发工具] SPI地址 大问题 !!!!在线请求解答

[复制链接]
 楼主| probedog 发表于 2024-11-15 15:36 | 显示全部楼层 |阅读模式

u32 FLASH_SIZE;
FLASH_SIZE=128*1024*1024;        //FLASH 大小为2M字节
这句源码是不是应该改成:FLASH_SIZE=16*1024*1024;        //FLASH 大小为16M字节
而且W25Q128芯片上的24位地址,应该是字节地址吧,不应该是位地址吧;

   W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);   //从倒数第100个地址处开始,写入SIZE长度的数据
这句里面的FLASH_SIZE应该改成:FLASH_SIZE=16*1024*1024; 这种的字节地址吧




就像这个函数的第二个入口参数的大小明确说了是24位的地址  而不是128*1024*1024的27位地址吧【如下】


//写SPI FLASH  
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)      
//NumByteToWrite:要写入的字节数(最大65535)   
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;//扇区剩余空间大小   
  //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;   
   }
   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;  //下一个扇区可以写完了
  }  
};  
}
yangjiaxu 发表于 2024-12-11 10:56 | 显示全部楼层
如果按照2M的128*1024是对的话,这句源码FLASH_SIZE=16*8*8*1024*1024; 但是我也不理解,为啥2M是128*1024呢?不应该是2*8*1024*1024么?
jcky001 发表于 2024-12-11 11:13 | 显示全部楼层
在复制数据到W25QXX_BUF时,你应该使用pBuffer[i]而不是pBuffer。即应该是W25QXX_BUF[secoff+i] = pBuffer[i];。
elephant00 发表于 2024-12-11 11:14 | 显示全部楼层
对函数进行重构和测试,以确保它能够正确地写入数据到SPI FLASH中。
cr315 发表于 2024-12-11 13:00 | 显示全部楼层
应该在每次循环结束时更新这些指针。
慢动作 发表于 2024-12-31 00:15 | 显示全部楼层
FLASH_SIZE = 128 * 1024 * 1024; // FLASH 大小为2M字节
显然,这是错误的。128 * 1024 * 1024 实际上表示 128MB的大小,而 W25Q128 芯片的容量是 16MB。因此,这里应该修改为:

c

FLASH_SIZE = 16 * 1024 * 1024; // FLASH 大小为16M字节
因此,W25Q128 的实际存储大小是 16MB,而不是 128MB。
643757107 发表于 2024-12-31 19:16 | 显示全部楼层
SPI是没地址的吧,双向通信。
643757107 发表于 2024-12-31 19:17 | 显示全部楼层
SPI元件一般有一个CS片选引脚用于确认是否当前通信对象。
地瓜patch 发表于 2024-12-31 22:18 来自手机 | 显示全部楼层
写flash慢不少
地瓜patch 发表于 2024-12-31 22:18 来自手机 | 显示全部楼层
jcky001 发表于 2024-12-11 11:13
在复制数据到W25QXX_BUF时,你应该使用pBuffer而不是pBuffer。即应该是W25QXX_BUF[secoff+i] = pBuffer;。 ...

直接++实现地址累计
OKAKAKO 发表于 2024-12-31 22:21 | 显示全部楼层
SPI地址还是需要注意点
LOVEEVER 发表于 2024-12-31 22:32 | 显示全部楼层
地址问题一定要注意细节
风凉 发表于 2025-1-4 22:15 | 显示全部楼层
首先,关于 FLASH_SIZE 的赋值问题,这取决于你的FLASH芯片的实际大小。如果FLASH芯片是16M字节的,那么 FLASH_SIZE 应该被赋值为 16*1024*1024。如果你的芯片是2M字节的,那么 FLASH_SIZE 应该保持为 128*1024*1024
春日负喧 发表于 2025-1-4 22:23 | 显示全部楼层
是不是你的地址设置有问题啊?才会这样呢

她已醉 发表于 2025-1-5 02:00 | 显示全部楼层
关于地址的问题,你提到的24位地址确实是指字节地址。在大多数SPI FLASH芯片中,地址是以字节为单位的,并且通常是一个24位的地址。因此,当你使用 W25QXX_Write 函数时,提供的地址应该是以字节为单位的

将爱藏于深海 发表于 2025-1-5 03:00 | 显示全部楼层
在你提供的函数 W25QXX_Write 中,参数 WriteAddr 确实是一个24位的地址,用来指定开始写入的位置

温室雏菊 发表于 2025-1-5 04:00 | 显示全部楼层
地址应该是FLASH中的相对地址,不是 FLASH_SIZE 的值。因此,当你调用这个函数时,你应该提供你想要写入的实际地址,而不是 FLASH_SIZE 的值

白马过平川 发表于 2025-1-5 05:00 | 显示全部楼层
关于你的代码中的其他部分,看起来逻辑是正确的。你首先计算要写入的扇区位置以及在该扇区内的偏移量

西洲 发表于 2025-1-5 06:00 | 显示全部楼层
你检查是否需要擦除扇区,如果需要,就进行擦除并写入数据。如果不需要擦除,则直接写入数据。然后,你更新指针、地址和要写入的字节数,以便进行下一轮的写入操作

捧一束彼岸花 发表于 2025-1-5 07:00 | 显示全部楼层
正确设置 FLASH_SIZE 以匹配你的FLASH芯片的实际大小

43693677943dd1e72a.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

486

主题

3268

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部