Simple MCP23017 I2C 16bit IO expander IC

Committer:
hsgw
Date:
Mon Jun 02 05:38:36 2014 +0000
Revision:
0:6dd30d790eff
1st commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hsgw 0:6dd30d790eff 1 /* MCP23017 Library for mbed
hsgw 0:6dd30d790eff 2 * Copyright (c) 2014, Takuya Urakawa
hsgw 0:6dd30d790eff 3 *
hsgw 0:6dd30d790eff 4 * This library is released under the MIT License
hsgw 0:6dd30d790eff 5 * See http://opensource.org/licenses/mit-license.php
hsgw 0:6dd30d790eff 6 */
hsgw 0:6dd30d790eff 7
hsgw 0:6dd30d790eff 8 #ifndef _MCP23017_H_
hsgw 0:6dd30d790eff 9 #define _MCP23017_H_
hsgw 0:6dd30d790eff 10
hsgw 0:6dd30d790eff 11 #include "mbed.h"
hsgw 0:6dd30d790eff 12
hsgw 0:6dd30d790eff 13 /** \def usefull defines */
hsgw 0:6dd30d790eff 14 #define MCP23017_DEFAULT_ADDR 0x40
hsgw 0:6dd30d790eff 15 #define MCP23017_PORTA 0x00
hsgw 0:6dd30d790eff 16 #define MCP23017_PORTB 0x01
hsgw 0:6dd30d790eff 17
hsgw 0:6dd30d790eff 18 namespace MCP23017 {
hsgw 0:6dd30d790eff 19
hsgw 0:6dd30d790eff 20 /** MCP23017 class
hsgw 0:6dd30d790eff 21 *
hsgw 0:6dd30d790eff 22 * Allow access MCP23017 I2C 16bit io expander IC
hsgw 0:6dd30d790eff 23 * But this library can not controll interrupt functions
hsgw 0:6dd30d790eff 24 *
hsgw 0:6dd30d790eff 25 * Example:
hsgw 0:6dd30d790eff 26 * @code
hsgw 0:6dd30d790eff 27 * #include "mbed.h"
hsgw 0:6dd30d790eff 28 * #include "MCP23017.h"
hsgw 0:6dd30d790eff 29 *
hsgw 0:6dd30d790eff 30 * I2C i2c(dp5, dp27); // LPC1114
hsgw 0:6dd30d790eff 31 * MCP23017::MCP23017 io(&i2c,MCP23017_DEFAULT_ADDR);
hsgw 0:6dd30d790eff 32 *
hsgw 0:6dd30d790eff 33 * int main(void)
hsgw 0:6dd30d790eff 34 * {
hsgw 0:6dd30d790eff 35 * i2c.frequency(400000);
hsgw 0:6dd30d790eff 36 *
hsgw 0:6dd30d790eff 37 * // software reset
hsgw 0:6dd30d790eff 38 * io.init();
hsgw 0:6dd30d790eff 39 *
hsgw 0:6dd30d790eff 40 * io.setDirrection(MCP23017_PORTA, 0xFF); // set all of the PORTA pins to input
hsgw 0:6dd30d790eff 41 * io.setDirrection(MCP23017_PORTB, 0x00); // set all of the PORTB pins to output
hsgw 0:6dd30d790eff 42 * io.setPullUp(MCP23017_PORTA, 0xFF); // activate all of the PORTA pin pull-ups
hsgw 0:6dd30d790eff 43 * io.setInputPolarity(MCP23017_PORTA, 0xFF); // invert all of the PORTA pins input polarity
hsgw 0:6dd30d790eff 44 *
hsgw 0:6dd30d790eff 45 * while(true){
hsgw 0:6dd30d790eff 46 * // write PORTA to PORTB
hsgw 0:6dd30d790eff 47 * io.write(1,io.read(0));
hsgw 0:6dd30d790eff 48 * }
hsgw 0:6dd30d790eff 49 *
hsgw 0:6dd30d790eff 50 * return 0;
hsgw 0:6dd30d790eff 51 * }
hsgw 0:6dd30d790eff 52 * @endcode
hsgw 0:6dd30d790eff 53 */
hsgw 0:6dd30d790eff 54 class MCP23017{
hsgw 0:6dd30d790eff 55 public:
hsgw 0:6dd30d790eff 56
hsgw 0:6dd30d790eff 57 /** Constructor
hsgw 0:6dd30d790eff 58 *
hsgw 0:6dd30d790eff 59 * @param _i2c pointer to I2C class
hsgw 0:6dd30d790eff 60 * @param _addr i2c device address
hsgw 0:6dd30d790eff 61 */
hsgw 0:6dd30d790eff 62 MCP23017(I2C &_i2c, char _addr);
hsgw 0:6dd30d790eff 63
hsgw 0:6dd30d790eff 64 /** Software Reset
hsgw 0:6dd30d790eff 65 */
hsgw 0:6dd30d790eff 66 void init(void);
hsgw 0:6dd30d790eff 67
hsgw 0:6dd30d790eff 68 /** Configure MCP23017
hsgw 0:6dd30d790eff 69 * Write IOCON register
hsgw 0:6dd30d790eff 70 * See MCP23017 datasheet p18
hsgw 0:6dd30d790eff 71 * http://ww1.microchip.com/downloads/jp/DeviceDoc/21952b.pdf
hsgw 0:6dd30d790eff 72 *
hsgw 0:6dd30d790eff 73 * @attention BANK bit must set 0
hsgw 0:6dd30d790eff 74 *
hsgw 0:6dd30d790eff 75 * @param _value write byte
hsgw 0:6dd30d790eff 76 */
hsgw 0:6dd30d790eff 77 void setConfig(char _value);
hsgw 0:6dd30d790eff 78
hsgw 0:6dd30d790eff 79 /** Set I/O dirrection
hsgw 0:6dd30d790eff 80 *
hsgw 0:6dd30d790eff 81 * @param _port port(MCP23017_PORTA or MCP23017_PORTB)
hsgw 0:6dd30d790eff 82 * @param _value write byte(0=OUTPUT, 1=INPUT)
hsgw 0:6dd30d790eff 83 */
hsgw 0:6dd30d790eff 84 void setDirrection(char _port, char _value);
hsgw 0:6dd30d790eff 85
hsgw 0:6dd30d790eff 86 /** Set pullup
hsgw 0:6dd30d790eff 87 *
hsgw 0:6dd30d790eff 88 * @param _port port (MCP23017_PORTA or MCP23017_PORTB)
hsgw 0:6dd30d790eff 89 * @param _value write byte (0=Disable, 1=Enable)
hsgw 0:6dd30d790eff 90 */
hsgw 0:6dd30d790eff 91 void setPullUp(char _port, char _value);
hsgw 0:6dd30d790eff 92
hsgw 0:6dd30d790eff 93 /** Set Input Polarity
hsgw 0:6dd30d790eff 94 *
hsgw 0:6dd30d790eff 95 * @param _port port(MCP23017_PORTA or MCP23017_PORTB)
hsgw 0:6dd30d790eff 96 * @param _value write byte (0=normal, 1=inverted)
hsgw 0:6dd30d790eff 97 */
hsgw 0:6dd30d790eff 98 void setInputPolarity(char _port, char _value);
hsgw 0:6dd30d790eff 99
hsgw 0:6dd30d790eff 100 /** Write GPIO
hsgw 0:6dd30d790eff 101 *
hsgw 0:6dd30d790eff 102 * @param _port port(MCP23017_PORTA or MCP23017_PORTB)
hsgw 0:6dd30d790eff 103 * @param _value write byte
hsgw 0:6dd30d790eff 104 */
hsgw 0:6dd30d790eff 105 void write(char _port, char _value);
hsgw 0:6dd30d790eff 106
hsgw 0:6dd30d790eff 107 /** Read GPIO
hsgw 0:6dd30d790eff 108 *
hsgw 0:6dd30d790eff 109 * @param _port port(MCP23017_PORTA or MCP23017_PORTB)
hsgw 0:6dd30d790eff 110 * @return byte
hsgw 0:6dd30d790eff 111 */
hsgw 0:6dd30d790eff 112 char read(char _port);
hsgw 0:6dd30d790eff 113
hsgw 0:6dd30d790eff 114
hsgw 0:6dd30d790eff 115 // void setInterruptConfig(char _port, char _intcon, char _defval);
hsgw 0:6dd30d790eff 116 // void interrupt(char _port, char _value);
hsgw 0:6dd30d790eff 117 // char readIntcap(char _port);
hsgw 0:6dd30d790eff 118
hsgw 0:6dd30d790eff 119
hsgw 0:6dd30d790eff 120 private:
hsgw 0:6dd30d790eff 121 I2C &mI2c;
hsgw 0:6dd30d790eff 122 char mWriteAddr;
hsgw 0:6dd30d790eff 123 char mReadAddr;
hsgw 0:6dd30d790eff 124
hsgw 0:6dd30d790eff 125
hsgw 0:6dd30d790eff 126 inline void i2cSend(char _command, char _data1, char _data2){
hsgw 0:6dd30d790eff 127 char commands[3];
hsgw 0:6dd30d790eff 128 commands[0] = _command;
hsgw 0:6dd30d790eff 129 commands[1] = _data1;
hsgw 0:6dd30d790eff 130 commands[2] = _data2;
hsgw 0:6dd30d790eff 131
hsgw 0:6dd30d790eff 132 mI2c.write(mWriteAddr, commands, 3);
hsgw 0:6dd30d790eff 133 }
hsgw 0:6dd30d790eff 134
hsgw 0:6dd30d790eff 135 inline void i2cSend(char _command, char _data1){
hsgw 0:6dd30d790eff 136 char commands[2];
hsgw 0:6dd30d790eff 137 commands[0] = _command;
hsgw 0:6dd30d790eff 138 commands[1] = _data1;
hsgw 0:6dd30d790eff 139
hsgw 0:6dd30d790eff 140 mI2c.write(mWriteAddr, commands, 2);
hsgw 0:6dd30d790eff 141 }
hsgw 0:6dd30d790eff 142
hsgw 0:6dd30d790eff 143 inline char i2cRead(char _command){
hsgw 0:6dd30d790eff 144 char commands[2];
hsgw 0:6dd30d790eff 145 commands[0] = _command;
hsgw 0:6dd30d790eff 146 mI2c.write(mWriteAddr, commands, 1);
hsgw 0:6dd30d790eff 147 //return (char)mI2c->read(0);
hsgw 0:6dd30d790eff 148 mI2c.read(mReadAddr,commands,1);
hsgw 0:6dd30d790eff 149 return commands[0];
hsgw 0:6dd30d790eff 150 }
hsgw 0:6dd30d790eff 151
hsgw 0:6dd30d790eff 152
hsgw 0:6dd30d790eff 153 // registors
hsgw 0:6dd30d790eff 154 enum MCP23017_REG {
hsgw 0:6dd30d790eff 155 // IO Dirrection
hsgw 0:6dd30d790eff 156 REG_IODIR = 0x00,
hsgw 0:6dd30d790eff 157
hsgw 0:6dd30d790eff 158 // Input polarity
hsgw 0:6dd30d790eff 159 REG_IPOL = 0x02,
hsgw 0:6dd30d790eff 160
hsgw 0:6dd30d790eff 161 // Interrupt-On-Change enable
hsgw 0:6dd30d790eff 162 REG_GPINTEN = 0x04,
hsgw 0:6dd30d790eff 163
hsgw 0:6dd30d790eff 164 // Default intterupt comparison value
hsgw 0:6dd30d790eff 165 // Refer to INTCON
hsgw 0:6dd30d790eff 166 REG_DEFVAL = 0x06,
hsgw 0:6dd30d790eff 167
hsgw 0:6dd30d790eff 168 // Intterupt compare value
hsgw 0:6dd30d790eff 169 // 1 = compare against DEFVAL value
hsgw 0:6dd30d790eff 170 // 0 = compare against the previous value
hsgw 0:6dd30d790eff 171 REG_INTCON = 0x08,
hsgw 0:6dd30d790eff 172
hsgw 0:6dd30d790eff 173 // IC setting
hsgw 0:6dd30d790eff 174 // bank/mirror/seqop/disslw/haen/odr/intpol/notimp
hsgw 0:6dd30d790eff 175 // must be set bank = 0 for using this library
hsgw 0:6dd30d790eff 176 // See MCP23017 datasheet
hsgw 0:6dd30d790eff 177 REG_IOCON = 0x0A,
hsgw 0:6dd30d790eff 178
hsgw 0:6dd30d790eff 179 // Pullup
hsgw 0:6dd30d790eff 180 REG_GPPU = 0x0C,
hsgw 0:6dd30d790eff 181
hsgw 0:6dd30d790eff 182 // Interrupt Flag
hsgw 0:6dd30d790eff 183 // 1 = pin caused interrupt
hsgw 0:6dd30d790eff 184 // 0 = no interrupt
hsgw 0:6dd30d790eff 185 // Read-Only
hsgw 0:6dd30d790eff 186 REG_INTF = 0x0E,
hsgw 0:6dd30d790eff 187
hsgw 0:6dd30d790eff 188 // Interrupt capture
hsgw 0:6dd30d790eff 189 // value of GPIO at time of last interrupt
hsgw 0:6dd30d790eff 190 // Read-Only
hsgw 0:6dd30d790eff 191 REG_INTCAP = 0x10,
hsgw 0:6dd30d790eff 192
hsgw 0:6dd30d790eff 193 // GPIO
hsgw 0:6dd30d790eff 194 REG_GPIO = 0x12,
hsgw 0:6dd30d790eff 195
hsgw 0:6dd30d790eff 196 // Output Latch
hsgw 0:6dd30d790eff 197 REG_OLAT = 0x14
hsgw 0:6dd30d790eff 198 };
hsgw 0:6dd30d790eff 199
hsgw 0:6dd30d790eff 200 }; // end of class
hsgw 0:6dd30d790eff 201 }; // end of namespace
hsgw 0:6dd30d790eff 202
hsgw 0:6dd30d790eff 203 #endif
hsgw 0:6dd30d790eff 204