Knud Dalgaard / 310-TMC3-TestHW

Dependencies:   mbed

Committer:
knuderich
Date:
Fri May 09 11:30:55 2014 +0000
Revision:
0:c92ca0229c9a
P029 P030 gpio

Who changed what in which revision?

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