Basic library of routines to interface to a Microchip MCP23017 16-bit I/O expander using an I2C interface.
Dependents: AdaFruit_RGBLCD SX1276_GPS
Fork of MCP23017 by
MCP23017.h@3:f00ee94327c6, 2010-11-28 (annotated)
- Committer:
- jimherd
- Date:
- Sun Nov 28 21:21:17 2010 +0000
- Revision:
- 3:f00ee94327c6
- Parent:
- 1:d54d7002bae2
- Child:
- 4:32fd6ee97dff
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jimherd | 0:a6a5d942b58f | 1 | /* MCP23017 library for Arduino |
jimherd | 0:a6a5d942b58f | 2 | Copyright (C) 2009 David Pye <davidmpye@gmail.com |
jimherd | 0:a6a5d942b58f | 3 | |
jimherd | 0:a6a5d942b58f | 4 | This program is free software: you can redistribute it and/or modify |
jimherd | 0:a6a5d942b58f | 5 | it under the terms of the GNU General Public License as published by |
jimherd | 0:a6a5d942b58f | 6 | the Free Software Foundation, either version 3 of the License, or |
jimherd | 0:a6a5d942b58f | 7 | (at your option) any later version. |
jimherd | 0:a6a5d942b58f | 8 | |
jimherd | 0:a6a5d942b58f | 9 | This program is distributed in the hope that it will be useful, |
jimherd | 0:a6a5d942b58f | 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
jimherd | 0:a6a5d942b58f | 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
jimherd | 0:a6a5d942b58f | 12 | GNU General Public License for more details. |
jimherd | 0:a6a5d942b58f | 13 | |
jimherd | 0:a6a5d942b58f | 14 | You should have received a copy of the GNU General Public License |
jimherd | 0:a6a5d942b58f | 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
jimherd | 0:a6a5d942b58f | 16 | */ |
jimherd | 0:a6a5d942b58f | 17 | |
jimherd | 0:a6a5d942b58f | 18 | #ifndef MBED_MCP23017_H |
jimherd | 0:a6a5d942b58f | 19 | #define MBED_MCP23017_H |
jimherd | 0:a6a5d942b58f | 20 | |
jimherd | 1:d54d7002bae2 | 21 | #include "mbed.h" |
jimherd | 1:d54d7002bae2 | 22 | |
jimherd | 1:d54d7002bae2 | 23 | /** MCP23017 class |
jimherd | 1:d54d7002bae2 | 24 | */ |
jimherd | 0:a6a5d942b58f | 25 | // |
jimherd | 0:a6a5d942b58f | 26 | // Register defines from data sheet - we set IOCON.BANK to 0 |
jimherd | 0:a6a5d942b58f | 27 | // as it is easier to manage the registers sequentially. |
jimherd | 0:a6a5d942b58f | 28 | // |
jimherd | 0:a6a5d942b58f | 29 | #define IODIR 0x00 |
jimherd | 0:a6a5d942b58f | 30 | #define IPOL 0x02 |
jimherd | 0:a6a5d942b58f | 31 | #define GPINTEN 0x04 |
jimherd | 0:a6a5d942b58f | 32 | #define DEFVAL 0x06 |
jimherd | 0:a6a5d942b58f | 33 | #define INTCON 0x08 |
jimherd | 0:a6a5d942b58f | 34 | #define IOCON 0x0A |
jimherd | 0:a6a5d942b58f | 35 | #define GPPU 0x0C |
jimherd | 0:a6a5d942b58f | 36 | #define INTF 0x0E |
jimherd | 0:a6a5d942b58f | 37 | #define INTCAP 0x10 |
jimherd | 0:a6a5d942b58f | 38 | #define GPIO 0x12 |
jimherd | 0:a6a5d942b58f | 39 | #define OLAT 0x14 |
jimherd | 0:a6a5d942b58f | 40 | |
jimherd | 0:a6a5d942b58f | 41 | #define I2C_BASE_ADDRESS 0x40 |
jimherd | 0:a6a5d942b58f | 42 | |
jimherd | 0:a6a5d942b58f | 43 | #define DIR_OUTPUT 0 |
jimherd | 0:a6a5d942b58f | 44 | #define DIR_INPUT 1 |
jimherd | 0:a6a5d942b58f | 45 | |
jimherd | 0:a6a5d942b58f | 46 | class MCP23017 { |
jimherd | 0:a6a5d942b58f | 47 | public: |
jimherd | 0:a6a5d942b58f | 48 | /** Constructor for the MCP23017 connected to specified I2C pins at a specific address |
jimherd | 0:a6a5d942b58f | 49 | * |
jimherd | 0:a6a5d942b58f | 50 | * 16-bit I/O expander with I2C interface |
jimherd | 0:a6a5d942b58f | 51 | * |
jimherd | 0:a6a5d942b58f | 52 | * @param sda I2C data pin |
jimherd | 0:a6a5d942b58f | 53 | * @param scl I2C clock pin |
jimherd | 0:a6a5d942b58f | 54 | * @param i2cAddress I2C address |
jimherd | 0:a6a5d942b58f | 55 | */ |
jimherd | 0:a6a5d942b58f | 56 | MCP23017(PinName sda, PinName scl, int i2cAddress); |
jimherd | 0:a6a5d942b58f | 57 | |
jimherd | 0:a6a5d942b58f | 58 | /** Reset MCP23017 device to its power-on state |
jimherd | 0:a6a5d942b58f | 59 | */ |
jimherd | 0:a6a5d942b58f | 60 | void reset(void); |
jimherd | 0:a6a5d942b58f | 61 | |
jimherd | 0:a6a5d942b58f | 62 | /** Write a 0/1 value to an output bit |
jimherd | 0:a6a5d942b58f | 63 | * |
jimherd | 0:a6a5d942b58f | 64 | * @param value 0 or 1 |
jimherd | 0:a6a5d942b58f | 65 | * @param bit_number bit number range 0 --> 15 |
jimherd | 0:a6a5d942b58f | 66 | */ |
jimherd | 0:a6a5d942b58f | 67 | void write_bit(int value, int bit_number); |
jimherd | 0:a6a5d942b58f | 68 | |
jimherd | 0:a6a5d942b58f | 69 | /** Write a 0/1 value to an output bit |
jimherd | 0:a6a5d942b58f | 70 | * |
jimherd | 0:a6a5d942b58f | 71 | * @param data 16-bit data value |
jimherd | 0:a6a5d942b58f | 72 | * @param mask 16-bit mask value |
jimherd | 0:a6a5d942b58f | 73 | */ |
jimherd | 0:a6a5d942b58f | 74 | void write_mask(unsigned short data, unsigned short mask); |
jimherd | 0:a6a5d942b58f | 75 | |
jimherd | 0:a6a5d942b58f | 76 | /** Read a 0/1 value from an input bit |
jimherd | 0:a6a5d942b58f | 77 | * |
jimherd | 0:a6a5d942b58f | 78 | * @param bit_number bit number range 0 --> 15 |
jimherd | 0:a6a5d942b58f | 79 | * @return 0/1 value read |
jimherd | 0:a6a5d942b58f | 80 | */ |
jimherd | 0:a6a5d942b58f | 81 | int read_bit(int bit_number); |
jimherd | 0:a6a5d942b58f | 82 | |
jimherd | 0:a6a5d942b58f | 83 | /** Read a 0/1 value from an input bit |
jimherd | 0:a6a5d942b58f | 84 | * |
jimherd | 0:a6a5d942b58f | 85 | * @param mask 16-bit mask value |
jimherd | 0:a6a5d942b58f | 86 | * @return 16-bit data with mask applied |
jimherd | 0:a6a5d942b58f | 87 | */ |
jimherd | 0:a6a5d942b58f | 88 | int read_mask(unsigned short mask); |
jimherd | 0:a6a5d942b58f | 89 | |
jimherd | 0:a6a5d942b58f | 90 | /** Configure an MCP23017 device |
jimherd | 0:a6a5d942b58f | 91 | * |
jimherd | 0:a6a5d942b58f | 92 | * @param dir_config data direction value (1 = input, 0 = output) |
jimherd | 0:a6a5d942b58f | 93 | * @param pullup_config 100k pullup value (1 = enabled, 0 = disabled) |
jimherd | 0:a6a5d942b58f | 94 | * @param polarity_config polarity value (1 = flip, 0 = normal) |
jimherd | 0:a6a5d942b58f | 95 | */ |
jimherd | 0:a6a5d942b58f | 96 | void config(unsigned short dir_config, unsigned short pullup_config, unsigned short polarity_config); |
jimherd | 0:a6a5d942b58f | 97 | |
jimherd | 0:a6a5d942b58f | 98 | |
jimherd | 0:a6a5d942b58f | 99 | /******************************************************************************* |
jimherd | 0:a6a5d942b58f | 100 | * pinmode |
jimherd | 0:a6a5d942b58f | 101 | * Set units to sequential, bank0 mode |
jimherd | 0:a6a5d942b58f | 102 | */ |
jimherd | 3:f00ee94327c6 | 103 | /** |
jimherd | 3:f00ee94327c6 | 104 | */ |
jimherd | 0:a6a5d942b58f | 105 | void pinMode(int pin, int mode); |
jimherd | 3:f00ee94327c6 | 106 | /** |
jimherd | 3:f00ee94327c6 | 107 | */ |
jimherd | 0:a6a5d942b58f | 108 | void digitalWrite(int pin, int val); |
jimherd | 3:f00ee94327c6 | 109 | /** |
jimherd | 3:f00ee94327c6 | 110 | */ |
jimherd | 0:a6a5d942b58f | 111 | int digitalRead(int pin); |
jimherd | 0:a6a5d942b58f | 112 | |
jimherd | 0:a6a5d942b58f | 113 | // These provide a more advanced mapping of the chip functionality |
jimherd | 0:a6a5d942b58f | 114 | // See the data sheet for more information on what they do |
jimherd | 0:a6a5d942b58f | 115 | |
jimherd | 0:a6a5d942b58f | 116 | //Returns a word with the current pin states (ie contents of the GPIO register) |
jimherd | 3:f00ee94327c6 | 117 | /** |
jimherd | 3:f00ee94327c6 | 118 | */ |
jimherd | 0:a6a5d942b58f | 119 | unsigned short digitalWordRead(); |
jimherd | 0:a6a5d942b58f | 120 | // Allows you to write a word to the GPIO register |
jimherd | 3:f00ee94327c6 | 121 | /** |
jimherd | 3:f00ee94327c6 | 122 | */ |
jimherd | 0:a6a5d942b58f | 123 | void digitalWordWrite(unsigned short w); |
jimherd | 0:a6a5d942b58f | 124 | // Sets up the polarity mask that the MCP23017 supports |
jimherd | 0:a6a5d942b58f | 125 | // if set to 1, it will flip the actual pin value. |
jimherd | 3:f00ee94327c6 | 126 | /** |
jimherd | 3:f00ee94327c6 | 127 | */ |
jimherd | 0:a6a5d942b58f | 128 | void inputPolarityMask(unsigned short mask); |
jimherd | 0:a6a5d942b58f | 129 | //Sets which pins are inputs or outputs (1 = input, 0 = output) NB Opposite to arduino's |
jimherd | 0:a6a5d942b58f | 130 | //definition for these |
jimherd | 3:f00ee94327c6 | 131 | /** |
jimherd | 3:f00ee94327c6 | 132 | */ |
jimherd | 0:a6a5d942b58f | 133 | void inputOutputMask(unsigned short mask); |
jimherd | 0:a6a5d942b58f | 134 | // Allows enabling of the internal 100k pullup resisters (1 = enabled, 0 = disabled) |
jimherd | 3:f00ee94327c6 | 135 | /** |
jimherd | 3:f00ee94327c6 | 136 | */ |
jimherd | 0:a6a5d942b58f | 137 | void internalPullupMask(unsigned short mask); |
jimherd | 3:f00ee94327c6 | 138 | /** |
jimherd | 3:f00ee94327c6 | 139 | */ |
jimherd | 0:a6a5d942b58f | 140 | int read(void); |
jimherd | 3:f00ee94327c6 | 141 | /** |
jimherd | 3:f00ee94327c6 | 142 | */ |
jimherd | 0:a6a5d942b58f | 143 | void write(int data); |
jimherd | 3:f00ee94327c6 | 144 | /** |
jimherd | 3:f00ee94327c6 | 145 | */ |
jimherd | 0:a6a5d942b58f | 146 | void writeRegister(int regAddress, unsigned char val); |
jimherd | 3:f00ee94327c6 | 147 | /** |
jimherd | 3:f00ee94327c6 | 148 | */ |
jimherd | 0:a6a5d942b58f | 149 | void writeRegister(int regAddress, unsigned short val); |
jimherd | 3:f00ee94327c6 | 150 | /** |
jimherd | 3:f00ee94327c6 | 151 | */ |
jimherd | 0:a6a5d942b58f | 152 | int readRegister(int regAddress); |
jimherd | 0:a6a5d942b58f | 153 | |
jimherd | 0:a6a5d942b58f | 154 | protected: |
jimherd | 0:a6a5d942b58f | 155 | I2C _i2c; |
jimherd | 0:a6a5d942b58f | 156 | int MCP23017_i2cAddress; // physical I2C address |
jimherd | 0:a6a5d942b58f | 157 | unsigned short shadow_GPIO, shadow_IODIR, shadow_GPPU, shadow_IPOL; // Cached copies of the register values |
jimherd | 0:a6a5d942b58f | 158 | |
jimherd | 0:a6a5d942b58f | 159 | }; |
jimherd | 0:a6a5d942b58f | 160 | |
jimherd | 0:a6a5d942b58f | 161 | #endif |