Update tca6408.h
This commit is contained in:
committed by
GitHub
parent
256e8cfb58
commit
1d57fba502
@@ -8,6 +8,16 @@
|
|||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace tca6408 {
|
namespace tca6408 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TCA6408 8-bit I²C I/O Expander Component
|
||||||
|
*
|
||||||
|
* Features:
|
||||||
|
* - 8 bidirectional GPIO pins (0-7)
|
||||||
|
* - Hardware polarity inversion (for inputs)
|
||||||
|
* - Interrupt support (active-low open-drain INT pin)
|
||||||
|
* - Cached GPIO access for efficiency
|
||||||
|
* - Works with ESP32 (including C5), ESP8266, etc.
|
||||||
|
*/
|
||||||
class TCA6408Component : public Component,
|
class TCA6408Component : public Component,
|
||||||
public i2c::I2CDevice,
|
public i2c::I2CDevice,
|
||||||
public gpio_expander::CachedGpioExpander<uint8_t, 8> {
|
public gpio_expander::CachedGpioExpander<uint8_t, 8> {
|
||||||
@@ -17,26 +27,32 @@ class TCA6408Component : public Component,
|
|||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
float get_setup_priority() const override { return setup_priority::IO; }
|
float get_setup_priority() const override { return setup_priority::IO; }
|
||||||
|
|
||||||
|
/** Set I²C address (default 0x20) */
|
||||||
void set_address(uint8_t address) { this->address_ = address; }
|
void set_address(uint8_t address) { this->address_ = address; }
|
||||||
|
|
||||||
|
/** Set ESP GPIO connected to TCA6408 INT pin (recommended) */
|
||||||
void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; }
|
void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; }
|
||||||
|
|
||||||
|
/** Set hardware polarity inversion for a specific pin (used internally) */
|
||||||
void set_polarity_inversion(uint8_t pin, bool inverted);
|
void set_polarity_inversion(uint8_t pin, bool inverted);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/** Interrupt Service Routine - lightweight, runs in ISR context */
|
||||||
static void IRAM_ATTR gpio_intr(TCA6408Component *arg);
|
static void IRAM_ATTR gpio_intr(TCA6408Component *arg);
|
||||||
|
|
||||||
|
// GPIO Expander overrides
|
||||||
bool digital_read_hw(uint8_t pin) override;
|
bool digital_read_hw(uint8_t pin) override;
|
||||||
bool digital_read_cache(uint8_t pin) override;
|
bool digital_read_cache(uint8_t pin) override;
|
||||||
void digital_write_hw(uint8_t pin, bool value) override;
|
void digital_write_hw(uint8_t pin, bool value) override;
|
||||||
void pin_mode(uint8_t pin, gpio::Flags flags) override;
|
void pin_mode(uint8_t pin, gpio::Flags flags) override;
|
||||||
|
|
||||||
uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output
|
uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output (Config Register 0x03)
|
||||||
uint8_t output_mask_{0x00};
|
uint8_t output_mask_{0x00}; // Output Port Register 0x01
|
||||||
uint8_t input_mask_{0x00};
|
uint8_t input_mask_{0x00}; // Input Port Register 0x00
|
||||||
uint8_t polarity_mask_{0x00}; // 1 = inverted (hardware polarity for inputs)
|
uint8_t polarity_mask_{0x00}; // Polarity Inversion Register 0x02 (1 = inverted)
|
||||||
|
|
||||||
InternalGPIOPin *interrupt_pin_{nullptr};
|
InternalGPIOPin *interrupt_pin_{nullptr}; // ESP pin connected to TCA6408 INT
|
||||||
bool interrupt_triggered_{false};
|
bool interrupt_triggered_{false}; // Flag set by ISR
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool read_gpio_outputs_();
|
bool read_gpio_outputs_();
|
||||||
|
|||||||
Reference in New Issue
Block a user