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.
310-TMC3-TestHW/MCP23008/MCP23008.cpp@0:c92ca0229c9a, 2014-05-09 (annotated)
- Committer:
- knuderich
- Date:
- Fri May 09 11:30:55 2014 +0000
- Revision:
- 0:c92ca0229c9a
P029 P030 gpio
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
knuderich | 0:c92ca0229c9a | 1 | /* MCP23017 library for Arduino |
knuderich | 0:c92ca0229c9a | 2 | Copyright (C) 2009 David Pye <davidmpye@gmail.com |
knuderich | 0:c92ca0229c9a | 3 | Modified for use on the MBED ARM platform |
knuderich | 0:c92ca0229c9a | 4 | |
knuderich | 0:c92ca0229c9a | 5 | This program is free software: you can redistribute it and/or modify |
knuderich | 0:c92ca0229c9a | 6 | it under the terms of the GNU General Public License as published by |
knuderich | 0:c92ca0229c9a | 7 | the Free Software Foundation, either version 3 of the License, or |
knuderich | 0:c92ca0229c9a | 8 | (at your option) any later version. |
knuderich | 0:c92ca0229c9a | 9 | |
knuderich | 0:c92ca0229c9a | 10 | This program is distributed in the hope that it will be useful, |
knuderich | 0:c92ca0229c9a | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
knuderich | 0:c92ca0229c9a | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
knuderich | 0:c92ca0229c9a | 13 | GNU General Public License for more details. |
knuderich | 0:c92ca0229c9a | 14 | |
knuderich | 0:c92ca0229c9a | 15 | You should have received a copy of the GNU General Public License |
knuderich | 0:c92ca0229c9a | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
knuderich | 0:c92ca0229c9a | 17 | */ |
knuderich | 0:c92ca0229c9a | 18 | |
knuderich | 0:c92ca0229c9a | 19 | #include "MCP23008.h" |
knuderich | 0:c92ca0229c9a | 20 | #include "mbed.h" |
knuderich | 0:c92ca0229c9a | 21 | |
knuderich | 0:c92ca0229c9a | 22 | //=============================================================================================== |
knuderich | 0:c92ca0229c9a | 23 | // Init and setup functions |
knuderich | 0:c92ca0229c9a | 24 | //=============================================================================================== |
knuderich | 0:c92ca0229c9a | 25 | |
knuderich | 0:c92ca0229c9a | 26 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 27 | * |
knuderich | 0:c92ca0229c9a | 28 | */ |
knuderich | 0:c92ca0229c9a | 29 | MCP23008::MCP23008(PinName sda, PinName scl, int i2cAddress) : _i2c(sda, scl) |
knuderich | 0:c92ca0229c9a | 30 | { |
knuderich | 0:c92ca0229c9a | 31 | MCP23008_i2cAddress = i2cAddress; |
knuderich | 0:c92ca0229c9a | 32 | reset(); // initialise chip to power-on condition |
knuderich | 0:c92ca0229c9a | 33 | } |
knuderich | 0:c92ca0229c9a | 34 | |
knuderich | 0:c92ca0229c9a | 35 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 36 | * reset |
knuderich | 0:c92ca0229c9a | 37 | * Set configuration (IOCON) and direction(IODIR) registers to initial state |
knuderich | 0:c92ca0229c9a | 38 | */ |
knuderich | 0:c92ca0229c9a | 39 | void MCP23008::reset() |
knuderich | 0:c92ca0229c9a | 40 | { |
knuderich | 0:c92ca0229c9a | 41 | // |
knuderich | 0:c92ca0229c9a | 42 | // set direction registers to inputs |
knuderich | 0:c92ca0229c9a | 43 | // |
knuderich | 0:c92ca0229c9a | 44 | writeRegister(IODIR, (unsigned char)0xFF); |
knuderich | 0:c92ca0229c9a | 45 | // |
knuderich | 0:c92ca0229c9a | 46 | // set all other registers to zero (last of 10 registers is OLAT) |
knuderich | 0:c92ca0229c9a | 47 | // |
knuderich | 0:c92ca0229c9a | 48 | for (int reg_addr = IPOL ; reg_addr <= OLAT ; reg_addr++) { |
knuderich | 0:c92ca0229c9a | 49 | writeRegister(reg_addr, (unsigned char)0x00); |
knuderich | 0:c92ca0229c9a | 50 | } |
knuderich | 0:c92ca0229c9a | 51 | |
knuderich | 0:c92ca0229c9a | 52 | // |
knuderich | 0:c92ca0229c9a | 53 | // Set the shadow registers to power-on state |
knuderich | 0:c92ca0229c9a | 54 | // |
knuderich | 0:c92ca0229c9a | 55 | shadow_IODIR = 0xFF; |
knuderich | 0:c92ca0229c9a | 56 | shadow_GPIO = 0; |
knuderich | 0:c92ca0229c9a | 57 | shadow_GPPU = 0; |
knuderich | 0:c92ca0229c9a | 58 | shadow_IPOL = 0; |
knuderich | 0:c92ca0229c9a | 59 | } |
knuderich | 0:c92ca0229c9a | 60 | |
knuderich | 0:c92ca0229c9a | 61 | |
knuderich | 0:c92ca0229c9a | 62 | |
knuderich | 0:c92ca0229c9a | 63 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 64 | * Config |
knuderich | 0:c92ca0229c9a | 65 | * set direction and pull-up registers |
knuderich | 0:c92ca0229c9a | 66 | */ |
knuderich | 0:c92ca0229c9a | 67 | void MCP23008::config(unsigned char dir_config, unsigned char pullup_config, unsigned char polarity_config) |
knuderich | 0:c92ca0229c9a | 68 | { |
knuderich | 0:c92ca0229c9a | 69 | shadow_IODIR = dir_config; |
knuderich | 0:c92ca0229c9a | 70 | writeRegister(IODIR, (unsigned char)shadow_IODIR); |
knuderich | 0:c92ca0229c9a | 71 | shadow_GPPU = pullup_config; |
knuderich | 0:c92ca0229c9a | 72 | writeRegister(GPPU, (unsigned char)shadow_GPPU); |
knuderich | 0:c92ca0229c9a | 73 | shadow_IPOL = polarity_config; |
knuderich | 0:c92ca0229c9a | 74 | writeRegister(IPOL, (unsigned char)shadow_IPOL); |
knuderich | 0:c92ca0229c9a | 75 | } |
knuderich | 0:c92ca0229c9a | 76 | |
knuderich | 0:c92ca0229c9a | 77 | |
knuderich | 0:c92ca0229c9a | 78 | |
knuderich | 0:c92ca0229c9a | 79 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 80 | * writeRegister |
knuderich | 0:c92ca0229c9a | 81 | * write a byte |
knuderich | 0:c92ca0229c9a | 82 | */ |
knuderich | 0:c92ca0229c9a | 83 | void MCP23008::writeRegister(int regAddress, unsigned char data) |
knuderich | 0:c92ca0229c9a | 84 | { |
knuderich | 0:c92ca0229c9a | 85 | char buffer[2]; |
knuderich | 0:c92ca0229c9a | 86 | |
knuderich | 0:c92ca0229c9a | 87 | buffer[0] = regAddress; |
knuderich | 0:c92ca0229c9a | 88 | buffer[1] = data; |
knuderich | 0:c92ca0229c9a | 89 | _i2c.write(MCP23008_i2cAddress, buffer, 2); |
knuderich | 0:c92ca0229c9a | 90 | } |
knuderich | 0:c92ca0229c9a | 91 | |
knuderich | 0:c92ca0229c9a | 92 | |
knuderich | 0:c92ca0229c9a | 93 | |
knuderich | 0:c92ca0229c9a | 94 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 95 | * readRegister |
knuderich | 0:c92ca0229c9a | 96 | */ |
knuderich | 0:c92ca0229c9a | 97 | unsigned char MCP23008::readRegister(int regAddress) |
knuderich | 0:c92ca0229c9a | 98 | { |
knuderich | 0:c92ca0229c9a | 99 | char buffer[1]; |
knuderich | 0:c92ca0229c9a | 100 | |
knuderich | 0:c92ca0229c9a | 101 | buffer[0] = regAddress; |
knuderich | 0:c92ca0229c9a | 102 | _i2c.write(MCP23008_i2cAddress, buffer, 1); |
knuderich | 0:c92ca0229c9a | 103 | _i2c.read(MCP23008_i2cAddress, buffer, 1); |
knuderich | 0:c92ca0229c9a | 104 | |
knuderich | 0:c92ca0229c9a | 105 | return ( (unsigned char)buffer[0] ); |
knuderich | 0:c92ca0229c9a | 106 | } |
knuderich | 0:c92ca0229c9a | 107 | |
knuderich | 0:c92ca0229c9a | 108 | |
knuderich | 0:c92ca0229c9a | 109 | //=============================================================================================== |
knuderich | 0:c92ca0229c9a | 110 | // User functions |
knuderich | 0:c92ca0229c9a | 111 | //=============================================================================================== |
knuderich | 0:c92ca0229c9a | 112 | |
knuderich | 0:c92ca0229c9a | 113 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 114 | * Write a combination of bits to the 8-bit port |
knuderich | 0:c92ca0229c9a | 115 | */ |
knuderich | 0:c92ca0229c9a | 116 | void MCP23008::write_mask(unsigned char data, unsigned char mask) |
knuderich | 0:c92ca0229c9a | 117 | { |
knuderich | 0:c92ca0229c9a | 118 | shadow_GPIO = (shadow_GPIO & ~mask) | data; |
knuderich | 0:c92ca0229c9a | 119 | writeRegister(GPIO, (unsigned char)shadow_GPIO); |
knuderich | 0:c92ca0229c9a | 120 | } |
knuderich | 0:c92ca0229c9a | 121 | |
knuderich | 0:c92ca0229c9a | 122 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 123 | * read_mask |
knuderich | 0:c92ca0229c9a | 124 | */ |
knuderich | 0:c92ca0229c9a | 125 | int MCP23008::read_mask(unsigned char mask) |
knuderich | 0:c92ca0229c9a | 126 | { |
knuderich | 0:c92ca0229c9a | 127 | shadow_GPIO = readRegister(GPIO); |
knuderich | 0:c92ca0229c9a | 128 | return (shadow_GPIO & mask); |
knuderich | 0:c92ca0229c9a | 129 | } |
knuderich | 0:c92ca0229c9a | 130 | |
knuderich | 0:c92ca0229c9a | 131 | |
knuderich | 0:c92ca0229c9a | 132 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 133 | * write_bit |
knuderich | 0:c92ca0229c9a | 134 | * Write a 1/0 to a single bit of the 16-bit port |
knuderich | 0:c92ca0229c9a | 135 | */ |
knuderich | 0:c92ca0229c9a | 136 | void MCP23008::write_bit(int value, int bit_number) { |
knuderich | 0:c92ca0229c9a | 137 | if (value == 0) { |
knuderich | 0:c92ca0229c9a | 138 | shadow_GPIO &= ~(1 << bit_number); |
knuderich | 0:c92ca0229c9a | 139 | } else { |
knuderich | 0:c92ca0229c9a | 140 | shadow_GPIO |= 1 << bit_number; |
knuderich | 0:c92ca0229c9a | 141 | } |
knuderich | 0:c92ca0229c9a | 142 | writeRegister(GPIO, (unsigned char)shadow_GPIO); |
knuderich | 0:c92ca0229c9a | 143 | } |
knuderich | 0:c92ca0229c9a | 144 | |
knuderich | 0:c92ca0229c9a | 145 | |
knuderich | 0:c92ca0229c9a | 146 | /*----------------------------------------------------------------------------- |
knuderich | 0:c92ca0229c9a | 147 | * read_bit |
knuderich | 0:c92ca0229c9a | 148 | * Read a single bit from the 16-bit port |
knuderich | 0:c92ca0229c9a | 149 | */ |
knuderich | 0:c92ca0229c9a | 150 | int MCP23008::read_bit(int bit_number) { |
knuderich | 0:c92ca0229c9a | 151 | shadow_GPIO = readRegister(GPIO); |
knuderich | 0:c92ca0229c9a | 152 | return ((shadow_GPIO >> bit_number) & 0x01); |
knuderich | 0:c92ca0229c9a | 153 | } |
knuderich | 0:c92ca0229c9a | 154 |