SPI Flash AT45DBXXXD
Fork of at45db161d by
Diff: at45db161d.cpp
- Revision:
- 7:2f9d8b47704f
- Parent:
- 6:1872f591d604
- Child:
- 8:1ec3997fe258
--- a/at45db161d.cpp Fri Mar 06 09:42:28 2015 +0800 +++ b/at45db161d.cpp Fri Mar 06 15:47:44 2015 +0800 @@ -17,14 +17,31 @@ ATD45DB161D::ATD45DB161D(SPI *spi, PinName cs) : _spi(spi), _cs(cs) { - _bytes = 264; - _pages = 4095; +// pageSize = 264; +// pageLength = 4095; /* Disable device */ DF_CS_inactive; /* Setup SPI */ _spi->format(8, 0); _spi->frequency(10000000); + + DF_CS_inactive; /* Make sure to toggle CS signal in order */ + DF_CS_active; /* to reset Dataflash command decoder */ + + /* Send status read command */ + _spi->write(AT45DB161D_READ_MANUFACTURER_AND_DEVICE_ID); + + /* Manufacturer ID */ + _info.manufacturer = _spi->write(0xff); + /* Device ID (part 1) */ + _info.device[0] = _spi->write(0xff); + /* Device ID (part 2) */ + _info.device[1] = _spi->write(0xff); + /* Extended Device Information String Length */ + _info.extendedInfoLength = _spi->write(0xff); + _info.pageSize = 264; + _info.pageLength = 4095; } /** @@ -52,23 +69,8 @@ * the extended device information string bytes. * @param id Pointer to the ID structure to initialize **/ -void ATD45DB161D::ReadManufacturerAndDeviceID(struct ATD45DB161D::ID *id) { - - DF_CS_inactive; /* Make sure to toggle CS signal in order */ - DF_CS_active; /* to reset Dataflash command decoder */ - - /* Send status read command */ - _spi->write(AT45DB161D_READ_MANUFACTURER_AND_DEVICE_ID); - - /* Manufacturer ID */ - id->manufacturer = _spi->write(0xff); - /* Device ID (part 1) */ - id->device[0] = _spi->write(0xff); - /* Device ID (part 2) */ - id->device[1] = _spi->write(0xff); - /* Extended Device Information String Length */ - id->extendedInfoLength = _spi->write(0xff); - +ATD45DB161D::Info *ATD45DB161D::getInfo() { + return &_info; } /** @@ -127,11 +129,16 @@ void ATD45DB161D::read(uint16_t addr, void *ptr, uint16_t len) { uint8_t *buf = reinterpret_cast<uint8_t*>(ptr); - int i; - PageToBuffer(addr / _bytes, 1); - BufferRead(1, addr % _bytes, 1); - for (i = 0; i < len; i++) { - buf[i] = _spi->write(0xff); + uint16_t i; + while (len > 0) { + PageToBuffer(addr / _info.pageSize, 1); + BufferRead(1, addr % _info.pageSize, 1); + uint16_t wlen = (_info.pageSize < len ? _info.pageSize : len); + for (i = 0; i < wlen; i++) { + *buf++ = _spi->write(0xff); + } + len -= wlen; + addr += _info.pageSize; } } @@ -139,14 +146,14 @@ uint8_t *buf = reinterpret_cast<uint8_t*>(ptr); uint16_t i; while (len > 0) { - BufferWrite(2, addr % _bytes); - uint16_t wlen = (_bytes < len ? _bytes : len); + BufferWrite(2, addr % _info.pageSize); + uint16_t wlen = (_info.pageSize < len ? _info.pageSize : len); for (i = 0; i < wlen; i++) { _spi->write(*buf++); } + BufferToPage(2, addr / _info.pageSize, 1); len -= wlen; - BufferToPage(2, addr / _bytes, 1); - addr += _bytes; + addr += _info.pageSize; } }