version for testing not implemented: delta loop safety, power surge, calibration mode

Dependencies:   mbed TextLCD

Committer:
KoenKahlman
Date:
Thu Jun 27 09:26:40 2019 +0000
Revision:
3:7cfbf73d6809
Parent:
0:9c82986d7cb9
ignores power surge on startup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KoenKahlman 0:9c82986d7cb9 1 /* MCP23017 - drive the Microchip MCP23017 16-bit Port Extender using I2C
KoenKahlman 0:9c82986d7cb9 2 * Copyright (c) 2010 Wim Huiskamp, Romilly Cocking (original version for SPI)
KoenKahlman 0:9c82986d7cb9 3 *
KoenKahlman 0:9c82986d7cb9 4 * Changed by Jacco van Splunter:
KoenKahlman 0:9c82986d7cb9 5 * The _read and _write functions are moved from protected -> public
KoenKahlman 0:9c82986d7cb9 6 *
KoenKahlman 0:9c82986d7cb9 7 * Released under the MIT License: http://mbed.org/license/mit
KoenKahlman 0:9c82986d7cb9 8 *
KoenKahlman 0:9c82986d7cb9 9 * version 0.2 Initial Release
KoenKahlman 0:9c82986d7cb9 10 * version 0.3 Cleaned up
KoenKahlman 0:9c82986d7cb9 11 * version 0.4 Fixed problem with _read method
KoenKahlman 0:9c82986d7cb9 12 * version 0.5 Added support for 'Banked' access to registers
KoenKahlman 0:9c82986d7cb9 13 */
KoenKahlman 0:9c82986d7cb9 14 #include "mbed.h"
KoenKahlman 0:9c82986d7cb9 15
KoenKahlman 0:9c82986d7cb9 16 #ifndef MCP23017_H
KoenKahlman 0:9c82986d7cb9 17 #define MCP23017_H
KoenKahlman 0:9c82986d7cb9 18
KoenKahlman 0:9c82986d7cb9 19 // All register addresses assume IOCON.BANK = 0 (POR default)
KoenKahlman 0:9c82986d7cb9 20 #define IODIRA 0x00
KoenKahlman 0:9c82986d7cb9 21 #define IODIRB 0x01
KoenKahlman 0:9c82986d7cb9 22 #define IPOLA 0x02
KoenKahlman 0:9c82986d7cb9 23 #define IPOLB 0x03
KoenKahlman 0:9c82986d7cb9 24 #define GPINTENA 0x04
KoenKahlman 0:9c82986d7cb9 25 #define GPINTENB 0x05
KoenKahlman 0:9c82986d7cb9 26 #define DEFVALA 0x06
KoenKahlman 0:9c82986d7cb9 27 #define DEFVALB 0x07
KoenKahlman 0:9c82986d7cb9 28 #define INTCONA 0x08
KoenKahlman 0:9c82986d7cb9 29 #define INTCONB 0x09
KoenKahlman 0:9c82986d7cb9 30 #define IOCONA 0x0A
KoenKahlman 0:9c82986d7cb9 31 #define IOCONB 0x0B
KoenKahlman 0:9c82986d7cb9 32 #define GPPUA 0x0C
KoenKahlman 0:9c82986d7cb9 33 #define GPPUB 0x0D
KoenKahlman 0:9c82986d7cb9 34 #define INTFA 0x0E
KoenKahlman 0:9c82986d7cb9 35 #define INTFB 0x0F
KoenKahlman 0:9c82986d7cb9 36 #define INTCAPA 0x10
KoenKahlman 0:9c82986d7cb9 37 #define INTCAPB 0x11
KoenKahlman 0:9c82986d7cb9 38 #define GPIOA 0x12
KoenKahlman 0:9c82986d7cb9 39 #define GPIOB 0x13
KoenKahlman 0:9c82986d7cb9 40 #define OLATA 0x14
KoenKahlman 0:9c82986d7cb9 41 #define OLATB 0x15
KoenKahlman 0:9c82986d7cb9 42
KoenKahlman 0:9c82986d7cb9 43 // The following register addresses assume IOCON.BANK = 1
KoenKahlman 0:9c82986d7cb9 44 #define IODIRA_BNK 0x00
KoenKahlman 0:9c82986d7cb9 45 #define IPOLA_BNK 0x01
KoenKahlman 0:9c82986d7cb9 46 #define GPINTENA_BNK 0x02
KoenKahlman 0:9c82986d7cb9 47 #define DEFVALA_BNK 0x03
KoenKahlman 0:9c82986d7cb9 48 #define INTCONA_BNK 0x04
KoenKahlman 0:9c82986d7cb9 49 #define IOCONA_BNK 0x05
KoenKahlman 0:9c82986d7cb9 50 #define GPPUA_BNK 0x06
KoenKahlman 0:9c82986d7cb9 51 #define INTFA_BNK 0x07
KoenKahlman 0:9c82986d7cb9 52 #define INTCAPA_BNK 0x08
KoenKahlman 0:9c82986d7cb9 53 #define GPIOA_BNK 0x09
KoenKahlman 0:9c82986d7cb9 54 #define OLATA_BNK 0x0A
KoenKahlman 0:9c82986d7cb9 55
KoenKahlman 0:9c82986d7cb9 56 #define IODIRB_BNK 0x10
KoenKahlman 0:9c82986d7cb9 57 #define IPOLB_BNK 0x11
KoenKahlman 0:9c82986d7cb9 58 #define GPINTENB_BNK 0x12
KoenKahlman 0:9c82986d7cb9 59 #define DEFVALB_BNK 0x13
KoenKahlman 0:9c82986d7cb9 60 #define INTCONB_BNK 0x14
KoenKahlman 0:9c82986d7cb9 61 #define IOCONB_BNK 0x15
KoenKahlman 0:9c82986d7cb9 62 #define GPPUB_BNK 0x16
KoenKahlman 0:9c82986d7cb9 63 #define INTFB_BNK 0x17
KoenKahlman 0:9c82986d7cb9 64 #define INTCAPB_BNK 0x18
KoenKahlman 0:9c82986d7cb9 65 #define GPIOB_BNK 0x19
KoenKahlman 0:9c82986d7cb9 66 #define OLATB_BNK 0x1A
KoenKahlman 0:9c82986d7cb9 67
KoenKahlman 0:9c82986d7cb9 68 // This array allows structured access to Port_A and Port_B registers for both bankModes
KoenKahlman 0:9c82986d7cb9 69 const int IODIR_AB[2][2] = {{IODIRA, IODIRB}, {IODIRA_BNK, IODIRB_BNK}};
KoenKahlman 0:9c82986d7cb9 70 const int IPOL_AB[2][2] = {{IPOLA, IPOLB}, {IPOLA_BNK, IPOLB_BNK}};
KoenKahlman 0:9c82986d7cb9 71 const int GPINTEN_AB[2][2] = {{GPINTENA, GPINTENB}, {GPINTENA_BNK, GPINTENB_BNK}};
KoenKahlman 0:9c82986d7cb9 72 const int DEFVAL_AB[2][2] = {{DEFVALA, DEFVALB}, {DEFVALA_BNK, DEFVALB_BNK}};
KoenKahlman 0:9c82986d7cb9 73 const int INTCON_AB[2][2] = {{INTCONA, INTCONB}, {INTCONA_BNK, INTCONB_BNK}};
KoenKahlman 0:9c82986d7cb9 74 const int IOCON_AB[2][2] = {{IOCONA, IOCONB}, {IOCONA_BNK, IOCONB_BNK}};
KoenKahlman 0:9c82986d7cb9 75 const int GPPU_AB[2][2] = {{GPPUA, GPPUB}, {GPPUA_BNK, GPPUB_BNK}};
KoenKahlman 0:9c82986d7cb9 76 const int INTF_AB[2][2] = {{INTFA, INTFB}, {INTFA_BNK, INTFB_BNK}};
KoenKahlman 0:9c82986d7cb9 77 const int INTCAP_AB[2][2] = {{INTCAPA, INTCAPB}, {INTCAPA_BNK, INTCAPB_BNK}};
KoenKahlman 0:9c82986d7cb9 78 const int GPIO_AB[2][2] = {{GPIOA, GPIOB}, {GPIOA_BNK, GPIOB_BNK}};
KoenKahlman 0:9c82986d7cb9 79 const int OLAT_AB[2][2] = {{OLATA, OLATB}, {OLATA_BNK, OLATB_BNK}};
KoenKahlman 0:9c82986d7cb9 80
KoenKahlman 0:9c82986d7cb9 81
KoenKahlman 0:9c82986d7cb9 82 // Control settings
KoenKahlman 0:9c82986d7cb9 83 #define IOCON_BANK 0x80 // Banked registers for Port A and B
KoenKahlman 0:9c82986d7cb9 84 #define IOCON_BYTE_MODE 0x20 // Disables sequential operation, Address Ptr does not increment
KoenKahlman 0:9c82986d7cb9 85 // If Disabled and Bank = 0, operations toggle between Port A and B registers
KoenKahlman 0:9c82986d7cb9 86 // If Disabled and Bank = 1, operations do not increment registeraddress
KoenKahlman 0:9c82986d7cb9 87 #define IOCON_HAEN 0x08 // Hardware address enable
KoenKahlman 0:9c82986d7cb9 88
KoenKahlman 0:9c82986d7cb9 89 #define INTERRUPT_POLARITY_BIT 0x02
KoenKahlman 0:9c82986d7cb9 90 #define INTERRUPT_MIRROR_BIT 0x40
KoenKahlman 0:9c82986d7cb9 91
KoenKahlman 0:9c82986d7cb9 92 #define PORT_DIR_OUT 0x00
KoenKahlman 0:9c82986d7cb9 93 #define PORT_DIR_IN 0xFF
KoenKahlman 0:9c82986d7cb9 94
KoenKahlman 0:9c82986d7cb9 95 enum Polarity { ACTIVE_LOW , ACTIVE_HIGH };
KoenKahlman 0:9c82986d7cb9 96 enum Port { PORT_A=0, PORT_B=1 };
KoenKahlman 0:9c82986d7cb9 97 enum Bank { NOT_BNK=0, BNK=1 };
KoenKahlman 0:9c82986d7cb9 98
KoenKahlman 0:9c82986d7cb9 99 class MCP23017 {
KoenKahlman 0:9c82986d7cb9 100 public:
KoenKahlman 0:9c82986d7cb9 101 /** Create an MCP23017 object connected to the specified I2C object and using the specified deviceAddress
KoenKahlman 0:9c82986d7cb9 102 *
KoenKahlman 0:9c82986d7cb9 103 * @param I2C &i2c the I2C port to connect to
KoenKahlman 0:9c82986d7cb9 104 * @param char deviceAddress the address of the MCP23017
KoenKahlman 0:9c82986d7cb9 105 */
KoenKahlman 0:9c82986d7cb9 106 MCP23017(I2C &i2c, char deviceAddress);
KoenKahlman 0:9c82986d7cb9 107
KoenKahlman 0:9c82986d7cb9 108 /** Set I/O direction of specified MCP23017 Port
KoenKahlman 0:9c82986d7cb9 109 *
KoenKahlman 0:9c82986d7cb9 110 * @param Port Port address (Port_A or Port_B)
KoenKahlman 0:9c82986d7cb9 111 * @param char direction pin direction (0 = output, 1 = input)
KoenKahlman 0:9c82986d7cb9 112 */
KoenKahlman 0:9c82986d7cb9 113 void direction(Port port, char direction);
KoenKahlman 0:9c82986d7cb9 114
KoenKahlman 0:9c82986d7cb9 115 /** Set Pull-Up Resistors on specified MCP23017 Port
KoenKahlman 0:9c82986d7cb9 116 *
KoenKahlman 0:9c82986d7cb9 117 * @param Port Port address (Port_A or Port_B)
KoenKahlman 0:9c82986d7cb9 118 * @param char offOrOn per pin (0 = off, 1 = on)
KoenKahlman 0:9c82986d7cb9 119 */
KoenKahlman 0:9c82986d7cb9 120 void configurePullUps(Port port, char offOrOn);
KoenKahlman 0:9c82986d7cb9 121
KoenKahlman 0:9c82986d7cb9 122 void configureBanked(Bank bankmode);
KoenKahlman 0:9c82986d7cb9 123 void interruptEnable(Port port, char interruptsEnabledMask);
KoenKahlman 0:9c82986d7cb9 124 void interruptPolarity(Polarity polarity);
KoenKahlman 0:9c82986d7cb9 125 void mirrorInterrupts(bool mirror);
KoenKahlman 0:9c82986d7cb9 126 void defaultValue(Port port, char valuesToCompare);
KoenKahlman 0:9c82986d7cb9 127 void interruptControl(Port port, char interruptControlBits);
KoenKahlman 0:9c82986d7cb9 128
KoenKahlman 0:9c82986d7cb9 129 /** Read from specified MCP23017 Port
KoenKahlman 0:9c82986d7cb9 130 *
KoenKahlman 0:9c82986d7cb9 131 * @param Port Port address (Port_A or Port_B)
KoenKahlman 0:9c82986d7cb9 132 * @returns data from Port
KoenKahlman 0:9c82986d7cb9 133 */
KoenKahlman 0:9c82986d7cb9 134 char read(Port port);
KoenKahlman 0:9c82986d7cb9 135
KoenKahlman 0:9c82986d7cb9 136 /** Write to specified MCP23017 Port
KoenKahlman 0:9c82986d7cb9 137 *
KoenKahlman 0:9c82986d7cb9 138 * @param Port Port address (Port_A or Port_B)
KoenKahlman 0:9c82986d7cb9 139 * @param char byte data to write
KoenKahlman 0:9c82986d7cb9 140 */
KoenKahlman 0:9c82986d7cb9 141 void write(Port port, char byte);
KoenKahlman 0:9c82986d7cb9 142
KoenKahlman 0:9c82986d7cb9 143 /** Write to specified MCP23017 register
KoenKahlman 0:9c82986d7cb9 144 *
KoenKahlman 0:9c82986d7cb9 145 * @param char address the internal registeraddress of the MCP23017
KoenKahlman 0:9c82986d7cb9 146 */
KoenKahlman 0:9c82986d7cb9 147 void _write(char address, char byte);
KoenKahlman 0:9c82986d7cb9 148
KoenKahlman 0:9c82986d7cb9 149 /** Read from specified MCP23017 register
KoenKahlman 0:9c82986d7cb9 150 *
KoenKahlman 0:9c82986d7cb9 151 * @param char address the internal registeraddress of the MCP23017
KoenKahlman 0:9c82986d7cb9 152 * @returns data from register
KoenKahlman 0:9c82986d7cb9 153 */
KoenKahlman 0:9c82986d7cb9 154 char _read(char address);
KoenKahlman 0:9c82986d7cb9 155
KoenKahlman 0:9c82986d7cb9 156 protected:
KoenKahlman 0:9c82986d7cb9 157 I2C &_i2c;
KoenKahlman 0:9c82986d7cb9 158 char _readOpcode;
KoenKahlman 0:9c82986d7cb9 159 char _writeOpcode;
KoenKahlman 0:9c82986d7cb9 160 Bank _bankMode;
KoenKahlman 0:9c82986d7cb9 161
KoenKahlman 0:9c82986d7cb9 162 /** Init MCP23017
KoenKahlman 0:9c82986d7cb9 163 *
KoenKahlman 0:9c82986d7cb9 164 * @param
KoenKahlman 0:9c82986d7cb9 165 * @returns
KoenKahlman 0:9c82986d7cb9 166 */
KoenKahlman 0:9c82986d7cb9 167 void _init();
KoenKahlman 0:9c82986d7cb9 168 };
KoenKahlman 0:9c82986d7cb9 169
KoenKahlman 0:9c82986d7cb9 170 #endif