16 channel MUX library
mcp23s18.cpp
- Committer:
- henryeherman
- Date:
- 2013-12-15
- Revision:
- 0:c084a37d5aaf
File content as of revision 0:c084a37d5aaf:
#include "mbed.h" #include "mcp23s18.h" mcp23s18::mcp23s18(SPI& _spi, void(*sel)(void), void(*usel)(void)) : spi(_spi) { selectfxn = sel; unselectfxn = usel; } void mcp23s18::configspi() { spi.format(8, 0); //_spi.frequency(); } void mcp23s18::select() { //Set CS low to start transmission (interrupts conversion) configspi(); selectfxn(); } void mcp23s18::deselect() { //Set CS high to stop transmission (restarts conversion) unselectfxn(); } int mcp23s18::initialize(int setType) { int ret; select(); spi.write(MCP23S18WRADDR); spi.write(IOCONA_BANK0); spi.write(IOCON_MIRROR|IOCON_SEQOP); deselect(); select(); spi.write(MCP23S18RDADDR); spi.write(IOCONA_BANK0); ret = spi.write(IOCONA_BANK0); deselect(); ret = read_register(IOCONA_BANK0); //printf("GO away Init MCP23S18 0x%x\r\n", ret); faultCode=0; return ret; } int mcp23s18::read_config() { int ret = read_register(IOCONA_BANK0); return ret; } void mcp23s18::set_direction(unsigned int dirpins) { select(); spi.write(MCP23S18WRADDR); spi.write(IODIRA_BANK0); spi.write(0x000000FF & dirpins); deselect(); select(); spi.write(MCP23S18WRADDR); spi.write(IODIRB_BANK0); spi.write(0x000000FF & (dirpins>>8)); deselect(); } int mcp23s18::read_direction() { select(); spi.write(MCP23S18RDADDR); spi.write(IODIRA_BANK0); int lower_byte = spi.write(IODIRB_BANK0); int upper_byte = spi.write(IODIRA_BANK0); deselect(); int val = lower_byte|(upper_byte << 8); return val; } void mcp23s18::set_all_output() { set_direction(IOX_ALLOUTPUT); } void mcp23s18::set_all_input() { set_direction(IOX_ALLINPUT); } void mcp23s18::set_inverted(unsigned int invpins) { select(); spi.write(MCP23S18WRADDR); spi.write(IPOLA_BANK0); spi.write(0x000000FF & invpins); deselect(); select(); spi.write(MCP23S18WRADDR); spi.write(IPOLB_BANK0); spi.write(0x000000FF & (invpins>>8)); deselect(); } int mcp23s18::read_register(char reg) { select(); spi.write(MCP23S18RDADDR); spi.write(reg); int ret = spi.write(reg); deselect(); return ret; } int mcp23s18::read_port() { select(); spi.write(MCP23S18RDADDR); spi.write(GPIOA_BANK0); int lower_byte = spi.write(GPIOB_BANK0); int upper_byte = spi.write(GPIOA_BANK0); deselect(); int val = lower_byte|(upper_byte << 8); return val; } int mcp23s18::read_latch() { select(); spi.write(MCP23S18RDADDR); spi.write(OLATA_BANK0); int lower_byte = spi.write(OLATB_BANK0); int upper_byte = spi.write(OLATA_BANK0); deselect(); int val = lower_byte|(upper_byte << 8); return val; } void mcp23s18::set_all_inverted() { set_inverted(IOX_ALLINVERTED); } void mcp23s18::set_none_inverted() { set_inverted(IOX_NONEINVERTED); } void mcp23s18::set_pullups(unsigned int pupins) { select(); spi.write(MCP23S18WRADDR); spi.write(GPPUA_BANK0); spi.write(0x000000FF & pupins); spi.write(0x000000FF & (pupins>>8)); deselect(); } int mcp23s18::read_pullups() { select(); spi.write(MCP23S18RDADDR); spi.write(GPPUA_BANK0); int lower_byte = spi.write(GPPUB_BANK0); int upper_byte = spi.write(GPPUA_BANK0); deselect(); int val = lower_byte|(upper_byte << 8); return val; } void mcp23s18::set_all_pullups() { set_pullups(0xFFFF); } void mcp23s18::set_none_pullups() { set_pullups(0x0000); } void mcp23s18::write_port(unsigned int value) { //printf("Select MUX A\r\n"); select(); spi.write(MCP23S18WRADDR); spi.write(OLATA_BANK0); spi.write(0x000000FF & value); deselect(); //printf("Deselect MUX A\r\n"); //printf("Select MUX B\r\n"); select(); spi.write(MCP23S18WRADDR); spi.write(OLATB_BANK0); spi.write(0x000000FF & (value>>8)); deselect(); //printf("Deselect MUX B\r\n"); }