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 jim herd

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?

UserRevisionLine numberNew 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