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

23LCxx_SPI.h

Committer:
discypus
Date:
2015-11-26
Revision:
0:625ac56d810e
Child:
1:56e01e806364

File content as of revision 0:625ac56d810e:

#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