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

Revision:
0:625ac56d810e
Child:
1:56e01e806364
diff -r 000000000000 -r 625ac56d810e 23LCxx_SPI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/23LCxx_SPI.cpp	Thu Nov 26 16:24:04 2015 +0000
@@ -0,0 +1,109 @@
+
+#include <mbed.h>
+#include "23LCxx_SPI.h"
+
+/** SPI COMMAND (Microchip 23LC1024, 23K256 SPI SRAM) */
+enum Microchip23LC1024Commnd {
+    READ  = 0x03u,
+    WRITE = 0x02u,
+    EDIO  = 0x3bu,
+    EQIO  = 0x38u,
+    RSTIO = 0xffu,
+    RDMR  = 0x05u,
+    WRMR  = 0x01u,
+};
+
+Microchip23LCxx::Microchip23LCxx(PinName mosi, PinName miso, PinName sck, PinName cs, uint32_t hz) : _spi(mosi, miso, sck), _cs(cs) {
+    _spi.format(8, 0);   // 8bit, mode=0
+    _spi.frequency(hz);    // max 20MHz (20*1000*1000) in 23LC1024.
+    _cs = 1;
+}
+
+uint8_t
+Microchip23LCxx::read_mode_register() {
+    _cs = 0;
+    _spi.write(RDMR);
+    const uint8_t value = _spi.write(0x00);
+    _cs = 1;
+    
+    return value;
+}
+
+void
+Microchip23LCxx::write_mode_register(const uint8_t value) {
+    _cs = 0;
+    _spi.write(WRMR);
+    _spi.write(value);
+    _cs = 1;
+}
+
+uint8_t
+Microchip23LCxx::change_mode(const uint8_t next_mode) {
+    const uint8_t previous_register = read_mode_register();
+    const uint8_t previous_mode = previous_register & MODE_MASK;
+    if (next_mode != previous_mode) {
+        const uint8_t next_register = (previous_register & ~MODE_MASK) | uint8_t(next_mode);
+        write_mode_register(next_register);
+    }
+    return previous_mode;
+}
+
+void
+Microchip23LCxx::_set_address(const uint32_t address) {
+    const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
+    const uint8_t address_mid  = (address >> (8 * 1)) & 0xFFu;
+    const uint8_t address_low  = (address >> (8 * 0)) & 0xFFu;
+    _spi.write(address_high);
+    _spi.write(address_mid);
+    _spi.write(address_low);
+}
+
+uint8_t
+Microchip23LCxx::read_byte(const uint32_t address) {
+    _cs = 0;
+    _spi.write(READ);
+    _set_address(address);
+    const uint8_t data = _spi.write(0);
+    _cs = 1;
+
+    return data;
+}
+
+void
+Microchip23LCxx::write_byte(const uint32_t address, const uint8_t data) {
+    _cs = 0;
+    _spi.write(WRITE);
+    _set_address(address);
+    _spi.write(data);
+    _cs = 1;
+}
+
+/**
+ * multi-byte read
+ * @pre sequential mode or page mode is required.
+ */
+void
+Microchip23LCxx::read_bytes(const uint32_t address, uint8_t __restrict data[], const uint32_t size) {
+    _cs = 0;
+    _spi.write(READ);
+    _set_address(address);
+    for (uint32_t i = 0; i < size; ++i) {
+        data[i] = _spi.write(0x00u);
+    }
+    _cs = 1;
+}
+
+/**
+ * multi-byte write
+ * @pre sequential mode or page mode is required.
+ */
+void
+Microchip23LCxx::write_bytes(const uint32_t address, const uint8_t __restrict data[], const uint32_t size) {
+    _cs = 0;
+    _spi.write(WRITE);
+    _set_address(address);
+    for (uint32_t i = 0; i < size; ++i) {
+        _spi.write(data[i]);
+    }
+    _cs = 1;
+}