diff --git a/src/PortInterface.h b/src/PortInterface.h index b8fd899..6fd58c2 100644 --- a/src/PortInterface.h +++ b/src/PortInterface.h @@ -9,7 +9,8 @@ Port classes are the keybrd library's interface to microcontroller ports or I/O class PortInterface { public: - virtual void begin(const uint8_t strobeOn)=0; + virtual void beginProtocol()=0; //SPI or I2C bus + virtual void begin(const uint8_t strobeOn)=0; //configure GPIO pins virtual void write(const uint8_t strobePin, const bool pinLogicLevel)=0; virtual uint8_t read()=0; }; diff --git a/src/PortMCP23S17.cpp b/src/PortMCP23S17.cpp index 312e013..8a0958c 100644 --- a/src/PortMCP23S17.cpp +++ b/src/PortMCP23S17.cpp @@ -17,24 +17,27 @@ uint8_t PortMCP23S17::transfer(const uint8_t command, const uint8_t registerAddr /* begin() is called from Scanner_IOE::begin(). Initiates SPI bus and configures I/O pins for read and write. -strobeOn is logic level of strobe on, HIGH or LOW MCP23S17 SPI interface is 10 MHz max. The electrical limitation to bus speed is bus capacitance and the length of the wires involved. Longer wires require lower clock speeds. - -begin() is called from Scanner_IOE::begin() twice, once each for refPortWrite and refPortRead. -The first 4 lines only need to be called once, but seem to work OK if called a second time. */ -void PortMCP23S17::begin(const uint8_t strobeOn) +void PortMCP23S17::beginProtocol() { - uint8_t pullUp; //bits, GPPU 0=pull-up disabled, 1=pull-up enabled - pinMode(SS, OUTPUT); //configure controller's Slave Select pin to output digitalWrite(SS, HIGH); //disable Slave Select SPI.begin(); SPI.beginTransaction(SPISettings (5000000, MSBFIRST, SPI_MODE0)); //control SPI bus, 5 MHz //SPI.endTransaction() not called to release SPI bus because keyboard only has one SPI device +} + +/* begin() is called from Scanner_IOE::begin(). +strobeOn is logic level of strobe on, HIGH or LOW +configure IODIR and GPPU. +*/ +void PortMCP23S17::begin(const uint8_t strobeOn) +{ + uint8_t pullUp; //bits, GPPU 0=pull-up disabled, 1=pull-up enabled if (strobeOn == LOW) //if active low, use internal pull-up resistors { diff --git a/src/PortMCP23S17.h b/src/PortMCP23S17.h index e8c0973..185b261 100644 --- a/src/PortMCP23S17.h +++ b/src/PortMCP23S17.h @@ -42,6 +42,7 @@ class PortMCP23S17 : public PortInterface uint8_t transfer(const uint8_t command, const uint8_t registerAddr, const uint8_t data); public: PortMCP23S17(PortIOE& port, const uint8_t readPins) : port(port), readPins(readPins) {} + void beginProtocol(); void begin(const uint8_t strobeOn); virtual void write(const uint8_t pin, const bool logicLevel); virtual uint8_t read(); diff --git a/src/Scanner_IOE.cpp b/src/Scanner_IOE.cpp index 6951553..dd4d9d6 100644 --- a/src/Scanner_IOE.cpp +++ b/src/Scanner_IOE.cpp @@ -12,8 +12,9 @@ Initiates communication protocal and configs ports. */ void Scanner_IOE::begin() { - refPortRead.begin(strobeOn); + refPortWrite.beginProtocol(); refPortWrite.begin(strobeOn); + refPortRead.begin(strobeOn); } /* scan() is called on every iteration of sketch loop().