16 channel MUX library
mcp23s18.h@0:c084a37d5aaf, 2013-12-15 (annotated)
- Committer:
- henryeherman
- Date:
- Sun Dec 15 02:41:53 2013 +0000
- Revision:
- 0:c084a37d5aaf
Working IOMux library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
henryeherman | 0:c084a37d5aaf | 1 | #ifndef MCP23S18_h |
henryeherman | 0:c084a37d5aaf | 2 | #define MCP23S18_h |
henryeherman | 0:c084a37d5aaf | 3 | |
henryeherman | 0:c084a37d5aaf | 4 | #include "mbed.h" |
henryeherman | 0:c084a37d5aaf | 5 | |
henryeherman | 0:c084a37d5aaf | 6 | // If you set IOCON.BANK = 0 then all |
henryeherman | 0:c084a37d5aaf | 7 | // the registers are |
henryeherman | 0:c084a37d5aaf | 8 | // BUT each bank uses the lowest significant bit |
henryeherman | 0:c084a37d5aaf | 9 | // in the upper word for identifying the bank |
henryeherman | 0:c084a37d5aaf | 10 | // We will NOT use this method to address |
henryeherman | 0:c084a37d5aaf | 11 | // the registers since it hurts my head :) |
henryeherman | 0:c084a37d5aaf | 12 | // I am documenting these registers here simply |
henryeherman | 0:c084a37d5aaf | 13 | // as an exercise |
henryeherman | 0:c084a37d5aaf | 14 | #define MCP23S18WRADDR 0x40 |
henryeherman | 0:c084a37d5aaf | 15 | #define MCP23S18RDADDR 0x41 |
henryeherman | 0:c084a37d5aaf | 16 | |
henryeherman | 0:c084a37d5aaf | 17 | #define IODIRA_BANK1 0x00 |
henryeherman | 0:c084a37d5aaf | 18 | #define IODIRB_BANK1 0x10 |
henryeherman | 0:c084a37d5aaf | 19 | #define IPOLA_BANK1 0x01 |
henryeherman | 0:c084a37d5aaf | 20 | #define IPOLB_BANK1 0x11 |
henryeherman | 0:c084a37d5aaf | 21 | #define GPINTENA_BANK1 0x02 |
henryeherman | 0:c084a37d5aaf | 22 | #define GPINTENB_BANK1 0x12 |
henryeherman | 0:c084a37d5aaf | 23 | #define DEFVALA_BANK1 0x03 |
henryeherman | 0:c084a37d5aaf | 24 | #define DEFVALB_BANK1 0x13 |
henryeherman | 0:c084a37d5aaf | 25 | #define INTCONA_BANK1 0x04 |
henryeherman | 0:c084a37d5aaf | 26 | #define INTCONB_BANK1 0x14 |
henryeherman | 0:c084a37d5aaf | 27 | #define IOCONA_BANK1 0x05 |
henryeherman | 0:c084a37d5aaf | 28 | #define IOCONB_BANK1 0x15 |
henryeherman | 0:c084a37d5aaf | 29 | #define GPPUA_BANK1 0x06 |
henryeherman | 0:c084a37d5aaf | 30 | #define GPPUB_BANK1 0x16 |
henryeherman | 0:c084a37d5aaf | 31 | #define INTFA_BANK1 0x07 |
henryeherman | 0:c084a37d5aaf | 32 | #define INTFB_BANK1 0x17 |
henryeherman | 0:c084a37d5aaf | 33 | #define INTCAPA_BANK1 0x08 |
henryeherman | 0:c084a37d5aaf | 34 | #define INTCAPB_BANK1 0x18 |
henryeherman | 0:c084a37d5aaf | 35 | #define GPIOA_BANK1 0x09 |
henryeherman | 0:c084a37d5aaf | 36 | #define GPIOB_BANK1 0x19 |
henryeherman | 0:c084a37d5aaf | 37 | #define OLATA_BANK1 0x0A |
henryeherman | 0:c084a37d5aaf | 38 | #define OLATB_BANK1 0x1A |
henryeherman | 0:c084a37d5aaf | 39 | |
henryeherman | 0:c084a37d5aaf | 40 | // If you set IOCON.BANK = 1 then all |
henryeherman | 0:c084a37d5aaf | 41 | // the registers are set sequentially |
henryeherman | 0:c084a37d5aaf | 42 | // We will use this method to address |
henryeherman | 0:c084a37d5aaf | 43 | // the registers since it hurts my head less :) |
henryeherman | 0:c084a37d5aaf | 44 | |
henryeherman | 0:c084a37d5aaf | 45 | #define IODIRA_BANK0 0x00 |
henryeherman | 0:c084a37d5aaf | 46 | #define IODIRB_BANK0 0x01 |
henryeherman | 0:c084a37d5aaf | 47 | #define IPOLA_BANK0 0x02 |
henryeherman | 0:c084a37d5aaf | 48 | #define IPOLB_BANK0 0x03 |
henryeherman | 0:c084a37d5aaf | 49 | #define GPINTENA_BANK0 0x04 |
henryeherman | 0:c084a37d5aaf | 50 | #define GPINTENB_BANK0 0x05 |
henryeherman | 0:c084a37d5aaf | 51 | #define DEFVALA_BANK0 0x06 |
henryeherman | 0:c084a37d5aaf | 52 | #define DEFVALB_BANK0 0x07 |
henryeherman | 0:c084a37d5aaf | 53 | #define INTCONA_BANK0 0x08 |
henryeherman | 0:c084a37d5aaf | 54 | #define INTCONB_BANK0 0x09 |
henryeherman | 0:c084a37d5aaf | 55 | #define IOCONA_BANK0 0x0A |
henryeherman | 0:c084a37d5aaf | 56 | #define IOCONB_BANK0 0x0B |
henryeherman | 0:c084a37d5aaf | 57 | #define GPPUA_BANK0 0x0C |
henryeherman | 0:c084a37d5aaf | 58 | #define GPPUB_BANK0 0x0D |
henryeherman | 0:c084a37d5aaf | 59 | #define INTFA_BANK0 0x0E |
henryeherman | 0:c084a37d5aaf | 60 | #define INTFB_BANK0 0x0F |
henryeherman | 0:c084a37d5aaf | 61 | #define INTCAPA_BANK0 0x10 |
henryeherman | 0:c084a37d5aaf | 62 | #define INTCAPB_BANK0 0x11 |
henryeherman | 0:c084a37d5aaf | 63 | #define GPIOA_BANK0 0x12 |
henryeherman | 0:c084a37d5aaf | 64 | #define GPIOB_BANK0 0x13 |
henryeherman | 0:c084a37d5aaf | 65 | #define OLATA_BANK0 0x14 |
henryeherman | 0:c084a37d5aaf | 66 | #define OLATB_BANK0 0x15 |
henryeherman | 0:c084a37d5aaf | 67 | |
henryeherman | 0:c084a37d5aaf | 68 | #define IODIRn_IO0 (1<<0) |
henryeherman | 0:c084a37d5aaf | 69 | #define IODIRn_IO1 (1<<1) |
henryeherman | 0:c084a37d5aaf | 70 | #define IODIRn_IO2 (1<<2) |
henryeherman | 0:c084a37d5aaf | 71 | #define IODIRn_IO3 (1<<3) |
henryeherman | 0:c084a37d5aaf | 72 | #define IODIRn_IO4 (1<<4) |
henryeherman | 0:c084a37d5aaf | 73 | #define IODIRn_IO5 (1<<5) |
henryeherman | 0:c084a37d5aaf | 74 | #define IODIRn_IO6 (1<<6) |
henryeherman | 0:c084a37d5aaf | 75 | #define IODIRn_IO7 (1<<7) |
henryeherman | 0:c084a37d5aaf | 76 | |
henryeherman | 0:c084a37d5aaf | 77 | #define IPOLn_IP0 (1<<0) |
henryeherman | 0:c084a37d5aaf | 78 | #define IPOLn_IP1 (1<<1) |
henryeherman | 0:c084a37d5aaf | 79 | #define IPOLn_IP2 (1<<2) |
henryeherman | 0:c084a37d5aaf | 80 | #define IPOLn_IP3 (1<<3) |
henryeherman | 0:c084a37d5aaf | 81 | #define IPOLn_IP4 (1<<4) |
henryeherman | 0:c084a37d5aaf | 82 | #define IPOLn_IP5 (1<<5) |
henryeherman | 0:c084a37d5aaf | 83 | #define IPOLn_IP6 (1<<6) |
henryeherman | 0:c084a37d5aaf | 84 | #define IPOLn_IP7 (1<<7) |
henryeherman | 0:c084a37d5aaf | 85 | |
henryeherman | 0:c084a37d5aaf | 86 | #define GPINTENn_GPINT0 (1<<0) |
henryeherman | 0:c084a37d5aaf | 87 | #define GPINTENn_GPINT1 (1<<1) |
henryeherman | 0:c084a37d5aaf | 88 | #define GPINTENn_GPINT2 (1<<2) |
henryeherman | 0:c084a37d5aaf | 89 | #define GPINTENn_GPINT3 (1<<3) |
henryeherman | 0:c084a37d5aaf | 90 | #define GPINTENn_GPINT4 (1<<4) |
henryeherman | 0:c084a37d5aaf | 91 | #define GPINTENn_GPINT5 (1<<5) |
henryeherman | 0:c084a37d5aaf | 92 | #define GPINTENn_GPINT6 (1<<6) |
henryeherman | 0:c084a37d5aaf | 93 | #define GPINTENn_GPINT7 (1<<7) |
henryeherman | 0:c084a37d5aaf | 94 | |
henryeherman | 0:c084a37d5aaf | 95 | #define DEFVALn_DEF0 (1<<0) |
henryeherman | 0:c084a37d5aaf | 96 | #define DEFVALn_DEF1 (1<<1) |
henryeherman | 0:c084a37d5aaf | 97 | #define DEFVALn_DEF2 (1<<2) |
henryeherman | 0:c084a37d5aaf | 98 | #define DEFVALn_DEF3 (1<<3) |
henryeherman | 0:c084a37d5aaf | 99 | #define DEFVALn_DEF4 (1<<4) |
henryeherman | 0:c084a37d5aaf | 100 | #define DEFVALn_DEF5 (1<<5) |
henryeherman | 0:c084a37d5aaf | 101 | #define DEFVALn_DEF6 (1<<6) |
henryeherman | 0:c084a37d5aaf | 102 | #define DEFVALn_DEF7 (1<<7) |
henryeherman | 0:c084a37d5aaf | 103 | |
henryeherman | 0:c084a37d5aaf | 104 | #define INTCONn_IOC0 (1<<0) |
henryeherman | 0:c084a37d5aaf | 105 | #define INTCONn_IOC1 (1<<1) |
henryeherman | 0:c084a37d5aaf | 106 | #define INTCONn_IOC2 (1<<2) |
henryeherman | 0:c084a37d5aaf | 107 | #define INTCONn_IOC3 (1<<3) |
henryeherman | 0:c084a37d5aaf | 108 | #define INTCONn_IOC4 (1<<4) |
henryeherman | 0:c084a37d5aaf | 109 | #define INTCONn_IOC5 (1<<5) |
henryeherman | 0:c084a37d5aaf | 110 | #define INTCONn_IOC6 (1<<6) |
henryeherman | 0:c084a37d5aaf | 111 | #define INTCONn_IOC7 (1<<7) |
henryeherman | 0:c084a37d5aaf | 112 | |
henryeherman | 0:c084a37d5aaf | 113 | #define IOCON_INTCC (1<<0) |
henryeherman | 0:c084a37d5aaf | 114 | #define IOCON_INTPOL (1<<1) |
henryeherman | 0:c084a37d5aaf | 115 | #define IOCON_ODR (1<<2) |
henryeherman | 0:c084a37d5aaf | 116 | #define IOCON_RSVD0 (1<<3) |
henryeherman | 0:c084a37d5aaf | 117 | #define IOCON_RSVD1 (1<<4) |
henryeherman | 0:c084a37d5aaf | 118 | #define IOCON_SEQOP (1<<5) |
henryeherman | 0:c084a37d5aaf | 119 | #define IOCON_MIRROR (1<<6) |
henryeherman | 0:c084a37d5aaf | 120 | #define IOCON_BANK (1<<7) |
henryeherman | 0:c084a37d5aaf | 121 | #define IOX_ALLOUTPUT 0x00000000 |
henryeherman | 0:c084a37d5aaf | 122 | #define IOX_ALLINPUT 0xFFFFFFFF |
henryeherman | 0:c084a37d5aaf | 123 | #define IOX_ALLINVERTED 0x00000000 |
henryeherman | 0:c084a37d5aaf | 124 | #define IOX_NONEINVERTED 0xFFFFFFFF |
henryeherman | 0:c084a37d5aaf | 125 | |
henryeherman | 0:c084a37d5aaf | 126 | class mcp23s18 |
henryeherman | 0:c084a37d5aaf | 127 | { |
henryeherman | 0:c084a37d5aaf | 128 | SPI& spi; |
henryeherman | 0:c084a37d5aaf | 129 | void(*selectfxn)(void); |
henryeherman | 0:c084a37d5aaf | 130 | void(*unselectfxn)(void); |
henryeherman | 0:c084a37d5aaf | 131 | //DigitalOut ncs; |
henryeherman | 0:c084a37d5aaf | 132 | public: |
henryeherman | 0:c084a37d5aaf | 133 | |
henryeherman | 0:c084a37d5aaf | 134 | mcp23s18(SPI& _spi, void(*sel)(void), void(*usel)(void)); |
henryeherman | 0:c084a37d5aaf | 135 | void configspi(); |
henryeherman | 0:c084a37d5aaf | 136 | void select(); |
henryeherman | 0:c084a37d5aaf | 137 | void deselect(); |
henryeherman | 0:c084a37d5aaf | 138 | int initialize(int setType=0); |
henryeherman | 0:c084a37d5aaf | 139 | int read_config(); |
henryeherman | 0:c084a37d5aaf | 140 | void set_direction(unsigned int dirpins); |
henryeherman | 0:c084a37d5aaf | 141 | int read_direction(); |
henryeherman | 0:c084a37d5aaf | 142 | void set_all_output(); |
henryeherman | 0:c084a37d5aaf | 143 | void set_all_input(); |
henryeherman | 0:c084a37d5aaf | 144 | |
henryeherman | 0:c084a37d5aaf | 145 | void set_inverted(unsigned int dirpins); |
henryeherman | 0:c084a37d5aaf | 146 | void set_all_inverted(); |
henryeherman | 0:c084a37d5aaf | 147 | void set_none_inverted(); |
henryeherman | 0:c084a37d5aaf | 148 | |
henryeherman | 0:c084a37d5aaf | 149 | void set_pullups(unsigned int pupins); |
henryeherman | 0:c084a37d5aaf | 150 | int read_pullups(); |
henryeherman | 0:c084a37d5aaf | 151 | void set_all_pullups(); |
henryeherman | 0:c084a37d5aaf | 152 | void set_none_pullups(); |
henryeherman | 0:c084a37d5aaf | 153 | |
henryeherman | 0:c084a37d5aaf | 154 | void write_port(unsigned int value); |
henryeherman | 0:c084a37d5aaf | 155 | |
henryeherman | 0:c084a37d5aaf | 156 | int read_register(char reg); |
henryeherman | 0:c084a37d5aaf | 157 | |
henryeherman | 0:c084a37d5aaf | 158 | int read_port(); |
henryeherman | 0:c084a37d5aaf | 159 | int read_latch(); |
henryeherman | 0:c084a37d5aaf | 160 | |
henryeherman | 0:c084a37d5aaf | 161 | int faultCode; |
henryeherman | 0:c084a37d5aaf | 162 | |
henryeherman | 0:c084a37d5aaf | 163 | private: |
henryeherman | 0:c084a37d5aaf | 164 | float _error; |
henryeherman | 0:c084a37d5aaf | 165 | }; |
henryeherman | 0:c084a37d5aaf | 166 | |
henryeherman | 0:c084a37d5aaf | 167 | #endif |