diff --git a/src/PortRead_MCP23S17.cpp b/src/PortRead_MCP23S17.cpp index 83fb56c..5a3d004 100644 --- a/src/PortRead_MCP23S17.cpp +++ b/src/PortRead_MCP23S17.cpp @@ -4,26 +4,36 @@ PortRead_MCP23S17::begin() is not needed because port direction is already configured to input by default. SPI bus is configured in PortWrite_MCP23S17::begin(). */ -void PortRead_MCP23S17::begin() +void PortRead_MCP23S17::begin(const uint8_t strobeOn) { + uint8_t pullUp; //bitwise, 1 means internal pull-up resistor enabled + + if (strobeOn == LOW) //if active low + { + pullUp = readPins; + } + else + { + pullUp = 0; + } + pinMode(SS, OUTPUT); //configure controller's Slave Select pin to output digitalWrite(SS, HIGH); //disable Slave Select SPI.begin(); SPI.beginTransaction(SPISettings (SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE0)); //control SPI bus todo is slow clock needed? - digitalWrite(SS, LOW); //enable Slave Select + digitalWrite(SS, LOW); //enable Slave Select SPI.transfer(port.ADDR << 1); //write command SPI.transfer(port.num); //configure IODIR - SPI.transfer(pullUp); //0=output (for LED), 1=input (for read) - + SPI.transfer(readPins); //0=output (for LED), 1=input (for read) digitalWrite(SS, LOW); //enable Slave Select - digitalWrite(SS, HIGH); //disable Slave Select + digitalWrite(SS, HIGH); //disable Slave Select SPI.transfer(port.ADDR << 1); //write command SPI.transfer(port.num + 0x0C); //configure GPPU SPI.transfer(pullUp); //0=pull-up disabled (for LED), 1=pull-up enabled (for read) - digitalWrite(SS, HIGH); //disable Slave Select + //SPI.endTransaction() is not called to release the SPI bus // because keyboard only has one SPI device. } diff --git a/src/PortRead_MCP23S17.h b/src/PortRead_MCP23S17.h index 87e1ac1..f000884 100644 --- a/src/PortRead_MCP23S17.h +++ b/src/PortRead_MCP23S17.h @@ -5,12 +5,13 @@ #include #include #include "PortIOE.h" +#include "Scanner_Port.h" /* One MCP23S17 I/O expander port connected to matrix columns. Instantiation todo ------------ -pullUp parameter is port's bitwise pin configuration +readPins parameter is port's bitwise pin configuration 1=configure as input (for pins connected to column) 0=configure as output (for LED or not connected to a column) @@ -21,17 +22,17 @@ Example instantiation for column port 1, with pins 2 and 3 connected to columns: PortIOE port1(1, 0); PortRead_MCP23S17 colPort1(port1, 2<<0 | 1<<3 ); -pullUp are read from pin 0 on up. +readPins are read from pin 0 on up. */ class PortRead_MCP23S17 : public PortRead { private: PortIOE& port; - const uint8_t pullUp; //bitwise, 1 means internal pull-up resistor enabled + const uint8_t readPins; //bitwise, 1 means internal pull-up resistor enabled public: - PortRead_MCP23S17(PortIOE& port, const uint8_t pullUp) : port(port), pullUp(pullUp) {} - void begin(); + PortRead_MCP23S17(PortIOE& port, const uint8_t readPins) : port(port), readPins(readPins) {} + void begin(const uint8_t strobeOn); virtual uint8_t read(); }; #endif diff --git a/src/PortWrite_MCP23S17.cpp b/src/PortWrite_MCP23S17.cpp index f11ea99..81c461a 100644 --- a/src/PortWrite_MCP23S17.cpp +++ b/src/PortWrite_MCP23S17.cpp @@ -29,20 +29,20 @@ void PortWrite_MCP23S17::begin() } /* -pin is bitwise, where pin being strobed is 1. -strobe is HIGH or LOW (for active high or active low). +strobePin is bitwise, where pin being strobed is 1. +pinLogicLevel is HIGH or LOW. port.outputVal can be shared by LEDs. The functions does not reset the other pins so that they can be used for LEDs. */ -void PortWrite_MCP23S17::write(const uint8_t pin, const bool strobe) +void PortWrite_MCP23S17::write(const uint8_t strobePin, const uint8_t pinLogicLevel) { - if (strobe == LOW) //if active low + if (pinLogicLevel == LOW) { - port.outputVal &= ~pin; //set pin output to low + port.outputVal &= ~strobePin; //set strobePin output to low } - else //if active high + else { - port.outputVal |= pin; //set pin output to high + port.outputVal |= strobePin; //set strobePin output to high } writePort(port.num + 0x12, port.outputVal); //set GPIO port pins for stobe and LEDs diff --git a/src/PortWrite_MCP23S17.h b/src/PortWrite_MCP23S17.h index 7d2ea90..bd3f7da 100644 --- a/src/PortWrite_MCP23S17.h +++ b/src/PortWrite_MCP23S17.h @@ -41,6 +41,6 @@ class PortWrite_MCP23S17 : public PortWrite public: PortWrite_MCP23S17(PortIOE& port) : port(port) {} void begin(); - virtual void write(const uint8_t pin, const bool level); + virtual void write(const uint8_t pin, const uint8_t level); }; #endif diff --git a/unit_tests/PortRead_MCP23S17/PortRead_MCP23S17.ino b/unit_tests/PortRead_MCP23S17/PortRead_MCP23S17.ino index 887129b..936a23f 100644 --- a/unit_tests/PortRead_MCP23S17/PortRead_MCP23S17.ino +++ b/unit_tests/PortRead_MCP23S17/PortRead_MCP23S17.ino @@ -9,6 +9,10 @@ http://arduino.stackexchange.com/questions/28792/reading-an-mcp23s17-i-o-expande */ #include "PortIOE.h" #include "PortRead_MCP23S17.h" +#include "Scanner_Port.h" + +const bool Scanner_Port::STROBE_ON = LOW; +const bool Scanner_Port::STROBE_OFF = HIGH; const uint8_t PortIOE::ADDR = 0x20; //MCP23S17 address, all 3 ADDR pins are grounded PortIOE portB(1, 0); diff --git a/unit_tests/PortWrite_MCP23S17/PortWrite_MCP23S17.ino b/unit_tests/PortWrite_MCP23S17/PortRead_MCP23S17.ino similarity index 100% rename from unit_tests/PortWrite_MCP23S17/PortWrite_MCP23S17.ino rename to unit_tests/PortWrite_MCP23S17/PortRead_MCP23S17.ino