Committer:
GobertPierre
Date:
Fri Apr 13 17:44:17 2012 +0000
Revision:
0:d76c38ee24ab

        

Who changed what in which revision?

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