اطلاعیه

Collapse
No announcement yet.

مشکل با فلش سریال W25Q64

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با فلش سریال W25Q64

    سلام. یه مشکلی با فلش سریال W25Q64 دارم.
    وقتی کل چیپ رو پاک میکنم و یکسری دیتا میریزم و میخونم ، همه چی درست هست. ولی اگر Erase نکنم و دیتای جدیدی رو در همون خونه های حافظه که قبلا ریختم بریزم ، انگار دیتای جدید رو با قبلی AND میکنه و مینویسه.
    وقتی هم که میخوام یک سکتور رو پاک کنم ، فقظط میتونم سکتور 0 رو پاک کنم. Block های 32 کیلویی و 64 کیلویی هم همینطور. فقط میتونم Block صفر رو پاک کنم.
    سرعت SPI رو هم پایین بردم ولی فرقی نکرد.
    این هم کدی که استفاده میکنم.

    کد:
    //******************************************************************************
    #define   MAX_ADDRESS		  0x7FFFFF
    #define	  SECTOR_MAX   	  2047
    #define   SECTOR_SIZE		  0x1000
    //******************************************************************************
    void SPI_FLASH_WriteEnable()
    {
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x06);
      SPIFLASH_CS_ON;
    }
    //******************************************************************************
    void SPI_FLASH_WriteDisable()
    {
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x04);
      SPIFLASH_CS_ON;
    }
    //******************************************************************************
    void SPI_FLASH_ResetWriteProtection(void)
    {
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x50);
      SPIFLASH_CS_ON;
      _delay_us(1);
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x01);
      SPIFLASH_SPI(0);
      SPIFLASH_CS_ON;
    }
    //******************************************************************************
    void SPI_FLASH_Init()
    {
      Init_SPIF();
      //SPI_FLASH_ResetWriteProtection();
    }
    //******************************************************************************
    byte SPI_FLASH_IsWriteBusy(void)
    {
      byte temp;
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x05);
      temp = SPIFLASH_SPI(0xFF);
      SPIFLASH_CS_ON;
      return (temp & 0x01);
    }
    //******************************************************************************
    // 25 sec ...
    void SPI_FLASH_ChipErase(void)
    {
      _debug("Start Chip Erase...\r");
      SPI_FLASH_WriteEnable();
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x60);
      SPIFLASH_CS_ON;
      while(SPI_FLASH_IsWriteBusy());
      _debug("Chip erased ok...\r");
    }
    //******************************************************************************
    // Erase sector ,,,,  sector_size = 4096 bytes
    void SPI_FLASH_SectorErase(ulong address)
    {
      _debug("SE(%ld)\r",address);
      SPI_FLASH_WriteEnable();
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x20);
      SPIFLASH_SPI(BYTE_2(address));
      SPIFLASH_SPI(BYTE_1(address));
      SPIFLASH_SPI(BYTE_0(address));
      SPIFLASH_CS_ON;
      _delay_ms(100);
      while(SPI_FLASH_IsWriteBusy());
    }
    //******************************************************************************
    void SPI_FLASH_ReadBuffer(ulong address,byte *buf,uint counter)
    {
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x0B);
      SPIFLASH_SPI(BYTE_2(address));
      SPIFLASH_SPI(BYTE_1(address));
      SPIFLASH_SPI(BYTE_0(address));
      SPIFLASH_SPI(0xFF);
      while(counter--)
      {
        *buf++ = SPIFLASH_SPI(0xFF);
      }
      SPIFLASH_CS_ON;
    }
    //******************************************************************************
    byte SPI_FLASH_ReadByte(ulong address)
    {
      byte data;
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x03);
      SPIFLASH_SPI(BYTE_2(address));
      SPIFLASH_SPI(BYTE_1(address));
      SPIFLASH_SPI(BYTE_0(address));
      data = SPIFLASH_SPI(0xFF);
      SPIFLASH_CS_ON;
    	return data;
    }
    //******************************************************************************
    void SPI_FLASH_WriteByte(ulong address, byte data)
    {
      SPI_FLASH_WriteEnable();
      SPIFLASH_CS_OFF;
      SPIFLASH_SPI(0x02);
      SPIFLASH_SPI(BYTE_2(address));
      SPIFLASH_SPI(BYTE_1(address));
      SPIFLASH_SPI(BYTE_0(address));
    	SPIFLASH_SPI(data);
      SPIFLASH_CS_ON;
      while(SPI_FLASH_IsWriteBusy());
      //SPI_FLASH_WriteDisable();
    }
    //******************************************************************************
لطفا صبر کنید...
X