Microchip SPI SRAM (23LC1024, 23LC512) access library.
23LCxx_SPI.h
- Committer:
- discypus
- Date:
- 2015-11-29
- Revision:
- 2:52d3272b886c
- Parent:
- 1:56e01e806364
File content as of revision 2:52d3272b886c:
#ifndef MICROCHIP_23LCXXX_SPI_H #define MICROCHIP_23LCXXX_SPI_H #include <mbed.h> /** Microchip SPI SRAM access library for 23LC1024, 23LC512 * * Example: * @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: /** SPI COMMAND for Microchip 23LC1024, 23LC512 */ enum Microchip23LCxxCommnd { READ = 0x03u, ///< Read data from memory array beginning at selected address WRITE = 0x02u, ///< Write data to memory array beginning at selected address EDIO = 0x3bu, ///< Enter Dual I/O access (enter SDI bus mode) EQIO = 0x38u, ///< Enter Quad I/O access (enter QDI bus mode) RSTIO = 0xffu, ///< Reset Dual and Quad I/O access (revert to SPI bus mode) RDMR = 0x05u, ///< Read Mode Register WRMR = 0x01u, ///< Write Mode Register }; /** Access mode for Microchip 23LC1024, 23LC512 */ enum Microchip23LCxxMode { MODE_MASK = 0xc0u, ///< mode bits [7:6] in mode register BYTE = 0x00u, ///< 00: Byte mode SEQUENTIAL = 0x40u, ///< 01: Sequential mode (default) PAGE = 0x80u, ///< 10: Page mode RESERVED = 0xc0u, ///< 11: Reserved }; /** Constructor. * * @param[in] mosi SPI MOSI pin name * @param[in] miso SPI MISO pin name * @param[in] sck SPI SCK pin name * @param[in] cs SPI CS pin name * @param[in] hz SPI Frequency */ Microchip23LCxx(const PinName mosi, const PinName miso, const PinName sck, const PinName cs, const 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