16 channel MUX library

Dependents:   elixys

Committer:
henryeherman
Date:
Sun Dec 15 02:41:53 2013 +0000
Revision:
0:c084a37d5aaf
Working IOMux library

Who changed what in which revision?

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