Forked library from okini3939/at45db161d

Fork of at45db161d by Suga koubou

Committer:
k4zuki
Date:
Thu Oct 01 08:39:46 2015 +0000
Revision:
3:c2cd805585ef
Parent:
2:111e8cf6f263
additional constructor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:2e953bbaf3a5 1 /**
okini3939 0:2e953bbaf3a5 2 * @file at45db161d.h
okini3939 0:2e953bbaf3a5 3 * @brief AT45DB161D module
okini3939 0:2e953bbaf3a5 4 **/
okini3939 0:2e953bbaf3a5 5 #ifndef AT45DB161D_H
okini3939 0:2e953bbaf3a5 6 #define AT45DB161D_H
okini3939 0:2e953bbaf3a5 7
okini3939 0:2e953bbaf3a5 8 #include "mbed.h"
okini3939 0:2e953bbaf3a5 9
okini3939 0:2e953bbaf3a5 10 extern "C" {
okini3939 0:2e953bbaf3a5 11
okini3939 0:2e953bbaf3a5 12 //#include <avr/pgmspace.h>
okini3939 0:2e953bbaf3a5 13 #include <inttypes.h>
okini3939 0:2e953bbaf3a5 14 //#include "WConstants.h"
okini3939 0:2e953bbaf3a5 15
okini3939 0:2e953bbaf3a5 16 };
okini3939 0:2e953bbaf3a5 17
okini3939 0:2e953bbaf3a5 18 #include "at45db161d_commands.h"
k4zuki 2:111e8cf6f263 19 #include "SWSPI.h"
okini3939 0:2e953bbaf3a5 20
okini3939 0:2e953bbaf3a5 21 /**
okini3939 0:2e953bbaf3a5 22 * @defgroup AT45DB161D AT45DB161D module
okini3939 0:2e953bbaf3a5 23 * @{
okini3939 0:2e953bbaf3a5 24 **/
okini3939 0:2e953bbaf3a5 25
okini3939 0:2e953bbaf3a5 26 /**
okini3939 0:2e953bbaf3a5 27 * @defgroup SPI SPI pinout and transfert function
okini3939 0:2e953bbaf3a5 28 * @{
okini3939 0:2e953bbaf3a5 29 **/
okini3939 0:2e953bbaf3a5 30 #ifndef SPI
okini3939 0:2e953bbaf3a5 31 /**
okini3939 0:2e953bbaf3a5 32 * @defgroup SPI_Pinout SPI pinout
okini3939 0:2e953bbaf3a5 33 * @{
okini3939 0:2e953bbaf3a5 34 **/
okini3939 0:2e953bbaf3a5 35 /** Serial input (SI) **/
okini3939 0:2e953bbaf3a5 36 #define DATAOUT 11
okini3939 0:2e953bbaf3a5 37 /** Serial output (SO) **/
okini3939 0:2e953bbaf3a5 38 #define DATAIN 12
okini3939 0:2e953bbaf3a5 39 /** Serial clock (SCK) **/
okini3939 0:2e953bbaf3a5 40 #define SPICLOCK 13
okini3939 0:2e953bbaf3a5 41 /** Chip select (CS) **/
okini3939 0:2e953bbaf3a5 42 #define SLAVESELECT 10
okini3939 0:2e953bbaf3a5 43 /** Reset (Reset) **/
okini3939 0:2e953bbaf3a5 44 #define RESET 8
okini3939 0:2e953bbaf3a5 45 /** Write protect (WP) **/
okini3939 0:2e953bbaf3a5 46 #define WP 7
okini3939 0:2e953bbaf3a5 47 /**
okini3939 0:2e953bbaf3a5 48 * @}
okini3939 0:2e953bbaf3a5 49 **/
okini3939 0:2e953bbaf3a5 50
okini3939 0:2e953bbaf3a5 51 /**
okini3939 0:2e953bbaf3a5 52 * @fn inline uint8_t spi_transfer(uint8_t data)
okini3939 0:2e953bbaf3a5 53 * @brief Transfer a byte via spi
okini3939 0:2e953bbaf3a5 54 * @param data Data to transfer via SPI
k4zuki 2:111e8cf6f263 55 * @return The content of the SPI data register
okini3939 0:2e953bbaf3a5 56 **/
okini3939 0:2e953bbaf3a5 57 /*
okini3939 0:2e953bbaf3a5 58 inline uint8_t spi_transfer(uint8_t data)
okini3939 0:2e953bbaf3a5 59 {
okini3939 0:2e953bbaf3a5 60 SPDR = data;
okini3939 0:2e953bbaf3a5 61 while(!(SPSR & (1 << SPIF))) ;
okini3939 0:2e953bbaf3a5 62 return SPDR;
okini3939 0:2e953bbaf3a5 63 }
okini3939 0:2e953bbaf3a5 64 */
okini3939 0:2e953bbaf3a5 65 #define spi_transfer(data) _spi.write(data)
okini3939 0:2e953bbaf3a5 66
okini3939 0:2e953bbaf3a5 67 /** De-assert CS **/
okini3939 0:2e953bbaf3a5 68 //#define DF_CS_inactive digitalWrite(SLAVESELECT,HIGH)
okini3939 0:2e953bbaf3a5 69 #define DF_CS_inactive _cs = 1
okini3939 0:2e953bbaf3a5 70 /** Assert CS **/
okini3939 0:2e953bbaf3a5 71 //#define DF_CS_active digitalWrite(SLAVESELECT,LOW)
okini3939 0:2e953bbaf3a5 72 #define DF_CS_active _cs = 0
okini3939 0:2e953bbaf3a5 73
okini3939 0:2e953bbaf3a5 74 #endif /* SPI */
okini3939 0:2e953bbaf3a5 75 /**
okini3939 0:2e953bbaf3a5 76 * @}
okini3939 0:2e953bbaf3a5 77 **/
okini3939 0:2e953bbaf3a5 78
okini3939 0:2e953bbaf3a5 79 /**
okini3939 0:2e953bbaf3a5 80 * @defgroup STATUS_REGISTER_FORMAT Status register format
okini3939 0:2e953bbaf3a5 81 * @{
okini3939 0:2e953bbaf3a5 82 **/
okini3939 0:2e953bbaf3a5 83 /**
k4zuki 2:111e8cf6f263 84 * @brief Ready/busy status is indicated using bit 7 of the status register.
okini3939 0:2e953bbaf3a5 85 * If bit 7 is a 1, then the device is not busy and is ready to accept
okini3939 0:2e953bbaf3a5 86 * the next command. If bit 7 is a 0, then the device is in a busy
okini3939 0:2e953bbaf3a5 87 * state.
okini3939 0:2e953bbaf3a5 88 **/
okini3939 0:2e953bbaf3a5 89 #define READY_BUSY 0x80
okini3939 0:2e953bbaf3a5 90 /**
okini3939 0:2e953bbaf3a5 91 * Result of the most recent Memory Page to Buffer Compare operation.
okini3939 0:2e953bbaf3a5 92 * If this bit is equal to 0, then the data in the main memory page
okini3939 0:2e953bbaf3a5 93 * matches the data in the buffer. If it's 1 then at least 1 byte in
okini3939 0:2e953bbaf3a5 94 * the main memory page does not match the data in the buffer.
okini3939 0:2e953bbaf3a5 95 **/
okini3939 0:2e953bbaf3a5 96 #define COMPARE 0x40
okini3939 0:2e953bbaf3a5 97 /**
okini3939 0:2e953bbaf3a5 98 * Bit 1 in the Status Register is used to provide information to the
okini3939 0:2e953bbaf3a5 99 * user whether or not the sector protection has been enabled or
okini3939 0:2e953bbaf3a5 100 * disabled, either by software-controlled method or
okini3939 0:2e953bbaf3a5 101 * hardware-controlled method. 1 means that the sector protection has
okini3939 0:2e953bbaf3a5 102 * been enabled and 0 that it has been disabled.
okini3939 0:2e953bbaf3a5 103 **/
okini3939 0:2e953bbaf3a5 104 #define PROTECT 0x02
okini3939 0:2e953bbaf3a5 105 /**
okini3939 0:2e953bbaf3a5 106 * Bit 0 indicates wether the page size of the main memory array is
okini3939 0:2e953bbaf3a5 107 * configured for "power of 2" binary page size (512 bytes) (bit=1) or
okini3939 0:2e953bbaf3a5 108 * standard DataFlash page size (528 bytes) (bit=0).
okini3939 0:2e953bbaf3a5 109 **/
okini3939 0:2e953bbaf3a5 110 #define PAGE_SIZE 0x01
okini3939 0:2e953bbaf3a5 111 /**
okini3939 0:2e953bbaf3a5 112 * Bits 5, 4, 3 and 2 indicates the device density. The decimal value
okini3939 0:2e953bbaf3a5 113 * of these four binary bits does not equate to the device density; the
okini3939 0:2e953bbaf3a5 114 * four bits represent a combinational code relating to differing
okini3939 0:2e953bbaf3a5 115 * densities of DataFlash devices. The device density is not the same
okini3939 0:2e953bbaf3a5 116 * as the density code indicated in the JEDEC device ID information.
okini3939 0:2e953bbaf3a5 117 * The device density is provided only for backward compatibility.
okini3939 0:2e953bbaf3a5 118 **/
okini3939 0:2e953bbaf3a5 119 #define DEVICE_DENSITY 0x2C
okini3939 0:2e953bbaf3a5 120 /**
okini3939 0:2e953bbaf3a5 121 * @}
okini3939 0:2e953bbaf3a5 122 **/
okini3939 0:2e953bbaf3a5 123
okini3939 0:2e953bbaf3a5 124 /**
okini3939 0:2e953bbaf3a5 125 * @brief at45db161d module
okini3939 0:2e953bbaf3a5 126 * @todo
okini3939 0:2e953bbaf3a5 127 * - TESTS!
okini3939 0:2e953bbaf3a5 128 * - Protection and Security Commands
okini3939 0:2e953bbaf3a5 129 * - Auto Page Rewrite through Buffer 1
okini3939 0:2e953bbaf3a5 130 * - Auto Page Rewrite through Buffer 2
okini3939 0:2e953bbaf3a5 131 **/
okini3939 0:2e953bbaf3a5 132 class ATD45DB161D
okini3939 0:2e953bbaf3a5 133 {
okini3939 0:2e953bbaf3a5 134 public:
okini3939 0:2e953bbaf3a5 135 /**
okini3939 0:2e953bbaf3a5 136 * @brief ID structure
okini3939 0:2e953bbaf3a5 137 * This structure contains various informations about the
okini3939 0:2e953bbaf3a5 138 * dataflash chip being used.
okini3939 0:2e953bbaf3a5 139 **/
okini3939 0:2e953bbaf3a5 140 struct ID
okini3939 0:2e953bbaf3a5 141 {
okini3939 0:2e953bbaf3a5 142 uint8_t manufacturer; /**< Manufacturer id **/
okini3939 0:2e953bbaf3a5 143 uint8_t device[2]; /**< Device id **/
okini3939 0:2e953bbaf3a5 144 uint8_t extendedInfoLength; /**< Extended device information string length **/
okini3939 0:2e953bbaf3a5 145 };
okini3939 0:2e953bbaf3a5 146
okini3939 0:2e953bbaf3a5 147 public:
okini3939 0:2e953bbaf3a5 148 /** CTOR **/
okini3939 0:2e953bbaf3a5 149 ATD45DB161D(PinName mosi, PinName miso, PinName sclk, PinName cs);
k4zuki 3:c2cd805585ef 150
k4zuki 3:c2cd805585ef 151 /** CTOR using pointer to SWSPI instance **/
k4zuki 2:111e8cf6f263 152 ATD45DB161D(SWSPI &spi, PinName cs);
k4zuki 3:c2cd805585ef 153
okini3939 0:2e953bbaf3a5 154 /** DTOR **/
okini3939 0:2e953bbaf3a5 155 ~ATD45DB161D();
okini3939 0:2e953bbaf3a5 156
okini3939 0:2e953bbaf3a5 157 /** Setup SPI and pinout **/
okini3939 0:2e953bbaf3a5 158 void Init();
okini3939 0:2e953bbaf3a5 159
okini3939 0:2e953bbaf3a5 160 /**
okini3939 0:2e953bbaf3a5 161 * Read status register
okini3939 0:2e953bbaf3a5 162 * @return The content of the status register
okini3939 0:2e953bbaf3a5 163 * **/
okini3939 0:2e953bbaf3a5 164 uint8_t ReadStatusRegister();
okini3939 0:2e953bbaf3a5 165
okini3939 0:2e953bbaf3a5 166 /**
okini3939 0:2e953bbaf3a5 167 * Read Manufacturer and Device ID
okini3939 0:2e953bbaf3a5 168 * @note if id.extendedInfoLength is not equal to zero,
okini3939 0:2e953bbaf3a5 169 * successive calls to spi_transfer(0xff) will return
okini3939 0:2e953bbaf3a5 170 * the extended device information string bytes.
okini3939 0:2e953bbaf3a5 171 * @param id Pointer to the ID structure to initialize
okini3939 0:2e953bbaf3a5 172 **/
okini3939 0:2e953bbaf3a5 173 void ReadManufacturerAndDeviceID(struct ATD45DB161D::ID *id);
okini3939 0:2e953bbaf3a5 174
okini3939 0:2e953bbaf3a5 175 /**
okini3939 0:2e953bbaf3a5 176 * A main memory page read allows the user to read data directly from
okini3939 0:2e953bbaf3a5 177 * any one of the 4096 pages in the main memory, bypassing both of the
okini3939 0:2e953bbaf3a5 178 * data buffers and leaving the contents of the buffers unchanged.
okini3939 0:2e953bbaf3a5 179 * @param page Page of the main memory to read
okini3939 0:2e953bbaf3a5 180 * @param offset Starting byte address within the page
okini3939 0:2e953bbaf3a5 181 **/
okini3939 0:2e953bbaf3a5 182 void ReadMainMemoryPage(uint16_t page, uint16_t offset);
okini3939 0:2e953bbaf3a5 183
okini3939 0:2e953bbaf3a5 184 /**
okini3939 0:2e953bbaf3a5 185 * Sequentially read a continuous stream of data.
okini3939 0:2e953bbaf3a5 186 * @param page Page of the main memory where the sequential read will start
okini3939 0:2e953bbaf3a5 187 * @param offset Starting byte address within the page
okini3939 0:2e953bbaf3a5 188 * @param low If true the read operation will be performed in low speed mode (and in high speed mode if it's false).
okini3939 0:2e953bbaf3a5 189 * @note The legacy mode is not currently supported
okini3939 0:2e953bbaf3a5 190 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 191 **/
okini3939 0:2e953bbaf3a5 192 void ContinuousArrayRead(uint16_t page, uint16_t offset, uint8_t low);
okini3939 0:2e953bbaf3a5 193
okini3939 0:2e953bbaf3a5 194 /**
okini3939 0:2e953bbaf3a5 195 * Read the content of one of the SRAM data buffers (in low or high speed mode).
okini3939 0:2e953bbaf3a5 196 * @param bufferNum Buffer to read (1 or 2)
okini3939 0:2e953bbaf3a5 197 * @param offset Starting byte within the buffer
okini3939 0:2e953bbaf3a5 198 * @param low If true the read operation will be performed in low speed mode (and in high speed mode if it's false).
okini3939 0:2e953bbaf3a5 199 **/
okini3939 0:2e953bbaf3a5 200 void BufferRead(uint8_t bufferNum, uint16_t offset, uint8_t low);
okini3939 0:2e953bbaf3a5 201
okini3939 0:2e953bbaf3a5 202 /**
okini3939 0:2e953bbaf3a5 203 * Write data to one of the SRAM data buffers. Any further call to
okini3939 0:2e953bbaf3a5 204 * spi_tranfer will return bytes contained in the data buffer until
okini3939 0:2e953bbaf3a5 205 * a low-to-high transition is detected on the CS pin. If the end of
okini3939 0:2e953bbaf3a5 206 * the data buffer is reached, the device will wrap around back to the
okini3939 0:2e953bbaf3a5 207 * beginning of the buffer.
okini3939 0:2e953bbaf3a5 208 * @param bufferNum Buffer to read (1 or 2)
okini3939 0:2e953bbaf3a5 209 * @param offset Starting byte within the buffer
okini3939 0:2e953bbaf3a5 210 **/
okini3939 0:2e953bbaf3a5 211 void BufferWrite(uint8_t bufferNum, uint16_t offset);
okini3939 0:2e953bbaf3a5 212
okini3939 0:2e953bbaf3a5 213 /**
okini3939 0:2e953bbaf3a5 214 * Transfer data from buffer 1 or 2 to main memory page.
okini3939 0:2e953bbaf3a5 215 * @param bufferNum Buffer to use (1 or 2)
okini3939 0:2e953bbaf3a5 216 * @param page Page where the content of the buffer will transfered
okini3939 0:2e953bbaf3a5 217 * @param erase If set the page will be first erased before the buffer transfer.
okini3939 0:2e953bbaf3a5 218 * @note If erase is equal to zero, the page must have been previously erased using one of the erase command (Page or Block Erase).
okini3939 0:2e953bbaf3a5 219 **/
okini3939 0:2e953bbaf3a5 220 void BufferToPage(uint8_t bufferNum, uint16_t page, uint8_t erase);
okini3939 0:2e953bbaf3a5 221
okini3939 0:2e953bbaf3a5 222 /**
okini3939 0:2e953bbaf3a5 223 * Transfer a page of data from main memory to buffer 1 or 2.
okini3939 0:2e953bbaf3a5 224 * @param page Main memory page to transfer
okini3939 0:2e953bbaf3a5 225 * @param buffer Buffer (1 or 2) where the data will be written
okini3939 0:2e953bbaf3a5 226 **/
okini3939 0:2e953bbaf3a5 227 void PageToBuffer(uint16_t page, uint8_t bufferNum);
okini3939 0:2e953bbaf3a5 228
okini3939 0:2e953bbaf3a5 229 /**
okini3939 0:2e953bbaf3a5 230 * Erase a page in the main memory array.
okini3939 0:2e953bbaf3a5 231 * @param page Page to erase
okini3939 0:2e953bbaf3a5 232 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 233 **/
okini3939 0:2e953bbaf3a5 234 void PageErase(uint16_t page);
okini3939 0:2e953bbaf3a5 235
okini3939 0:2e953bbaf3a5 236 /**
okini3939 0:2e953bbaf3a5 237 * Erase a block of eight pages at one time.
okini3939 0:2e953bbaf3a5 238 * @param block Index of the block to erase
okini3939 0:2e953bbaf3a5 239 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 240 **/
okini3939 0:2e953bbaf3a5 241 void BlockErase(uint16_t block);
okini3939 0:2e953bbaf3a5 242
okini3939 0:2e953bbaf3a5 243 /**
okini3939 0:2e953bbaf3a5 244 * Erase a sector in main memory. There are 16 sector on the
okini3939 0:2e953bbaf3a5 245 * at45db161d and only one can be erased at one time.
okini3939 0:2e953bbaf3a5 246 * @param sector Sector to erase
okini3939 0:2e953bbaf3a5 247 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 248 **/
okini3939 0:2e953bbaf3a5 249 void SectoreErase(uint8_t sector);
okini3939 0:2e953bbaf3a5 250
okini3939 0:2e953bbaf3a5 251 /**
okini3939 0:2e953bbaf3a5 252 * Erase the entire chip memory. Sectors proteced or locked down will
okini3939 0:2e953bbaf3a5 253 * not be erased.
okini3939 0:2e953bbaf3a5 254 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 255 **/
okini3939 0:2e953bbaf3a5 256 void ChipErase();
okini3939 0:2e953bbaf3a5 257
okini3939 0:2e953bbaf3a5 258 /**
okini3939 0:2e953bbaf3a5 259 * This a combination of Buffer Write and Buffer to Page with
okini3939 0:2e953bbaf3a5 260 * Built-in Erase.
okini3939 0:2e953bbaf3a5 261 * @note You must call EndAndWait in order to start transfering data from buffer to page
okini3939 0:2e953bbaf3a5 262 * @param page Page where the content of the buffer will transfered
okini3939 0:2e953bbaf3a5 263 * @param offset Starting byte address within the buffer
okini3939 0:2e953bbaf3a5 264 * @param bufferNum Buffer to use (1 or 2)
okini3939 0:2e953bbaf3a5 265 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 266 **/
okini3939 0:2e953bbaf3a5 267 void BeginPageWriteThroughBuffer(uint16_t page, uint16_t offset, uint8_t bufferNum);
okini3939 0:2e953bbaf3a5 268
okini3939 0:2e953bbaf3a5 269 /**
okini3939 0:2e953bbaf3a5 270 * Perform a low-to-high transition on the CS pin and then poll
okini3939 0:2e953bbaf3a5 271 * the status register to check if the dataflash is busy.
okini3939 0:2e953bbaf3a5 272 **/
okini3939 0:2e953bbaf3a5 273 void EndAndWait();
okini3939 0:2e953bbaf3a5 274
okini3939 0:2e953bbaf3a5 275 /**
okini3939 0:2e953bbaf3a5 276 * Compare a page of data in main memory to the data in buffer 1 or 2.
okini3939 0:2e953bbaf3a5 277 * @param page Page to test
okini3939 0:2e953bbaf3a5 278 * @param bufferNum Buffer number
okini3939 0:2e953bbaf3a5 279 * @return
okini3939 0:2e953bbaf3a5 280 * - 1 if the page and the buffer contains the same data
okini3939 0:2e953bbaf3a5 281 * - 0 else
okini3939 0:2e953bbaf3a5 282 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 283 **/
okini3939 0:2e953bbaf3a5 284 int8_t ComparePageToBuffer(uint16_t page, uint8_t bufferNum);
okini3939 0:2e953bbaf3a5 285
okini3939 0:2e953bbaf3a5 286 /**
okini3939 0:2e953bbaf3a5 287 * Put the device into the lowest power consumption mode.
okini3939 0:2e953bbaf3a5 288 * Once the device has entered the Deep Power-down mode, all
okini3939 0:2e953bbaf3a5 289 * instructions are ignored except the Resume from Deep
okini3939 0:2e953bbaf3a5 290 * Power-down command.
okini3939 0:2e953bbaf3a5 291 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 292 **/
okini3939 0:2e953bbaf3a5 293 void DeepPowerDown();
okini3939 0:2e953bbaf3a5 294
okini3939 0:2e953bbaf3a5 295 /**
okini3939 0:2e953bbaf3a5 296 * Takes the device out of Deep Power-down mode.
okini3939 0:2e953bbaf3a5 297 * @warning UNTESTED
okini3939 0:2e953bbaf3a5 298 **/
okini3939 0:2e953bbaf3a5 299 void ResumeFromDeepPowerDown();
okini3939 0:2e953bbaf3a5 300
okini3939 0:2e953bbaf3a5 301 private:
okini3939 0:2e953bbaf3a5 302 /* Nothing atm but who knows... */
okini3939 0:2e953bbaf3a5 303
k4zuki 2:111e8cf6f263 304 SWSPI _spi;
okini3939 0:2e953bbaf3a5 305 DigitalOut _cs;
okini3939 0:2e953bbaf3a5 306 };
okini3939 0:2e953bbaf3a5 307
okini3939 0:2e953bbaf3a5 308 /**
okini3939 0:2e953bbaf3a5 309 * @}
okini3939 0:2e953bbaf3a5 310 **/
okini3939 0:2e953bbaf3a5 311
okini3939 0:2e953bbaf3a5 312 #endif /* AT45DB161D_H */