196 lines
5.5 KiB
C++
196 lines
5.5 KiB
C++
|
|
/*
|
|||
|
|
* MCP23S17.h
|
|||
|
|
*
|
|||
|
|
* Created on: 19 <EFBFBD><EFBFBD><EFBFBD>. 2019 <EFBFBD>.
|
|||
|
|
* Author: titov
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifndef SOURCE_DRIVER_CHIPSET_MCP23S17_H_
|
|||
|
|
#define SOURCE_DRIVER_CHIPSET_MCP23S17_H_
|
|||
|
|
|
|||
|
|
#include "PackagerMCP23S17.hpp"
|
|||
|
|
|
|||
|
|
#include "../SerialPortAdapter.hpp"
|
|||
|
|
|
|||
|
|
#include "../PinIO.hh"
|
|||
|
|
#include "../PinIOOverride.hh"
|
|||
|
|
#include "../PortMultiplexer.hpp"
|
|||
|
|
|
|||
|
|
#include "../../systemic/RegisterEncoder.hpp"
|
|||
|
|
|
|||
|
|
namespace driver { namespace chipset {
|
|||
|
|
|
|||
|
|
namespace MCP23S17 {
|
|||
|
|
|
|||
|
|
typedef PackagerMCP23S17 Packager;
|
|||
|
|
typedef uint16_t Latency;
|
|||
|
|
|
|||
|
|
typedef SerialPortAdapter<PackagerMCP23S17::Frame, Latency, false> SerialPortRegister;
|
|||
|
|
|
|||
|
|
typedef PinIO<Packager::Data> PinIO;
|
|||
|
|
typedef PinIOOverride<Packager::Data> PinIOOverride;
|
|||
|
|
typedef PortMultiplexer<Packager::Data> PortMultiplexer;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
struct ControlRegistersPairedAcronims {
|
|||
|
|
enum Acronims {
|
|||
|
|
IODIR = 0x00, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
IPOL = 0x02, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
GPINTEN = 0x04, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
DEFVAL = 0x06, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
INTCON = 0x08, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
IOCON = 0x0A, //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
GPPU = 0x0C, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PULL-UP <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
INTF = 0x0E, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
INTCAP = 0x10, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
GPIO = 0x12, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
OLAT = 0x14, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
enum HardwareAddress
|
|||
|
|
{
|
|||
|
|
A0 = 0,
|
|||
|
|
A1, A2, A3, A4, A5, A6, A7
|
|||
|
|
};
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
enum PinOrderNum
|
|||
|
|
{
|
|||
|
|
GPA0 = 0,
|
|||
|
|
GPA1, GPA2, GPA3, GPA4, GPA5, GPA6, GPA7,
|
|||
|
|
GPB0, GPB1, GPB2, GPB3, GPB4, GPB5, GPB6, GPB7,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
enum BANKOption
|
|||
|
|
{
|
|||
|
|
REGISTER_ASSOCIATED_WITH_EACH_PORT = 1, //!<Registers associated with each port are separated into different banks.
|
|||
|
|
REGISTER_IN_SAME_BANK = 0, //!<The registers are in the same bank (addresses are sequential).
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
enum MIRROROption
|
|||
|
|
{
|
|||
|
|
INT_PIN_INTERNALLY_CONNECTED = 1, //!<The INT pins are internally connected
|
|||
|
|
INT_PIN_NOT_CONNECTED = 0, //!<The INT pins are not connected. INTA is associated with PORTA and INTB is associated with
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
enum SEQOPOption
|
|||
|
|
{
|
|||
|
|
SEQUENTIAL_OPERATION_DISABLED = 1, //!<Sequential operation disabled, address pointer does not increment
|
|||
|
|
SEQUENTIAL_OPERATION_ENABLED = 0, //!<Sequential operation enabled, address pointer increments
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SDA
|
|||
|
|
enum DISSLWOption
|
|||
|
|
{
|
|||
|
|
SLEW_RATE_DISABLED = 1, //!<Slew rate disabled
|
|||
|
|
SLEW_RATE_ENABLED = 0, //!<Slew rate enabled
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
enum HAENOption
|
|||
|
|
{
|
|||
|
|
ENABLES_ADDRESS_PINS = 1, //!<Enables the MCP23S17 address pins.
|
|||
|
|
DISABLES_ADDRESS_PINS = 0, //!<Disables the MCP23S17 address pins
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
enum ODROption
|
|||
|
|
{
|
|||
|
|
OPEN_DRAIN_OUTPUT = 1, //!<Open-drain output (overrides the INTPOL bit.)
|
|||
|
|
ACTIVE_DRIVE_OUTPUT = 0, //!<Active driver output (INTPOL bit sets the polarity.)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
enum INTPOLOption
|
|||
|
|
{
|
|||
|
|
ACTIVE_HIGH = 1, //!<Active-high
|
|||
|
|
ACTIVE_LOW = 0, //!<Active-low
|
|||
|
|
};
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCP23S17
|
|||
|
|
struct ConfigurationContent
|
|||
|
|
{
|
|||
|
|
uint16_t unimplemented : 1;
|
|||
|
|
INTPOLOption intpol_option : 1;
|
|||
|
|
ODROption odr_option : 1;
|
|||
|
|
HAENOption haen_option : 1;
|
|||
|
|
DISSLWOption disslw_option : 1;
|
|||
|
|
SEQOPOption seqop_option : 1;
|
|||
|
|
MIRROROption mirror_option : 1;
|
|||
|
|
BANKOption bank_option : 1;
|
|||
|
|
uint16_t reserved_bits : 8;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct ConfigurationRegister {
|
|||
|
|
ConfigurationRegister() {
|
|||
|
|
content.bank_option = REGISTER_IN_SAME_BANK;
|
|||
|
|
content.mirror_option = INT_PIN_NOT_CONNECTED;
|
|||
|
|
content.seqop_option = SEQUENTIAL_OPERATION_ENABLED;
|
|||
|
|
content.disslw_option = SLEW_RATE_ENABLED;
|
|||
|
|
content.haen_option = ENABLES_ADDRESS_PINS;
|
|||
|
|
content.odr_option = ACTIVE_DRIVE_OUTPUT;
|
|||
|
|
content.intpol_option = ACTIVE_LOW;
|
|||
|
|
content.unimplemented = 0;
|
|||
|
|
content.reserved_bits = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ConfigurationContent content;
|
|||
|
|
|
|||
|
|
operator uint16_t() {
|
|||
|
|
//todo: !!!UB!!!
|
|||
|
|
union {
|
|||
|
|
ConfigurationContent cfg_reg;
|
|||
|
|
uint16_t serialized;
|
|||
|
|
} serialized;
|
|||
|
|
|
|||
|
|
serialized.cfg_reg = content;
|
|||
|
|
|
|||
|
|
return serialized.serialized | (serialized.serialized<<8); //todo: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCP23S17
|
|||
|
|
struct Parameters
|
|||
|
|
{
|
|||
|
|
typedef uint16_t OptionRegister;
|
|||
|
|
static const unsigned int allowed_options = 7;
|
|||
|
|
|
|||
|
|
enum AllowedPinOptionsRegisters {
|
|||
|
|
OLAT_REGISTER,
|
|||
|
|
DIRECTION_REGISTER,
|
|||
|
|
INPUT_POLARITY_REGISTER,
|
|||
|
|
INTERRUPT_ON_CHANGE_CONTROL_REGISTER,
|
|||
|
|
DEFAULT_COMPARE_REGISTER_INTERRUPT_ON_CHANGE,
|
|||
|
|
INTERRUPT_CONTROL_REGISTER,
|
|||
|
|
PULL_UP_RESISTOR_REGISTER,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
OptionRegister pin_option[allowed_options];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
enum { WRITE_REGISTER_FLAG = 0, READ_REGISTER_FLAG = 1 };
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif /* SOURCE_DRIVER_CHIPSET_MCP23S17_H_ */
|