Simple MCP23017 I2C 16bit IO expander IC
MCP23017.h@0:6dd30d790eff, 2014-06-02 (annotated)
- Committer:
- hsgw
- Date:
- Mon Jun 02 05:38:36 2014 +0000
- Revision:
- 0:6dd30d790eff
1st commit
Who changed what in which revision?
User | Revision | Line number | New 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 |