mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	added ANALOG_OUTPUT as first functionality
This commit is contained in:
		
							
								
								
									
										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 | ||||
		Reference in New Issue
	
	Block a user