سلام. یه مشکلی با فلش سریال W25Q64 دارم.
وقتی کل چیپ رو پاک میکنم و یکسری دیتا میریزم و میخونم ، همه چی درست هست. ولی اگر Erase نکنم و دیتای جدیدی رو در همون خونه های حافظه که قبلا ریختم بریزم ، انگار دیتای جدید رو با قبلی AND میکنه و مینویسه.
وقتی هم که میخوام یک سکتور رو پاک کنم ، فقظط میتونم سکتور 0 رو پاک کنم. Block های 32 کیلویی و 64 کیلویی هم همینطور. فقط میتونم Block صفر رو پاک کنم.
سرعت SPI رو هم پایین بردم ولی فرقی نکرد.
این هم کدی که استفاده میکنم.
وقتی کل چیپ رو پاک میکنم و یکسری دیتا میریزم و میخونم ، همه چی درست هست. ولی اگر 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(); } //******************************************************************************