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