Microchip SPI SRAM (23LC1024, 23LC512) access library.
Diff: 23LCxx_SPI.cpp
- Revision:
- 0:625ac56d810e
- Child:
- 1:56e01e806364
--- /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; +}