SPI Flash AT45DBXXXD

Fork of at45db161d by Suga koubou

Revision:
7:2f9d8b47704f
Parent:
6:1872f591d604
Child:
8:1ec3997fe258
diff -r 1872f591d604 -r 2f9d8b47704f at45db161d.cpp
--- 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;
     }
 }