Nurbol Nurdaulet / MCP23017

Dependents:   state_machine_modes_1_12_11 state_machine_modes_1_12_11_11h

Committer:
Nurbol
Date:
Wed Nov 09 17:09:31 2011 +0000
Revision:
0:69c047b34ca6

        

Who changed what in which revision?

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