#include "PortRead_PCA9655E.h" | #include "PortRead_PCA9655E.h" | ||||
/* | |||||
configures column port's configuration, input, and pins. | |||||
*/ | |||||
PortRead_PCA9655E::PortRead_PCA9655E (PortIOE& port, const uint8_t readPins) | |||||
: port(port), readPins(readPins), | |||||
configurationByteCommand(port.num + 6), inputByteCommand(port.num) | |||||
{} | |||||
void PortRead_PCA9655E::begin() | void PortRead_PCA9655E::begin() | ||||
{ | { | ||||
Wire.beginTransmission(port.DEVICE_ADDR); | Wire.beginTransmission(port.DEVICE_ADDR); | ||||
Wire.write(configurationByteCommand); | |||||
Wire.write(port.num + 6); //configuration byte command | |||||
Wire.write(readPins); //0=configure as output (for LED), 1=configure as input (for read) | Wire.write(readPins); //0=configure as output (for LED), 1=configure as input (for read) | ||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
} | } | ||||
uint8_t PortRead_PCA9655E::read() | uint8_t PortRead_PCA9655E::read() | ||||
{ | { | ||||
Wire.beginTransmission(port.DEVICE_ADDR); | Wire.beginTransmission(port.DEVICE_ADDR); | ||||
Wire.write(inputByteCommand); //input immediately before requestFrom | |||||
Wire.write(port.num); //input byte command | |||||
Wire.endTransmission(false); //PCA9655E needs false to send a restart | Wire.endTransmission(false); //PCA9655E needs false to send a restart | ||||
Wire.requestFrom(port.DEVICE_ADDR, 1u); //request one byte from input port | |||||
Wire.requestFrom(port.DEVICE_ADDR, 1u); //request one byte from input port | |||||
return Wire.read(); | return Wire.read(); | ||||
} | } |
private: | private: | ||||
PortIOE& port; | PortIOE& port; | ||||
const uint8_t readPins; //bitwise pin configuration, 1 means read pin | const uint8_t readPins; //bitwise pin configuration, 1 means read pin | ||||
const uint8_t configurationByteCommand; | |||||
const uint8_t inputByteCommand; | |||||
public: | public: | ||||
//The constructor initialization list is in .cpp | |||||
PortRead_PCA9655E(PortIOE& port, const uint8_t readPins); | |||||
PortRead_PCA9655E (PortIOE& port, const uint8_t readPins) | |||||
: port(port), readPins(readPins) {} | |||||
void begin(); | void begin(); | ||||
virtual uint8_t read(); | virtual uint8_t read(); | ||||
}; | }; |
MCP23S17 data sheet | MCP23S17 data sheet | ||||
---------------- | ---------------- | ||||
http://www.onsemi.com/pub_link/Collateral/MCP23S17-D.PDF | http://www.onsemi.com/pub_link/Collateral/MCP23S17-D.PDF | ||||
WARNING: This class hardcodes Slave Select to Arduino Pin 10 to avoid the speed penalty of digitalWrite | |||||
*/ | */ | ||||
class PortWrite_MCP23S17 : public PortWriteInterface | class PortWrite_MCP23S17 : public PortWriteInterface |
#include "PortWrite_PCA9655E.h" | #include "PortWrite_PCA9655E.h" | ||||
/* | |||||
configures column port's configuration and output. | |||||
*/ | |||||
PortWrite_PCA9655E::PortWrite_PCA9655E(PortIOE& port) | |||||
: port(port), configurationByteCommand(port.num + 6), outputByteCommand(port.num + 2) {} | |||||
/* | /* | ||||
If PortRead_PCA9655E is instantiated on the same port, do NOT use PortWrite_PCA9655E::begin(). | If PortRead_PCA9655E is instantiated on the same port, do NOT use PortWrite_PCA9655E::begin(). | ||||
Otherwise readPins could be overwritten. | Otherwise readPins could be overwritten. | ||||
void PortWrite_PCA9655E::begin() | void PortWrite_PCA9655E::begin() | ||||
{ | { | ||||
Wire.beginTransmission(port.DEVICE_ADDR); | Wire.beginTransmission(port.DEVICE_ADDR); | ||||
Wire.write(configurationByteCommand); | |||||
Wire.write(port.num + 6); //configuration byte command | |||||
Wire.write(0); //0=configure as output (for strobe pins and LED) | Wire.write(0); //0=configure as output (for strobe pins and LED) | ||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
} | } | ||||
} | } | ||||
Wire.beginTransmission(port.DEVICE_ADDR); | Wire.beginTransmission(port.DEVICE_ADDR); | ||||
Wire.write(outputByteCommand); | |||||
Wire.write(port.num + 2); //output Byte command | |||||
Wire.write(port.outputVal); | Wire.write(port.outputVal); | ||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
} | } |
{ | { | ||||
private: | private: | ||||
PortIOE& port; | PortIOE& port; | ||||
const uint8_t configurationByteCommand; | |||||
const uint8_t outputByteCommand; | |||||
public: | public: | ||||
//The constructor initialization list is in .cpp | |||||
PortWrite_PCA9655E(PortIOE& port); | |||||
PortWrite_PCA9655E(PortIOE& port) : port(port) {} | |||||
void begin(); | void begin(); | ||||
virtual void write(const uint8_t pin, const bool level); | virtual void write(const uint8_t pin, const bool level); |