16 channel MUX library
mcp23s18.cpp@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 | #include "mbed.h" |
henryeherman | 0:c084a37d5aaf | 2 | #include "mcp23s18.h" |
henryeherman | 0:c084a37d5aaf | 3 | |
henryeherman | 0:c084a37d5aaf | 4 | mcp23s18::mcp23s18(SPI& _spi, void(*sel)(void), void(*usel)(void)) : spi(_spi) { |
henryeherman | 0:c084a37d5aaf | 5 | selectfxn = sel; |
henryeherman | 0:c084a37d5aaf | 6 | unselectfxn = usel; |
henryeherman | 0:c084a37d5aaf | 7 | } |
henryeherman | 0:c084a37d5aaf | 8 | |
henryeherman | 0:c084a37d5aaf | 9 | |
henryeherman | 0:c084a37d5aaf | 10 | void mcp23s18::configspi() { |
henryeherman | 0:c084a37d5aaf | 11 | spi.format(8, 0); |
henryeherman | 0:c084a37d5aaf | 12 | //_spi.frequency(); |
henryeherman | 0:c084a37d5aaf | 13 | } |
henryeherman | 0:c084a37d5aaf | 14 | |
henryeherman | 0:c084a37d5aaf | 15 | void mcp23s18::select() { |
henryeherman | 0:c084a37d5aaf | 16 | //Set CS low to start transmission (interrupts conversion) |
henryeherman | 0:c084a37d5aaf | 17 | configspi(); |
henryeherman | 0:c084a37d5aaf | 18 | selectfxn(); |
henryeherman | 0:c084a37d5aaf | 19 | } |
henryeherman | 0:c084a37d5aaf | 20 | |
henryeherman | 0:c084a37d5aaf | 21 | void mcp23s18::deselect() { |
henryeherman | 0:c084a37d5aaf | 22 | //Set CS high to stop transmission (restarts conversion) |
henryeherman | 0:c084a37d5aaf | 23 | unselectfxn(); |
henryeherman | 0:c084a37d5aaf | 24 | } |
henryeherman | 0:c084a37d5aaf | 25 | |
henryeherman | 0:c084a37d5aaf | 26 | int mcp23s18::initialize(int setType) { |
henryeherman | 0:c084a37d5aaf | 27 | int ret; |
henryeherman | 0:c084a37d5aaf | 28 | select(); |
henryeherman | 0:c084a37d5aaf | 29 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 30 | spi.write(IOCONA_BANK0); |
henryeherman | 0:c084a37d5aaf | 31 | spi.write(IOCON_MIRROR|IOCON_SEQOP); |
henryeherman | 0:c084a37d5aaf | 32 | deselect(); |
henryeherman | 0:c084a37d5aaf | 33 | select(); |
henryeherman | 0:c084a37d5aaf | 34 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 35 | spi.write(IOCONA_BANK0); |
henryeherman | 0:c084a37d5aaf | 36 | ret = spi.write(IOCONA_BANK0); |
henryeherman | 0:c084a37d5aaf | 37 | deselect(); |
henryeherman | 0:c084a37d5aaf | 38 | ret = read_register(IOCONA_BANK0); |
henryeherman | 0:c084a37d5aaf | 39 | //printf("GO away Init MCP23S18 0x%x\r\n", ret); |
henryeherman | 0:c084a37d5aaf | 40 | faultCode=0; |
henryeherman | 0:c084a37d5aaf | 41 | return ret; |
henryeherman | 0:c084a37d5aaf | 42 | } |
henryeherman | 0:c084a37d5aaf | 43 | |
henryeherman | 0:c084a37d5aaf | 44 | int mcp23s18::read_config() { |
henryeherman | 0:c084a37d5aaf | 45 | int ret = read_register(IOCONA_BANK0); |
henryeherman | 0:c084a37d5aaf | 46 | return ret; |
henryeherman | 0:c084a37d5aaf | 47 | } |
henryeherman | 0:c084a37d5aaf | 48 | |
henryeherman | 0:c084a37d5aaf | 49 | void mcp23s18::set_direction(unsigned int dirpins) { |
henryeherman | 0:c084a37d5aaf | 50 | select(); |
henryeherman | 0:c084a37d5aaf | 51 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 52 | spi.write(IODIRA_BANK0); |
henryeherman | 0:c084a37d5aaf | 53 | spi.write(0x000000FF & dirpins); |
henryeherman | 0:c084a37d5aaf | 54 | deselect(); |
henryeherman | 0:c084a37d5aaf | 55 | select(); |
henryeherman | 0:c084a37d5aaf | 56 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 57 | spi.write(IODIRB_BANK0); |
henryeherman | 0:c084a37d5aaf | 58 | spi.write(0x000000FF & (dirpins>>8)); |
henryeherman | 0:c084a37d5aaf | 59 | deselect(); |
henryeherman | 0:c084a37d5aaf | 60 | } |
henryeherman | 0:c084a37d5aaf | 61 | |
henryeherman | 0:c084a37d5aaf | 62 | int mcp23s18::read_direction() { |
henryeherman | 0:c084a37d5aaf | 63 | select(); |
henryeherman | 0:c084a37d5aaf | 64 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 65 | spi.write(IODIRA_BANK0); |
henryeherman | 0:c084a37d5aaf | 66 | int lower_byte = spi.write(IODIRB_BANK0); |
henryeherman | 0:c084a37d5aaf | 67 | int upper_byte = spi.write(IODIRA_BANK0); |
henryeherman | 0:c084a37d5aaf | 68 | deselect(); |
henryeherman | 0:c084a37d5aaf | 69 | int val = lower_byte|(upper_byte << 8); |
henryeherman | 0:c084a37d5aaf | 70 | return val; |
henryeherman | 0:c084a37d5aaf | 71 | } |
henryeherman | 0:c084a37d5aaf | 72 | |
henryeherman | 0:c084a37d5aaf | 73 | void mcp23s18::set_all_output() { |
henryeherman | 0:c084a37d5aaf | 74 | set_direction(IOX_ALLOUTPUT); |
henryeherman | 0:c084a37d5aaf | 75 | } |
henryeherman | 0:c084a37d5aaf | 76 | |
henryeherman | 0:c084a37d5aaf | 77 | |
henryeherman | 0:c084a37d5aaf | 78 | void mcp23s18::set_all_input() { |
henryeherman | 0:c084a37d5aaf | 79 | set_direction(IOX_ALLINPUT); |
henryeherman | 0:c084a37d5aaf | 80 | } |
henryeherman | 0:c084a37d5aaf | 81 | |
henryeherman | 0:c084a37d5aaf | 82 | |
henryeherman | 0:c084a37d5aaf | 83 | void mcp23s18::set_inverted(unsigned int invpins) { |
henryeherman | 0:c084a37d5aaf | 84 | select(); |
henryeherman | 0:c084a37d5aaf | 85 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 86 | spi.write(IPOLA_BANK0); |
henryeherman | 0:c084a37d5aaf | 87 | spi.write(0x000000FF & invpins); |
henryeherman | 0:c084a37d5aaf | 88 | deselect(); |
henryeherman | 0:c084a37d5aaf | 89 | select(); |
henryeherman | 0:c084a37d5aaf | 90 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 91 | spi.write(IPOLB_BANK0); |
henryeherman | 0:c084a37d5aaf | 92 | spi.write(0x000000FF & (invpins>>8)); |
henryeherman | 0:c084a37d5aaf | 93 | deselect(); |
henryeherman | 0:c084a37d5aaf | 94 | } |
henryeherman | 0:c084a37d5aaf | 95 | |
henryeherman | 0:c084a37d5aaf | 96 | int mcp23s18::read_register(char reg) { |
henryeherman | 0:c084a37d5aaf | 97 | select(); |
henryeherman | 0:c084a37d5aaf | 98 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 99 | spi.write(reg); |
henryeherman | 0:c084a37d5aaf | 100 | int ret = spi.write(reg); |
henryeherman | 0:c084a37d5aaf | 101 | deselect(); |
henryeherman | 0:c084a37d5aaf | 102 | return ret; |
henryeherman | 0:c084a37d5aaf | 103 | } |
henryeherman | 0:c084a37d5aaf | 104 | |
henryeherman | 0:c084a37d5aaf | 105 | int mcp23s18::read_port() { |
henryeherman | 0:c084a37d5aaf | 106 | select(); |
henryeherman | 0:c084a37d5aaf | 107 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 108 | spi.write(GPIOA_BANK0); |
henryeherman | 0:c084a37d5aaf | 109 | int lower_byte = spi.write(GPIOB_BANK0); |
henryeherman | 0:c084a37d5aaf | 110 | int upper_byte = spi.write(GPIOA_BANK0); |
henryeherman | 0:c084a37d5aaf | 111 | deselect(); |
henryeherman | 0:c084a37d5aaf | 112 | int val = lower_byte|(upper_byte << 8); |
henryeherman | 0:c084a37d5aaf | 113 | return val; |
henryeherman | 0:c084a37d5aaf | 114 | } |
henryeherman | 0:c084a37d5aaf | 115 | |
henryeherman | 0:c084a37d5aaf | 116 | int mcp23s18::read_latch() { |
henryeherman | 0:c084a37d5aaf | 117 | select(); |
henryeherman | 0:c084a37d5aaf | 118 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 119 | spi.write(OLATA_BANK0); |
henryeherman | 0:c084a37d5aaf | 120 | int lower_byte = spi.write(OLATB_BANK0); |
henryeherman | 0:c084a37d5aaf | 121 | int upper_byte = spi.write(OLATA_BANK0); |
henryeherman | 0:c084a37d5aaf | 122 | deselect(); |
henryeherman | 0:c084a37d5aaf | 123 | int val = lower_byte|(upper_byte << 8); |
henryeherman | 0:c084a37d5aaf | 124 | return val; |
henryeherman | 0:c084a37d5aaf | 125 | } |
henryeherman | 0:c084a37d5aaf | 126 | |
henryeherman | 0:c084a37d5aaf | 127 | void mcp23s18::set_all_inverted() { |
henryeherman | 0:c084a37d5aaf | 128 | set_inverted(IOX_ALLINVERTED); |
henryeherman | 0:c084a37d5aaf | 129 | } |
henryeherman | 0:c084a37d5aaf | 130 | |
henryeherman | 0:c084a37d5aaf | 131 | void mcp23s18::set_none_inverted() { |
henryeherman | 0:c084a37d5aaf | 132 | set_inverted(IOX_NONEINVERTED); |
henryeherman | 0:c084a37d5aaf | 133 | } |
henryeherman | 0:c084a37d5aaf | 134 | |
henryeherman | 0:c084a37d5aaf | 135 | void mcp23s18::set_pullups(unsigned int pupins) { |
henryeherman | 0:c084a37d5aaf | 136 | select(); |
henryeherman | 0:c084a37d5aaf | 137 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 138 | spi.write(GPPUA_BANK0); |
henryeherman | 0:c084a37d5aaf | 139 | spi.write(0x000000FF & pupins); |
henryeherman | 0:c084a37d5aaf | 140 | spi.write(0x000000FF & (pupins>>8)); |
henryeherman | 0:c084a37d5aaf | 141 | deselect(); |
henryeherman | 0:c084a37d5aaf | 142 | } |
henryeherman | 0:c084a37d5aaf | 143 | |
henryeherman | 0:c084a37d5aaf | 144 | int mcp23s18::read_pullups() { |
henryeherman | 0:c084a37d5aaf | 145 | select(); |
henryeherman | 0:c084a37d5aaf | 146 | spi.write(MCP23S18RDADDR); |
henryeherman | 0:c084a37d5aaf | 147 | spi.write(GPPUA_BANK0); |
henryeherman | 0:c084a37d5aaf | 148 | int lower_byte = spi.write(GPPUB_BANK0); |
henryeherman | 0:c084a37d5aaf | 149 | int upper_byte = spi.write(GPPUA_BANK0); |
henryeherman | 0:c084a37d5aaf | 150 | deselect(); |
henryeherman | 0:c084a37d5aaf | 151 | int val = lower_byte|(upper_byte << 8); |
henryeherman | 0:c084a37d5aaf | 152 | return val; |
henryeherman | 0:c084a37d5aaf | 153 | } |
henryeherman | 0:c084a37d5aaf | 154 | |
henryeherman | 0:c084a37d5aaf | 155 | void mcp23s18::set_all_pullups() { |
henryeherman | 0:c084a37d5aaf | 156 | set_pullups(0xFFFF); |
henryeherman | 0:c084a37d5aaf | 157 | } |
henryeherman | 0:c084a37d5aaf | 158 | |
henryeherman | 0:c084a37d5aaf | 159 | void mcp23s18::set_none_pullups() { |
henryeherman | 0:c084a37d5aaf | 160 | set_pullups(0x0000); |
henryeherman | 0:c084a37d5aaf | 161 | } |
henryeherman | 0:c084a37d5aaf | 162 | |
henryeherman | 0:c084a37d5aaf | 163 | |
henryeherman | 0:c084a37d5aaf | 164 | void mcp23s18::write_port(unsigned int value) { |
henryeherman | 0:c084a37d5aaf | 165 | //printf("Select MUX A\r\n"); |
henryeherman | 0:c084a37d5aaf | 166 | select(); |
henryeherman | 0:c084a37d5aaf | 167 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 168 | spi.write(OLATA_BANK0); |
henryeherman | 0:c084a37d5aaf | 169 | spi.write(0x000000FF & value); |
henryeherman | 0:c084a37d5aaf | 170 | deselect(); |
henryeherman | 0:c084a37d5aaf | 171 | //printf("Deselect MUX A\r\n"); |
henryeherman | 0:c084a37d5aaf | 172 | //printf("Select MUX B\r\n"); |
henryeherman | 0:c084a37d5aaf | 173 | select(); |
henryeherman | 0:c084a37d5aaf | 174 | spi.write(MCP23S18WRADDR); |
henryeherman | 0:c084a37d5aaf | 175 | spi.write(OLATB_BANK0); |
henryeherman | 0:c084a37d5aaf | 176 | spi.write(0x000000FF & (value>>8)); |
henryeherman | 0:c084a37d5aaf | 177 | deselect(); |
henryeherman | 0:c084a37d5aaf | 178 | //printf("Deselect MUX B\r\n"); |
henryeherman | 0:c084a37d5aaf | 179 | } |