mirror of
https://github.com/esphome/esphome.git
synced 2024-11-30 02:34:12 +01:00
added ANALOG_OUTPUT as first functionality
This commit is contained in:
parent
9d1c15d06c
commit
dad38bb220
5 changed files with 497 additions and 0 deletions
20
esphome/components/sx1509/__init__.py
Normal file
20
esphome/components/sx1509/__init__.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import esphome.codegen as cg
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.components import i2c
|
||||||
|
from esphome.const import CONF_FREQUENCY, CONF_ID
|
||||||
|
|
||||||
|
DEPENDENCIES = ['i2c']
|
||||||
|
MULTI_CONF = True
|
||||||
|
|
||||||
|
sx1509_ns = cg.esphome_ns.namespace('sx1509')
|
||||||
|
SX1509Component = sx1509_ns.class_('SX1509Component', cg.Component, i2c.I2CDevice)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = cv.Schema({
|
||||||
|
cv.GenerateID(): cv.declare_id(SX1509Component),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA).extend(i2c.i2c_device_schema(0x3E))
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
|
yield cg.register_component(var, config)
|
||||||
|
yield i2c.register_i2c_device(var, config)
|
24
esphome/components/sx1509/output.py
Normal file
24
esphome/components/sx1509/output.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import esphome.codegen as cg
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.components import output
|
||||||
|
from esphome.const import CONF_CHANNEL, CONF_ID
|
||||||
|
from . import SX1509Component, sx1509_ns
|
||||||
|
|
||||||
|
DEPENDENCIES = ['sx1509']
|
||||||
|
|
||||||
|
SX1509FloatOutputChannel = sx1509_ns.class_('SX1509FloatOutputChannel', output.FloatOutput)
|
||||||
|
CONF_SX1509_ID = 'sx1509_id'
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend({
|
||||||
|
cv.Required(CONF_ID): cv.declare_id(SX1509FloatOutputChannel),
|
||||||
|
cv.GenerateID(CONF_SX1509_ID): cv.use_id(SX1509Component),
|
||||||
|
|
||||||
|
cv.Required(CONF_CHANNEL): cv.int_range(min=0, max=15),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
paren = yield cg.get_variable(config[CONF_SX1509_ID])
|
||||||
|
rhs = paren.create_float_output_channel(config[CONF_CHANNEL])
|
||||||
|
var = cg.Pvariable(config[CONF_ID], rhs)
|
||||||
|
yield output.register_output(var, config)
|
213
esphome/components/sx1509/sx1509.cpp
Normal file
213
esphome/components/sx1509/sx1509.cpp
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
#include "sx1509.h"
|
||||||
|
#include "esphome/core/helpers.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace sx1509 {
|
||||||
|
|
||||||
|
static const char *TAG = "sx1509";
|
||||||
|
|
||||||
|
void SX1509Component::setup() {
|
||||||
|
ESP_LOGCONFIG(TAG, "Setting up SX1509ComponentComponent...");
|
||||||
|
|
||||||
|
ESP_LOGV(TAG, " Resetting devices...");
|
||||||
|
this->write_byte(REG_RESET, 0x12);
|
||||||
|
this->write_byte(REG_RESET, 0x34);
|
||||||
|
|
||||||
|
// Communication test.
|
||||||
|
uint16_t data;
|
||||||
|
this->read_byte_16(REG_INTERRUPT_MASK_A, &data);
|
||||||
|
if (data == 0xFF00) {
|
||||||
|
clock(INTERNAL_CLOCK_2MHZ);
|
||||||
|
} else {
|
||||||
|
this->mark_failed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto *channel : this->float_output_channels_)
|
||||||
|
channel->setup_channel();
|
||||||
|
|
||||||
|
delayMicroseconds(500);
|
||||||
|
|
||||||
|
this->loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::dump_config() {
|
||||||
|
ESP_LOGCONFIG(TAG, "SX1509:");
|
||||||
|
if (this->is_failed()) {
|
||||||
|
ESP_LOGE(TAG, "Setting up SX1509 failed!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::loop() {}
|
||||||
|
|
||||||
|
SX1509FloatOutputChannel *
|
||||||
|
SX1509Component::create_float_output_channel(uint8_t channel) {
|
||||||
|
ESP_LOGD(TAG, "Set pin mode for channel %d", channel);
|
||||||
|
auto *c = new SX1509FloatOutputChannel(this, channel);
|
||||||
|
float_output_channels_.push_back(c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::digitalWrite(uint8_t channel, uint8_t highLow) {
|
||||||
|
uint16_t tempRegDir = 0;
|
||||||
|
this->read_byte_16(REG_DIR_B, &tempRegDir);
|
||||||
|
|
||||||
|
if ((0xFFFF ^ tempRegDir) &
|
||||||
|
(1 << channel)) // If the pin is an output, write high/low
|
||||||
|
{
|
||||||
|
uint16_t tempRegData = 0;
|
||||||
|
this->read_byte_16(REG_DATA_B, &tempRegData);
|
||||||
|
if (highLow)
|
||||||
|
tempRegData |= (1 << channel);
|
||||||
|
else
|
||||||
|
tempRegData &= ~(1 << channel);
|
||||||
|
this->write_byte_16(REG_DATA_B, tempRegData);
|
||||||
|
} else // Otherwise the pin is an input, pull-up/down
|
||||||
|
{
|
||||||
|
uint16_t tempPullUp;
|
||||||
|
this->read_byte_16(REG_PULL_UP_B, &tempPullUp);
|
||||||
|
uint16_t tempPullDown;
|
||||||
|
this->read_byte_16(REG_PULL_DOWN_B, &tempPullDown);
|
||||||
|
|
||||||
|
if (highLow) // if HIGH, do pull-up, disable pull-down
|
||||||
|
{
|
||||||
|
tempPullUp |= (1 << channel);
|
||||||
|
tempPullDown &= ~(1 << channel);
|
||||||
|
this->write_byte_16(REG_PULL_UP_B, tempPullUp);
|
||||||
|
this->write_byte_16(REG_PULL_DOWN_B, tempPullDown);
|
||||||
|
} else // If LOW do pull-down, disable pull-up
|
||||||
|
{
|
||||||
|
tempPullDown |= (1 << channel);
|
||||||
|
tempPullUp &= ~(1 << channel);
|
||||||
|
this->write_byte_16(REG_PULL_UP_B, tempPullUp);
|
||||||
|
this->write_byte_16(REG_PULL_DOWN_B, tempPullDown);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::pinMode(uint8_t channel, uint8_t inOut) {
|
||||||
|
// The SX1509 RegDir registers: REG_DIR_B, REG_DIR_A
|
||||||
|
// 0: IO is configured as an output
|
||||||
|
// 1: IO is configured as an input
|
||||||
|
uint8_t modeBit;
|
||||||
|
if ((inOut == OUTPUT) || (inOut == ANALOG_OUTPUT))
|
||||||
|
modeBit = 0;
|
||||||
|
else
|
||||||
|
modeBit = 1;
|
||||||
|
|
||||||
|
uint16_t tempRegDir = 0;
|
||||||
|
this->read_byte_16(REG_DIR_B, &tempRegDir);
|
||||||
|
|
||||||
|
if (modeBit)
|
||||||
|
tempRegDir |= (1 << channel);
|
||||||
|
else
|
||||||
|
tempRegDir &= ~(1 << channel);
|
||||||
|
|
||||||
|
this->write_byte_16(REG_DIR_B, tempRegDir);
|
||||||
|
|
||||||
|
// If INPUT_PULLUP was called, set up the pullup too:
|
||||||
|
if (inOut == INPUT_PULLUP)
|
||||||
|
digitalWrite(channel, HIGH);
|
||||||
|
|
||||||
|
if (inOut == ANALOG_OUTPUT) {
|
||||||
|
ledDriverInit(channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::ledDriverInit(uint8_t channel, uint8_t freq, bool log) {
|
||||||
|
uint16_t tempWord;
|
||||||
|
uint8_t tempByte;
|
||||||
|
|
||||||
|
// Disable input buffer
|
||||||
|
// Writing a 1 to the pin bit will disable that pins input buffer
|
||||||
|
this->read_byte_16(REG_INPUT_DISABLE_B, &tempWord);
|
||||||
|
tempWord |= (1 << channel);
|
||||||
|
this->write_byte_16(REG_INPUT_DISABLE_B, tempWord);
|
||||||
|
|
||||||
|
// Disable pull-up
|
||||||
|
// Writing a 0 to the pin bit will disable that pull-up resistor
|
||||||
|
this->read_byte_16(REG_PULL_UP_B, &tempWord);
|
||||||
|
tempWord &= ~(1 << channel);
|
||||||
|
this->write_byte_16(REG_PULL_UP_B, tempWord);
|
||||||
|
|
||||||
|
// Set direction to output (REG_DIR_B)
|
||||||
|
this->read_byte_16(REG_DIR_B, &tempWord);
|
||||||
|
tempWord &= ~(1 << channel); // 0=output
|
||||||
|
this->write_byte_16(REG_DIR_B, tempWord);
|
||||||
|
|
||||||
|
// Enable oscillator (REG_CLOCK)
|
||||||
|
this->read_byte(REG_CLOCK, &tempByte);
|
||||||
|
tempByte |= (1 << 6); // Internal 2MHz oscillator part 1 (set bit 6)
|
||||||
|
tempByte &= ~(1 << 5); // Internal 2MHz oscillator part 2 (clear bit 5)
|
||||||
|
this->write_byte(REG_CLOCK, tempByte);
|
||||||
|
|
||||||
|
// Configure LED driver clock and mode (REG_MISC)
|
||||||
|
this->read_byte(REG_MISC, &tempByte);
|
||||||
|
if (log) {
|
||||||
|
tempByte |= (1 << 7); // set logarithmic mode bank B
|
||||||
|
tempByte |= (1 << 3); // set logarithmic mode bank A
|
||||||
|
} else {
|
||||||
|
tempByte &= ~(1 << 7); // set linear mode bank B
|
||||||
|
tempByte &= ~(1 << 3); // set linear mode bank A
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use configClock to setup the clock divder
|
||||||
|
if (_clkX == 0) // Make clckX non-zero
|
||||||
|
{
|
||||||
|
_clkX = 2000000.0 / (1 << (1 - 1)); // Update private clock variable
|
||||||
|
|
||||||
|
byte freq = (1 & 0x07) << 4; // freq should only be 3 bits from 6:4
|
||||||
|
tempByte |= freq;
|
||||||
|
}
|
||||||
|
this->write_byte(REG_MISC, tempByte);
|
||||||
|
|
||||||
|
// Enable LED driver operation (REG_LED_DRIVER_ENABLE)
|
||||||
|
this->read_byte_16(REG_LED_DRIVER_ENABLE_B, &tempWord);
|
||||||
|
tempWord |= (1 << channel);
|
||||||
|
this->write_byte_16(REG_LED_DRIVER_ENABLE_B, tempWord);
|
||||||
|
|
||||||
|
// Set REG_DATA bit low ~ LED driver started
|
||||||
|
this->read_byte_16(REG_DATA_B, &tempWord);
|
||||||
|
tempWord &= ~(1 << channel);
|
||||||
|
this->write_byte_16(REG_DATA_B, tempWord);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::clock(byte oscSource, byte oscPinFunction,
|
||||||
|
byte oscFreqOut, byte oscDivider) {
|
||||||
|
oscSource = (oscSource & 0b11) << 5; // 2-bit value, bits 6:5
|
||||||
|
oscPinFunction = (oscPinFunction & 1) << 4; // 1-bit value bit 4
|
||||||
|
oscFreqOut = (oscFreqOut & 0b1111); // 4-bit value, bits 3:0
|
||||||
|
byte regClock = oscSource | oscPinFunction | oscFreqOut;
|
||||||
|
this->write_byte(REG_CLOCK, regClock);
|
||||||
|
|
||||||
|
oscDivider = constrain(oscDivider, 1, 7);
|
||||||
|
_clkX = 2000000.0 / (1 << (oscDivider - 1)); // Update private clock variable
|
||||||
|
oscDivider = (oscDivider & 0b111) << 4; // 3-bit value, bits 6:4
|
||||||
|
|
||||||
|
uint8_t regMisc;
|
||||||
|
this->read_byte(REG_MISC, ®Misc);
|
||||||
|
regMisc &= ~(0b111 << 4);
|
||||||
|
regMisc |= oscDivider;
|
||||||
|
this->write_byte(REG_MISC, regMisc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509Component::set_channel_value_(uint8_t channel, uint8_t iOn) {
|
||||||
|
ESP_LOGD(TAG, "set_channel_value_ for channel %d to %d", channel, iOn);
|
||||||
|
this->write_byte(REG_I_ON[channel], iOn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509FloatOutputChannel::write_state(float state) {
|
||||||
|
ESP_LOGD(TAG, "write_state %f", state);
|
||||||
|
const uint16_t max_duty = 255;
|
||||||
|
const float duty_rounded = roundf(state * max_duty);
|
||||||
|
auto duty = static_cast<uint16_t>(duty_rounded);
|
||||||
|
this->parent_->set_channel_value_(this->channel_, duty);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SX1509FloatOutputChannel::setup_channel() {
|
||||||
|
this->parent_->pinMode(this->channel_, ANALOG_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sx1509
|
||||||
|
} // namespace esphome
|
102
esphome/components/sx1509/sx1509.h
Normal file
102
esphome/components/sx1509/sx1509.h
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esphome/components/i2c/i2c.h"
|
||||||
|
#include "esphome/components/output/float_output.h"
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "sx1509_registers.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace sx1509 {
|
||||||
|
|
||||||
|
// These are used for setting LED driver to linear or log mode:
|
||||||
|
#define LINEAR 0
|
||||||
|
#define LOGARITHMIC 1
|
||||||
|
|
||||||
|
// These are used for clock config:
|
||||||
|
#define INTERNAL_CLOCK_2MHZ 2
|
||||||
|
#define EXTERNAL_CLOCK 1
|
||||||
|
|
||||||
|
#define SOFTWARE_RESET 0
|
||||||
|
#define HARDWARE_RESET 1
|
||||||
|
|
||||||
|
#define ANALOG_OUTPUT 0x3 // To set a pin mode for PWM output
|
||||||
|
|
||||||
|
class SX1509Component;
|
||||||
|
|
||||||
|
class SX1509FloatOutputChannel : public output::FloatOutput {
|
||||||
|
public:
|
||||||
|
SX1509FloatOutputChannel(SX1509Component *parent, uint8_t channel)
|
||||||
|
: parent_(parent), channel_(channel) {}
|
||||||
|
void setup_channel();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void write_state(float state) override;
|
||||||
|
|
||||||
|
SX1509Component *parent_;
|
||||||
|
uint8_t channel_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// SX1509 float output component.
|
||||||
|
class SX1509Component : public Component, public i2c::I2CDevice {
|
||||||
|
|
||||||
|
public:
|
||||||
|
SX1509Component() {}
|
||||||
|
|
||||||
|
SX1509FloatOutputChannel *create_float_output_channel(uint8_t channel);
|
||||||
|
|
||||||
|
void setup() override;
|
||||||
|
void dump_config() override;
|
||||||
|
float get_setup_priority() const override { return setup_priority::HARDWARE; }
|
||||||
|
void loop() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend SX1509FloatOutputChannel;
|
||||||
|
std::vector<SX1509FloatOutputChannel *> float_output_channels_{};
|
||||||
|
|
||||||
|
void pinMode(uint8_t channel, uint8_t inOut);
|
||||||
|
void ledDriverInit(uint8_t channel, uint8_t freq = 1, bool log = false);
|
||||||
|
void clock(uint8_t oscSource = 2, uint8_t oscDivider = 1,
|
||||||
|
uint8_t oscPinFunction = 0, uint8_t oscFreqOut = 0);
|
||||||
|
void digitalWrite(uint8_t channel, uint8_t highLow);
|
||||||
|
void set_channel_value_(uint8_t channel, uint8_t iOn);
|
||||||
|
|
||||||
|
// Pin definitions:
|
||||||
|
uint8_t pinInterrupt_;
|
||||||
|
uint8_t pinOscillator_;
|
||||||
|
uint8_t pinReset_;
|
||||||
|
// variables:
|
||||||
|
u_long _clkX;
|
||||||
|
uint8_t frequency_ = 0;
|
||||||
|
|
||||||
|
bool update_{true};
|
||||||
|
|
||||||
|
byte REG_I_ON[16] = {REG_I_ON_0, REG_I_ON_1, REG_I_ON_2, REG_I_ON_3,
|
||||||
|
REG_I_ON_4, REG_I_ON_5, REG_I_ON_6, REG_I_ON_7,
|
||||||
|
REG_I_ON_8, REG_I_ON_9, REG_I_ON_10, REG_I_ON_11,
|
||||||
|
REG_I_ON_12, REG_I_ON_13, REG_I_ON_14, REG_I_ON_15};
|
||||||
|
|
||||||
|
byte REG_T_ON[16] = {REG_T_ON_0, REG_T_ON_1, REG_T_ON_2, REG_T_ON_3,
|
||||||
|
REG_T_ON_4, REG_T_ON_5, REG_T_ON_6, REG_T_ON_7,
|
||||||
|
REG_T_ON_8, REG_T_ON_9, REG_T_ON_10, REG_T_ON_11,
|
||||||
|
REG_T_ON_12, REG_T_ON_13, REG_T_ON_14, REG_T_ON_15};
|
||||||
|
|
||||||
|
byte REG_OFF[16] = {REG_OFF_0, REG_OFF_1, REG_OFF_2, REG_OFF_3,
|
||||||
|
REG_OFF_4, REG_OFF_5, REG_OFF_6, REG_OFF_7,
|
||||||
|
REG_OFF_8, REG_OFF_9, REG_OFF_10, REG_OFF_11,
|
||||||
|
REG_OFF_12, REG_OFF_13, REG_OFF_14, REG_OFF_15};
|
||||||
|
|
||||||
|
byte REG_T_RISE[16] = {
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
REG_T_RISE_4, REG_T_RISE_5, REG_T_RISE_6, REG_T_RISE_7,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
REG_T_RISE_12, REG_T_RISE_13, REG_T_RISE_14, REG_T_RISE_15};
|
||||||
|
|
||||||
|
byte REG_T_FALL[16] = {
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
REG_T_FALL_4, REG_T_FALL_5, REG_T_FALL_6, REG_T_FALL_7,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
REG_T_FALL_12, REG_T_FALL_13, REG_T_FALL_14, REG_T_FALL_15};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sx1509
|
||||||
|
} // namespace esphome
|
138
esphome/components/sx1509/sx1509_registers.h
Normal file
138
esphome/components/sx1509/sx1509_registers.h
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
/******************************************************************************
|
||||||
|
sx1509_registers.h
|
||||||
|
Register definitions for SX1509.
|
||||||
|
Jim Lindblom @ SparkFun Electronics
|
||||||
|
Original Creation Date: September 21, 2015
|
||||||
|
https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library
|
||||||
|
|
||||||
|
Here you'll find the Arduino code used to interface with the SX1509 I2C
|
||||||
|
16 I/O expander. There are functions to take advantage of everything the
|
||||||
|
SX1509 provides - input/output setting, writing pins high/low, reading
|
||||||
|
the input value of pins, LED driver utilities (blink, breath, pwm), and
|
||||||
|
keypad engine utilites.
|
||||||
|
|
||||||
|
Development environment specifics:
|
||||||
|
IDE: Arduino 1.6.5
|
||||||
|
Hardware Platform: Arduino Uno
|
||||||
|
SX1509 Breakout Version: v2.0
|
||||||
|
|
||||||
|
This code is beerware; if you see me (or any other SparkFun employee) at the
|
||||||
|
local, and you've found our code helpful, please buy us a round!
|
||||||
|
|
||||||
|
Distributed as-is; no warranty is given.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#define REG_INPUT_DISABLE_B 0x00 // RegInputDisableB Input buffer disable register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_INPUT_DISABLE_A 0x01 // RegInputDisableA Input buffer disable register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_LONG_SLEW_B 0x02 // RegLongSlewB Output buffer long slew register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_LONG_SLEW_A 0x03 // RegLongSlewA Output buffer long slew register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_LOW_DRIVE_B 0x04 // RegLowDriveB Output buffer low drive register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_LOW_DRIVE_A 0x05 // RegLowDriveA Output buffer low drive register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_PULL_UP_B 0x06 // RegPullUpB Pull_up register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_PULL_UP_A 0x07 // RegPullUpA Pull_up register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_PULL_DOWN_B 0x08 // RegPullDownB Pull_down register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_PULL_DOWN_A 0x09 // RegPullDownA Pull_down register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_OPEN_DRAIN_B 0x0A // RegOpenDrainB Open drain register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_OPEN_DRAIN_A 0x0B // RegOpenDrainA Open drain register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_POLARITY_B 0x0C // RegPolarityB Polarity register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_POLARITY_A 0x0D // RegPolarityA Polarity register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_DIR_B 0x0E // RegDirB Direction register _ I/O[15_8] (Bank B) 1111 1111
|
||||||
|
#define REG_DIR_A 0x0F // RegDirA Direction register _ I/O[7_0] (Bank A) 1111 1111
|
||||||
|
#define REG_DATA_B 0x10 // RegDataB Data register _ I/O[15_8] (Bank B) 1111 1111*
|
||||||
|
#define REG_DATA_A 0x11 // RegDataA Data register _ I/O[7_0] (Bank A) 1111 1111*
|
||||||
|
#define REG_INTERRUPT_MASK_B 0x12 // RegInterruptMaskB Interrupt mask register _ I/O[15_8] (Bank B) 1111 1111
|
||||||
|
#define REG_INTERRUPT_MASK_A 0x13 // RegInterruptMaskA Interrupt mask register _ I/O[7_0] (Bank A) 1111 1111
|
||||||
|
#define REG_SENSE_HIGH_B 0x14 // RegSenseHighB Sense register for I/O[15:12] 0000 0000
|
||||||
|
#define REG_SENSE_LOW_B 0x15 // RegSenseLowB Sense register for I/O[11:8] 0000 0000
|
||||||
|
#define REG_SENSE_HIGH_A 0x16 // RegSenseHighA Sense register for I/O[7:4] 0000 0000
|
||||||
|
#define REG_SENSE_LOW_A 0x17 // RegSenseLowA Sense register for I/O[3:0] 0000 0000
|
||||||
|
#define REG_INTERRUPT_SOURCE_B 0x18 // RegInterruptSourceB Interrupt source register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_INTERRUPT_SOURCE_A 0x19 // RegInterruptSourceA Interrupt source register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_EVENT_STATUS_B 0x1A // RegEventStatusB Event status register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_EVENT_STATUS_A 0x1B // RegEventStatusA Event status register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_LEVEL_SHIFTER_1 0x1C // RegLevelShifter1 Level shifter register 0000 0000
|
||||||
|
#define REG_LEVEL_SHIFTER_2 0x1D // RegLevelShifter2 Level shifter register 0000 0000
|
||||||
|
#define REG_CLOCK 0x1E // RegClock Clock management register 0000 0000
|
||||||
|
#define REG_MISC 0x1F // RegMisc Miscellaneous device settings register 0000 0000
|
||||||
|
#define REG_LED_DRIVER_ENABLE_B 0x20 // RegLEDDriverEnableB LED driver enable register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_LED_DRIVER_ENABLE_A 0x21 // RegLEDDriverEnableA LED driver enable register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
// Debounce and Keypad Engine
|
||||||
|
#define REG_DEBOUNCE_CONFIG 0x22 // RegDebounceConfig Debounce configuration register 0000 0000
|
||||||
|
#define REG_DEBOUNCE_ENABLE_B 0x23 // RegDebounceEnableB Debounce enable register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_DEBOUNCE_ENABLE_A 0x24 // RegDebounceEnableA Debounce enable register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
#define REG_KEY_CONFIG_1 0x25 // RegKeyConfig1 Key scan configuration register 0000 0000
|
||||||
|
#define REG_KEY_CONFIG_2 0x26 // RegKeyConfig2 Key scan configuration register 0000 0000
|
||||||
|
#define REG_KEY_DATA_1 0x27 // RegKeyData1 Key value (column) 1111 1111
|
||||||
|
#define REG_KEY_DATA_2 0x28 // RegKeyData2 Key value (row) 1111 1111
|
||||||
|
// LED Driver (PWM, blinking, breathing)
|
||||||
|
#define REG_T_ON_0 0x29 // RegTOn0 ON time register for I/O[0] 0000 0000
|
||||||
|
#define REG_I_ON_0 0x2A // RegIOn0 ON intensity register for I/O[0] 1111 1111
|
||||||
|
#define REG_OFF_0 0x2B // RegOff0 OFF time/intensity register for I/O[0] 0000 0000
|
||||||
|
#define REG_T_ON_1 0x2C // RegTOn1 ON time register for I/O[1] 0000 0000
|
||||||
|
#define REG_I_ON_1 0x2D // RegIOn1 ON intensity register for I/O[1] 1111 1111
|
||||||
|
#define REG_OFF_1 0x2E // RegOff1 OFF time/intensity register for I/O[1] 0000 0000
|
||||||
|
#define REG_T_ON_2 0x2F // RegTOn2 ON time register for I/O[2] 0000 0000
|
||||||
|
#define REG_I_ON_2 0x30 // RegIOn2 ON intensity register for I/O[2] 1111 1111
|
||||||
|
#define REG_OFF_2 0x31 // RegOff2 OFF time/intensity register for I/O[2] 0000 0000
|
||||||
|
#define REG_T_ON_3 0x32 // RegTOn3 ON time register for I/O[3] 0000 0000
|
||||||
|
#define REG_I_ON_3 0x33 // RegIOn3 ON intensity register for I/O[3] 1111 1111
|
||||||
|
#define REG_OFF_3 0x34 // RegOff3 OFF time/intensity register for I/O[3] 0000 0000
|
||||||
|
#define REG_T_ON_4 0x35 // RegTOn4 ON time register for I/O[4] 0000 0000
|
||||||
|
#define REG_I_ON_4 0x36 // RegIOn4 ON intensity register for I/O[4] 1111 1111
|
||||||
|
#define REG_OFF_4 0x37 // RegOff4 OFF time/intensity register for I/O[4] 0000 0000
|
||||||
|
#define REG_T_RISE_4 0x38 // RegTRise4 Fade in register for I/O[4] 0000 0000
|
||||||
|
#define REG_T_FALL_4 0x39 // RegTFall4 Fade out register for I/O[4] 0000 0000
|
||||||
|
#define REG_T_ON_5 0x3A // RegTOn5 ON time register for I/O[5] 0000 0000
|
||||||
|
#define REG_I_ON_5 0x3B // RegIOn5 ON intensity register for I/O[5] 1111 1111
|
||||||
|
#define REG_OFF_5 0x3C // RegOff5 OFF time/intensity register for I/O[5] 0000 0000
|
||||||
|
#define REG_T_RISE_5 0x3D // RegTRise5 Fade in register for I/O[5] 0000 0000
|
||||||
|
#define REG_T_FALL_5 0x3E // RegTFall5 Fade out register for I/O[5] 0000 0000
|
||||||
|
#define REG_T_ON_6 0x3F // RegTOn6 ON time register for I/O[6] 0000 0000
|
||||||
|
#define REG_I_ON_6 0x40 // RegIOn6 ON intensity register for I/O[6] 1111 1111
|
||||||
|
#define REG_OFF_6 0x41 // RegOff6 OFF time/intensity register for I/O[6] 0000 0000
|
||||||
|
#define REG_T_RISE_6 0x42 // RegTRise6 Fade in register for I/O[6] 0000 0000
|
||||||
|
#define REG_T_FALL_6 0x43 // RegTFall6 Fade out register for I/O[6] 0000 0000
|
||||||
|
#define REG_T_ON_7 0x44 // RegTOn7 ON time register for I/O[7] 0000 0000
|
||||||
|
#define REG_I_ON_7 0x45 // RegIOn7 ON intensity register for I/O[7] 1111 1111
|
||||||
|
#define REG_OFF_7 0x46 // RegOff7 OFF time/intensity register for I/O[7] 0000 0000
|
||||||
|
#define REG_T_RISE_7 0x47 // RegTRise7 Fade in register for I/O[7] 0000 0000
|
||||||
|
#define REG_T_FALL_7 0x48 // RegTFall7 Fade out register for I/O[7] 0000 0000
|
||||||
|
#define REG_T_ON_8 0x49 // RegTOn8 ON time register for I/O[8] 0000 0000
|
||||||
|
#define REG_I_ON_8 0x4A // RegIOn8 ON intensity register for I/O[8] 1111 1111
|
||||||
|
#define REG_OFF_8 0x4B // RegOff8 OFF time/intensity register for I/O[8] 0000 0000
|
||||||
|
#define REG_T_ON_9 0x4C // RegTOn9 ON time register for I/O[9] 0000 0000
|
||||||
|
#define REG_I_ON_9 0x4D // RegIOn9 ON intensity register for I/O[9] 1111 1111
|
||||||
|
#define REG_OFF_9 0x4E // RegOff9 OFF time/intensity register for I/O[9] 0000 0000
|
||||||
|
#define REG_T_ON_10 0x4F // RegTOn10 ON time register for I/O[10] 0000 0000
|
||||||
|
#define REG_I_ON_10 0x50 // RegIOn10 ON intensity register for I/O[10] 1111 1111
|
||||||
|
#define REG_OFF_10 0x51 // RegOff10 OFF time/intensity register for I/O[10] 0000 0000
|
||||||
|
#define REG_T_ON_11 0x52 // RegTOn11 ON time register for I/O[11] 0000 0000
|
||||||
|
#define REG_I_ON_11 0x53 // RegIOn11 ON intensity register for I/O[11] 1111 1111
|
||||||
|
#define REG_OFF_11 0x54 // RegOff11 OFF time/intensity register for I/O[11] 0000 0000
|
||||||
|
#define REG_T_ON_12 0x55 // RegTOn12 ON time register for I/O[12] 0000 0000
|
||||||
|
#define REG_I_ON_12 0x56 // RegIOn12 ON intensity register for I/O[12] 1111 1111
|
||||||
|
#define REG_OFF_12 0x57 // RegOff12 OFF time/intensity register for I/O[12] 0000 0000
|
||||||
|
#define REG_T_RISE_12 0x58 // RegTRise12 Fade in register for I/O[12] 0000 0000
|
||||||
|
#define REG_T_FALL_12 0x59 // RegTFall12 Fade out register for I/O[12] 0000 0000
|
||||||
|
#define REG_T_ON_13 0x5A // RegTOn13 ON time register for I/O[13] 0000 0000
|
||||||
|
#define REG_I_ON_13 0x5B // RegIOn13 ON intensity register for I/O[13] 1111 1111
|
||||||
|
#define REG_OFF_13 0x5C // RegOff13 OFF time/intensity register for I/O[13] 0000 0000
|
||||||
|
#define REG_T_RISE_13 0x5D // RegTRise13 Fade in register for I/O[13] 0000 0000
|
||||||
|
#define REG_T_FALL_13 0x5E // RegTFall13 Fade out register for I/O[13] 0000 0000
|
||||||
|
#define REG_T_ON_14 0x5F // RegTOn14 ON time register for I/O[14] 0000 0000
|
||||||
|
#define REG_I_ON_14 0x60 // RegIOn14 ON intensity register for I/O[14] 1111 1111
|
||||||
|
#define REG_OFF_14 0x61 // RegOff14 OFF time/intensity register for I/O[14] 0000 0000
|
||||||
|
#define REG_T_RISE_14 0x62 // RegTRise14 Fade in register for I/O[14] 0000 0000
|
||||||
|
#define REG_T_FALL_14 0x63 // RegTFall14 Fade out register for I/O[14] 0000 0000
|
||||||
|
#define REG_T_ON_15 0x64 // RegTOn15 ON time register for I/O[15] 0000 0000
|
||||||
|
#define REG_I_ON_15 0x65 // RegIOn15 ON intensity register for I/O[15] 1111 1111
|
||||||
|
#define REG_OFF_15 0x66 // RegOff15 OFF time/intensity register for I/O[15] 0000 0000
|
||||||
|
#define REG_T_RISE_15 0x67 // RegTRise15 Fade in register for I/O[15] 0000 0000
|
||||||
|
#define REG_T_FALL_15 0x68 // RegTFall15 Fade out register for I/O[15] 0000 0000
|
||||||
|
// Miscellaneous
|
||||||
|
#define REG_HIGH_INPUT_B 0x69 // RegHighInputB High input enable register _ I/O[15_8] (Bank B) 0000 0000
|
||||||
|
#define REG_HIGH_INPUT_A 0x6A // RegHighInputA High input enable register _ I/O[7_0] (Bank A) 0000 0000
|
||||||
|
// Software Reset
|
||||||
|
#define REG_RESET 0x7D // RegReset Software reset register 0000 0000
|
||||||
|
#define REG_TEST_1 0x7E // RegTest1 Test register 0000 0000
|
||||||
|
#define REG_TEST_2 0x7F // RegTest2 Test register 0000 0000
|
Loading…
Reference in a new issue