SPI driver for M25P* flash devices.
Dependents: flash-fs-example Dragonfly_Filesystem_Example Dragonfly_Low_Power_Example STM32F407VET6_SPIFlash ... more
Diff: SpiFlash25.cpp
- Revision:
- 5:31c110c2536c
- Parent:
- 4:751745dd637f
--- a/SpiFlash25.cpp Mon Jun 08 15:52:34 2015 -0500 +++ b/SpiFlash25.cpp Fri Jun 26 15:05:25 2020 -0500 @@ -22,14 +22,13 @@ #include "SpiFlash25.h" -SpiFlash25::SpiFlash25(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName W, PinName HOLD, int page_size) +SpiFlash25::SpiFlash25(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName W, PinName HOLD, int page_size, int mem_size) : _spi(mosi, miso, sclk), _cs(cs), + _mem_size(mem_size), _page_size(page_size) { - wakeup(); - _cs.write(1); _spi.format(8, 3); _spi.frequency(75000000); @@ -43,14 +42,7 @@ _hold->write(1); } - _cs.write(0); - _spi.write(READ_IDENTIFICATION); - _id[ID_MANUFACTURER] = _spi.write(0x00); - _id[ID_MEM_TYPE] = _spi.write(0x00); - _id[ID_MEM_SIZE] = _spi.write(0x00); - _cs.write(1); - - _mem_size = 1 << _id[ID_MEM_SIZE]; + wakeup(); } void SpiFlash25::format(int bits, int mode) { @@ -108,9 +100,25 @@ } char* SpiFlash25::read_id() { + _cs.write(0); + _spi.write(READ_IDENTIFICATION); + _id[ID_MANUFACTURER] = _spi.write(0x00); + _id[ID_MEM_TYPE] = _spi.write(0x00); + _id[ID_MEM_SIZE] = _spi.write(0x00); + _cs.write(1); + return _id; } +void SpiFlash25::write_status(char data) { + enable_write(); + _cs.write(0); + _spi.write(WRITE_STATUS); + _spi.write(data); + _cs.write(1); + wait_for_write(15); +} + char SpiFlash25::read_status() { char status; @@ -132,7 +140,7 @@ _spi.write(low_byte(addr)); _cs.write(1); - wait_for_write(); + wait_for_write(3000); } void SpiFlash25::clear_mem() { @@ -142,7 +150,7 @@ _spi.write(BULK_ERASE); _cs.write(1); - wait_for_write(); + wait_for_write(20000); } bool SpiFlash25::write_page(int addr, int len, const char* data) { @@ -159,9 +167,8 @@ } _cs.write(1); - wait_for_write(); - return true; + return wait_for_write(5); } void SpiFlash25::enable_write() { @@ -170,10 +177,12 @@ _cs.write(1); } -void SpiFlash25::wait_for_write() { - while (read_status() & STATUS_WIP) { +bool SpiFlash25::wait_for_write(int32_t timeout_ms) { + timeout_ms *= 100; + while ((read_status() & STATUS_WIP) && (timeout_ms-- > 0)) { wait_us(10); } + return timeout_ms > 0; } void SpiFlash25::deep_power_down() { @@ -187,3 +196,4 @@ _spi.write(DEEP_POWER_DOWN_RELEASE); _cs.write(1); } +