watercici 发表于 2018-5-16 10:19:43

w25q16Flash读写的问题

现在我在用W25Q16这款FLASH芯片,现在出现了一个问题,就是我往一个地址中连着写两个0X55,然后再从这个地址中把他们读出来,可是我用逻辑分析仪抓取的结果是写时序正常,写的数据也正确,但是读的时序也是正常的,可是读出的数据却是两个0x00,读写的地址都是一样的,不知道这是怎么回事?涉及到的函数及变量:

      u8 Flash_Init_Value={0x55,0x55};
      u8 Flash_Read_Init_Value = {0};
      u8 Flash_Load_Init_Value = {0};


       Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);//判断读取的值是不是0x55,如果是则非首次用

      Flash_PagePro(Flash_Init_Value,WriteInitValueAddr,0x02); //如果不是,则将0x55,写入该地址
   Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);//读取一下,判断是否写入成功


基本函数:
void Flash_PagePro(u8 *Pdat,u32 addr,u16 Len)
{
u8 padr1,padr2,padr3;
      u8 i;
      padr1 = (addr & 0xff0000)>>16;
      padr2 = (addr & 0xff00)>>8;
      padr3 = addr & 0xff;
      
      while((Flash_Read_SR(0x05))&0x01);
      Flash_Write_EnorDis(ENABLE);
      
      SPI2_Flash_CS_LOW();
      SPI2_Flash_SendByte(PAGE_PROGRAM);
      SPI2_Flash_SendByte(padr1);
      SPI2_Flash_SendByte(padr2);
      SPI2_Flash_SendByte(padr3);
      
      for(i=0;i<Len;i++)
      {
                SPI2_Flash_SendByte(Pdat);
      }      
         SPI2_Flash_CS_HIGH();
}

void Flash_Read_Data(u32 addr, u32 len, u8* dst)
{
         u8 adr1,adr2,adr3;
         u32 i = 0;
      
//         SPI2_SetSpeed(SPI_BaudRatePrescaler_4);
         adr1 = (addr & 0xff0000)>>16;
         adr2 = (addr & 0xff00)>>8;
         adr3 =addr & 0xff;
         SPI2_Flash_CS_LOW();
         //delay_us(2);
         SPI2_Flash_SendByte(READ_DATA);
         SPI2_Flash_SendByte(adr1);
         SPI2_Flash_SendByte(adr2);
         SPI2_Flash_SendByte(adr3);
         for(i=0;i<len;i++)
      {               
                dst = SPI2_Flash_ReceiveByte();
      }
         SPI2_Flash_CS_HIGH();
}



anobodykey 发表于 2018-5-16 10:46:53

你有没有发现你读取的函数有问题呢?for(i=0;i<len;i++)
{               
    dst = SPI2_Flash_ReceiveByte();
}其中dst是你传递进来的数据指针,你不觉得你这个赋值语句有问题吗?,按我的理解应该是这么写
for(i=0;i<len;i++)
{               
    dst = SPI2_Flash_ReceiveByte();
}

xiajintaord 发表于 2018-5-16 11:02:35

anobodykey 说得对!

另外,Flash_Read_Data() 的参数 Flash_Read_Init_Value 在一开始被你初始化为0了:
u8 Flash_Read_Init_Value = {0};
所以你每次读取肯定是0啊

watercici 发表于 2018-5-16 11:20:04

本帖最后由 watercici 于 2018-5-16 11:22 编辑

anobodykey 发表于 2018-5-16 10:46
你有没有发现你读取的函数有问题呢?其中dst是你传递进来的数据指针,你不觉得你这个赋值语句有问题吗?,按 ...
不好意思,可能是我粘贴过程中,不小心删掉了,我的也是dst,还有其他的问题吗?诶????为什么我的括号和字母i显示不出来呢?那应该不是我删掉了,而是他没有显示,反正我和你说的是一样的。

watercici 发表于 2018-5-16 11:26:52

xiajintaord 发表于 2018-5-16 11:02
anobodykey 说得对!

另外,Flash_Read_Data() 的参数 Flash_Read_Init_Value 在一开始被你初始化为0了:


是这样的Flash_Read_Init_value我只是在变量定义的时候初始化了,然后我用Flash_Read_Data()这个函数来读取指定地址中的数据,并把它存在Flash_Read_Init_value中,是这样的,如果读取的数值为0,就将0X55写入到这个地址中去

watercici 发表于 2018-5-16 11:28:16

本帖最后由 watercici 于 2018-5-16 11:32 编辑

xiajintaord 发表于 2018-5-16 11:02
anobodykey 说得对!

另外,Flash_Read_Data() 的参数 Flash_Read_Init_Value 在一开始被你初始化为0了:

现在的问题是,我往WriteInitValueAddr这个地址中写两个0X55,然后在读出来是0第一个是写数据图,第二个是读数据图:

butterflyspring 发表于 2018-5-16 11:33:21

就是之前说的,你在接收弄个断点,看看接收寄存器呀,这很直接...

anobodykey 发表于 2018-5-16 11:37:18

watercici 发表于 2018-5-16 11:20
不好意思,可能是我粘贴过程中,不小心删掉了,我的也是dst,还有其他的问题吗?诶????为什么我的括 ...

哦,这样的话你可以更改一下排版,发帖时代码不要跟内容用一样的格式,发帖时上面有个<>的选项,是用来插入代码的,这样看起来更清晰,你可以试下,另外把你的读写接口也都放上来,只放一个Flash_Read_Data看不出问题的

watercici 发表于 2018-5-16 11:39:04

butterflyspring 发表于 2018-5-16 11:33
就是之前说的,你在接收弄个断点,看看接收寄存器呀,这很直接...

您能说的具体点吗,是看单片机的SPI状态寄存器中的RXNE还是SPI的数据寄存器DR?

watercici 发表于 2018-5-16 11:41:41

anobodykey 发表于 2018-5-16 11:37
哦,这样的话你可以更改一下排版,发帖时代码不要跟内容用一样的格式,发帖时上面有个的选项,是用来插入 ...

不好意思,问一下,您说的这个读写接口指什么,是硬件的引脚,还是软件的读写基本函数?
页: [1] 2 3 4
查看完整版本: w25q16Flash读写的问题