Microchip SPI SRAM (23LC1024, 23LC512) access library.

Revision:
0:625ac56d810e
Child:
1:56e01e806364
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/23LCxx_SPI.h	Thu Nov 26 16:24:04 2015 +0000
@@ -0,0 +1,104 @@
+#ifndef MICROCHIP_23LCXXX_SPI_H
+#define MICROCHIP_23LCXXX_SPI_H
+
+#include <mbed.h>
+
+/**
+ * Microchip SPI SRAM access library for 23LC1024, 23K256
+ *
+ * @code
+ * #include <mbed.h>
+ * #include "23LCxx_SPI.h"
+ * 
+ * Microchip23LCxx sram(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20 * 1000 * 1000);
+ * 
+ * uint8_t buf[256] = {};
+ * 
+ * void main() {
+ *     const uint32_t address = 0x2000;
+ *     const uint32_t size = 256;
+ * 
+ *     sram.change_mode(Microchip23LCxx::SEQUENTIAL);
+ *     
+ *     // write
+ *     for (uint32_t i = 0; i < size; ++i) {
+ *         buf[i] = i;
+ *     }
+ *     sram.write_bytes(address, buf, size);
+ * 
+ *     // read
+ *     for (uint32_t i = 0; i < size; ++i) {
+ *         buf[i] = 0;
+ *     }
+ *     sram.read_bytes(address, buf, size);
+ * }
+ * @endcode
+ */
+class Microchip23LCxx {
+public:
+    enum Microchip23LC1024Mode {
+        MODE_MASK  = 0xc0u,
+        BYTE       = 0x00u,
+        SEQUENTIAL = 0x40u, // default operation
+        PAGE       = 0x80u,
+        RESERVED   = 0xc0u,
+    };
+
+    /**
+     * Constructor.
+     */
+    Microchip23LCxx(PinName mosi, PinName miso, PinName sck, PinName cs, uint32_t hz);
+
+    /**
+     * read from mode register.
+     * @return register value
+     */
+    uint8_t read_mode_register();
+
+    /**
+     * write to mode register.
+     * @param[in] mode
+     */
+    void write_mode_register(const uint8_t value);
+
+    /**
+     * change mode bits.
+     * @param[in] mode mode
+     * @return mode before change
+     * @invariant other bits in register.
+     */
+    uint8_t change_mode(const uint8_t next_mode);
+
+    /**
+     * 1byte read
+     * @param[in] address adress in 24bit
+     * @return read data
+     */
+    uint8_t read_byte(const uint32_t address);
+
+    /**
+     * 1byte write
+     * @param[in] address address in 24bit
+     * @param[in] write data
+     */
+    void write_byte(const uint32_t address, const uint8_t data);
+
+    /**
+     * multi-byte read
+     * @pre sequential mode or page mode is required.
+     */
+    void read_bytes(const uint32_t address, uint8_t __restrict data[], const uint32_t size);
+
+    /**
+     * multi-byte write
+     * @pre sequential mode or page mode is required.
+     */
+    void write_bytes(const uint32_t address, const uint8_t __restrict data[], const uint32_t size);
+
+private:
+    SPI _spi;
+    DigitalOut _cs;
+    void _set_address(const uint32_t address);
+};
+
+#endif