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

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

anobodykey 发表于 2018-5-16 11:37
哦,这样的话你可以更改一下排版,发帖时代码不要跟内容用一样的格式,发帖时上面有个的选项,是用来插入 ...这部分代码,前几行是执行函数,后面的是执行函数中用到的基本函数
      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);
      if((0x55 == Flash_Read_Init_Value) && (0x55 == Flash_Read_Init_Value))
      {
                        Flash_Load_Data();      
      }
      else
      {
                Flash_PagePro(Flash_Load_Init_Value,HeadAddr, 0x10);
                Flash_Load_Data();
                delay_us(5);
                Flash_PagePro(Flash_Init_Value,WriteInitValueAddr,0x02);
                Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);
      }

anobodykey 发表于 2018-5-16 11:50:05

watercici 发表于 2018-5-16 11:41
不好意思,问一下,您说的这个读写接口指什么,是硬件的引脚,还是软件的读写基本函数? ...
就是软件的读写基本函数,此外你可以读取一下flash的id看下是否读取正确借此检验你的接线是否正确

watercici 发表于 2018-5-16 11:55:42

anobodykey 发表于 2018-5-16 11:50
就是软件的读写基本函数,此外你可以读取一下flash的id看下是否读取正确借此检验你的接线是否正确 ...

这些是基本函数,读芯片的ID 没有问题,ID是0xEF 0x40 0x15

void SPI2_Flash_SendByte(u8 dat)
{
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//µÈ´ýÊý¾Ý¼Ä´æÆ÷¿Õ
        SPI_I2S_SendData(SPI2,dat);//д1¸ö×Ö½ÚÊý¾Ý
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
        SPI_I2S_ReceiveData(SPI2);
}

u8 SPI2_Flash_ReceiveByte(void)
{
                u8 RDat;
          while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){};//µÈ´ýÊý¾Ý¼Ä´æÆ÷¿Õ
          SPI_I2S_SendData(SPI2,0xFF);
       
                while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){};//µÈ´ý½ÓÊÕ»º³åÇø·Ç¿Õ£¬Ôò½ÓÊÕÊý¾Ý
          RDat = SPI_I2S_ReceiveData(SPI2);       
          return RDat;
}

//---- Write Enalbe or Write Disable-----------------------
void Flash_Write_EnorDis(FunctionalState sta)
{
        if(sta == ENABLE)
        {
                SPI2_Flash_CS_LOW();

                SPI2_Flash_SendByte(WRITE_ENABLE);

                SPI2_Flash_CS_HIGH();
        }
        else
        {
                SPI2_Flash_CS_LOW();

                SPI2_Flash_SendByte(WRTTE_DISABLE);
       
                SPI2_Flash_CS_HIGH();
        }
        //delay_ms(10);
}
//----Read status register-------------------------------------
u8 Flash_Read_SR(u8 regaddr)
{
          u8t;
//                SPI2_SetSpeed(SPI_BaudRatePrescaler_4);
          SPI2_Flash_CS_LOW();
                //delay_us(2);
                SPI2_Flash_SendByte(regaddr);
               
                t = SPI2_Flash_ReceiveByte();
               
                SPI2_Flash_CS_HIGH();       
       // delay_ms(10);
       
          return t;
}
//----Write register status------------------------------
void Flash_Write_SR(u16 Set_Dat)
{
       u8 dat1,dat2;
       dat1 = Set_Dat & 0xff; //µÍ8λ
       dat2 = (Set_Dat>>8) & 0xff;//¸ß8λ
       
       while((Flash_Read_SR(0x05))&0x01);//¼ì²éÊÇ·ñæ
       Flash_Write_EnorDis(ENABLE);//²»Ã¦£¬ÔòдʹÄÜ
       
   SPI2_Flash_CS_LOW();
        // delay_us(10);
       SPI2_Flash_SendByte(WRITE_STATUS_REGISTER);
       SPI2_Flash_SendByte(dat1);
       SPI2_Flash_SendByte(dat2);
   SPI2_Flash_CS_HIGH();
       //delay_ms(10);
}
//----Flash Read Data---------------------------------
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();
        //delay_ms(10);
        //return Rdat;
}
//----Load Default Data--------------------------------------------
void Flash_Load_Data(void)
{
Flash_Read_Data(HeadAddr,sizeof(LastRecordStruct),(u8*)LoadSaveData);
a;
}

//----Page Program-------------------------------------
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);//Ò³±à³Ì0x02
        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();
       //delay_ms(10);
}

anobodykey 发表于 2018-5-16 13:48:17

watercici 发表于 2018-5-16 11:55
这些是基本函数,读芯片的ID 没有问题,ID是0xEF 0x40 0x15

看起来是没啥问题的,如果读id正确的话,说明读取接口是对的,那可能是没写进去,看下写使能是否打开以及写保护引脚是否配置正确

watercici 发表于 2018-5-16 14:01:02

本帖最后由 watercici 于 2018-5-16 14:03 编辑

anobodykey 发表于 2018-5-16 13:48
看起来是没啥问题的,如果读id正确的话,说明读取接口是对的,那可能是没写进去,看下写使能是否打开以及 ...
WP和HOLD硬件连接都是接的高电平,写使能就是单片机给flash发送一个0X06的指令,从机应该是没有回复的,但不知道为什么有的时候,MISO上会收到一堆脉冲,但不知道是不是这个影响,还有就是在写使能前会读取状态寄存器,来检查总线是否忙,这里用的是while,程序中您也能看到,正常情况下,读取的值的最低位应该是0,那么说明总线不忙,可以写使能;可是,我读取的值是0x03什么的,反正最低位不是0,按理说这种情况下是不能发送写使能命令0X06的,可是时序上发送了,当我用逻辑分析仪单抓这段是他读取的却总是正常的。


我给你贴个图看看第一个是正常的,第二个是不正常的;0X05:读状态寄存器;0X06写使能;0X02页编程

watercici 发表于 2018-5-16 14:09:58

watercici 发表于 2018-5-16 14:01
WP和HOLD硬件连接都是接的高电平,写使能就是单片机给flash发送一个0X06的指令,从机应该是没有回复的,但 ...

这个问题加了一个延时,莫名其妙的脉冲没有了,但还是写不进去,@anobodykey,您帮我看看吧

stm1024 发表于 2018-5-16 14:20:37

W25Q16 Flash似乎在写入数据之前需要将BLock或者Sector先格式化一下,直接写数据并不能将原始数据覆盖,你看一下手册,顺便也试试这个方式?

watercici 发表于 2018-5-16 14:24:08

stm1024 发表于 2018-5-16 14:20
W25Q16 Flash似乎在写入数据之前需要将BLock或者Sector先格式化一下,直接写数据并不能将原始数据覆盖,你 ...

好的,谢谢!我看看

stm1024 发表于 2018-5-16 14:32:46

另外,这个芯片还带有Write Protect功能,检查一下,写数据之前, WP的状态

watercici 发表于 2018-5-16 14:46:21

本帖最后由 watercici 于 2018-5-16 14:48 编辑

stm1024 发表于 2018-5-16 14:32
另外,这个芯片还带有Write Protect功能,检查一下,写数据之前, WP的状态
如果您说的这个写保护是指WP引脚的话,它一直都是高电平无效,还有我在写之前加的擦除,还是不行。我抓取的时序图发现擦除的好快,而且时序上有点问题,不知道擦了没有。我给您贴张图
页: 1 [2] 3 4
查看完整版本: w25q16Flash读写的问题