MAX14661 Serial Controlled 16:2 Multiplexer

Dependents:   MBD2PMD_WebServer ARD2PMD_WebServer MAX14661_DEMO MAX3232_DEMO

MAX14661.h

Committer:
gsteiert
Date:
2014-04-19
Revision:
2:c3525ee2d636
Parent:
1:4b0d22958890

File content as of revision 2:c3525ee2d636:

/* MAX14661 Driver Library
 *
 */

#ifndef MAX14661_H
#define MAX14661_H

#include "mbed.h"

/** MAX14661 Library, Provides utilities for configuring the MAX14661 over I2C
 *
 * Example:
 * @code
 * // Enable only switch B3 and read back switch state.
 *
 * #include "MAX14661.h"
 *
 * MAX14661 mux(p28, p27);
 *
 * int main() {
 *     mux.setAB(0x0000, MAX14661::SW03);
 *     printf("mux = 0x%08X\n", mux.read());
 *     mux.clearAll();
 *     printf("mux = 0x%08X\n", mux.read());
 * }
 * @endcode
 */
class MAX14661
{
public:

    /** Create a MAX14661 interface
     *
     * @param sda I2C data line pin
     * @param scl I2C clock line pin
     * @param addr MAX14661 I2C address
     */
    MAX14661(PinName sda, PinName scl, int addr = 0x98);

    ~MAX14661();

    /** Name the register addresses
    */
    enum MAX14661regs {
        REG_DIR0 = 0x00,  /**< 8A-1A Direct Access */
        REG_DIR1,         /**< 16A-9A Direct Access */
        REG_DIR2,         /**< 8B-1B Direct Access */
        REG_DIR3,         /**< 16B-9B Direct Access */
        REG_SHDW0 = 0x10, /**< 8A-1A Shadow */
        REG_SHDW1,        /**< 16A-9A Shadow */
        REG_SHDW2,        /**< 8B-1B Shadow */
        REG_SHSW3,        /**< 16B-9B Shadow */
        REG_CMD_A,        /**< Command A */
        REG_CMD_B         /**< Command A */
    };

    /** Name the command codes
    */
    enum MAX14661cmds {
        CMD_EN01 = 0x00,  /**< Enable switch 1 */
        CMD_EN02,         /**< Enable switch 2 */
        CMD_EN03,         /**< Enable switch 3 */
        CMD_EN04,         /**< Enable switch 4 */
        CMD_EN05,         /**< Enable switch 5 */
        CMD_EN06,         /**< Enable switch 6 */
        CMD_EN07,         /**< Enable switch 7 */
        CMD_EN08,         /**< Enable switch 8 */
        CMD_EN09,         /**< Enable switch 9 */
        CMD_EN10,         /**< Enable switch 10 */
        CMD_EN11,         /**< Enable switch 11 */
        CMD_EN12,         /**< Enable switch 12 */
        CMD_EN13,         /**< Enable switch 13 */
        CMD_EN14,         /**< Enable switch 14 */
        CMD_EN15,         /**< Enable switch 15 */
        CMD_EN16,         /**< Enable switch 16 */
        CMD_DIS,          /**< Disable switches  */
        CMD_COPY,         /**< Copy shadow registers to switches */
        CMD_NOOP = 0x1F   /**< Keep current state, no changes */
    };

    /** Name the switch bits
    */
    enum MAX14661sws {
        SW01 = (1 << 0),  /**< Bit mask for switch 1 */
        SW02 = (1 << 1),  /**< Bit mask for switch 2 */
        SW03 = (1 << 2),  /**< Bit mask for switch 3 */
        SW04 = (1 << 3),  /**< Bit mask for switch 4 */
        SW05 = (1 << 4),  /**< Bit mask for switch 5 */
        SW06 = (1 << 5),  /**< Bit mask for switch 6 */
        SW07 = (1 << 6),  /**< Bit mask for switch 7 */
        SW08 = (1 << 7),  /**< Bit mask for switch 8 */
        SW09 = (1 << 8),  /**< Bit mask for switch 9 */
        SW10 = (1 << 9),  /**< Bit mask for switch 10 */
        SW11 = (1 << 10), /**< Bit mask for switch 11 */
        SW12 = (1 << 11), /**< Bit mask for switch 12 */
        SW13 = (1 << 12), /**< Bit mask for switch 13 */
        SW14 = (1 << 13), /**< Bit mask for switch 14 */
        SW15 = (1 << 14), /**< Bit mask for switch 15 */
        SW16 = (1 << 15)  /**< Bit mask for switch 16 */
    };

    /** Clears all bits to opens all 32 switches
     */
    void clearAll();

    /** Set all 32 switches simultaneously
     *
     *  @param swA the desired state of switches [A16 - A01]
     *  @param swB the desired state of switches [B16 - B01]
     */
    void setAB(int swA, int swB);

    /** Read the status of all 32 switches concatenated into a single int
     *
     *  @returns
     *    the switch states [B16-B01,A16-A1]
     */
    int read();

private:
    I2C _i2c;
    int _addr;
};

#endif