Microchip SPI SRAM (23LC1024, 23LC512) access library.
Diff: 23LCxx_SPI.h
- 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