ESPHome
2026.5.0b1
Loading...
Searching...
No Matches
esphome
components
mcp23s17
mcp23s17.cpp
Go to the documentation of this file.
1
#include "
mcp23s17.h
"
2
#include "
esphome/core/log.h
"
3
4
namespace
esphome::mcp23s17
{
5
6
static
const
char
*
const
TAG =
"mcp23s17"
;
7
8
// IOCON register bits
9
static
constexpr
uint8_t IOCON_SEQOP = 0x20;
// Sequential operation mode
10
static
constexpr
uint8_t IOCON_MIRROR = 0x40;
// Mirror INTA/INTB pins
11
static
constexpr
uint8_t IOCON_HAEN = 0x08;
// Hardware address enable
12
static
constexpr
uint8_t IOCON_ODR = 0x04;
// Open-drain output for INT pin
13
14
void
MCP23S17::set_device_address
(uint8_t device_addr) {
15
if
(device_addr != 0) {
16
this->
device_opcode_
|= ((device_addr & 0b111) << 1);
17
}
18
}
19
20
void
MCP23S17::setup
() {
21
this->
spi_setup
();
22
23
// Enable HAEN (broadcast to addresses 0 and 4 since HAEN isn't active yet)
24
this->
enable
();
25
this->
transfer_byte
(0b01000000);
26
this->
transfer_byte
(
mcp23x17_base::MCP23X17_IOCONA
);
27
this->
transfer_byte
(IOCON_SEQOP | IOCON_HAEN);
28
this->
disable
();
29
30
this->
enable
();
31
this->
transfer_byte
(0b01001000);
32
this->
transfer_byte
(
mcp23x17_base::MCP23X17_IOCONA
);
33
this->
transfer_byte
(IOCON_SEQOP | IOCON_HAEN);
34
this->
disable
();
35
36
// Read current output register state
37
this->
read_reg
(
mcp23x17_base::MCP23X17_OLATA
, &this->
olat_a_
);
38
this->
read_reg
(
mcp23x17_base::MCP23X17_OLATB
, &this->
olat_b_
);
39
40
uint8_t iocon_flags = IOCON_SEQOP | IOCON_HAEN;
41
if
(this->
open_drain_ints_
) {
42
iocon_flags |= IOCON_ODR;
43
}
44
if
(this->
interrupt_pin_
!=
nullptr
) {
45
// Mirror INTA/INTB so either pin fires for changes on any port
46
iocon_flags |= IOCON_MIRROR;
47
}
48
if
(this->
open_drain_ints_
|| this->
interrupt_pin_
!=
nullptr
) {
49
this->
write_reg
(
mcp23x17_base::MCP23X17_IOCONA
, iocon_flags);
50
this->
write_reg
(
mcp23x17_base::MCP23X17_IOCONB
, iocon_flags);
51
}
52
53
this->
setup_interrupt_pin_
();
54
}
55
56
void
MCP23S17::dump_config
() {
57
ESP_LOGCONFIG(TAG,
"MCP23S17:"
);
58
LOG_PIN(
" CS Pin: "
, this->
cs_
);
59
LOG_PIN(
" Interrupt Pin: "
, this->
interrupt_pin_
);
60
}
61
62
bool
MCP23S17::read_reg
(uint8_t reg, uint8_t *value) {
63
this->
enable
();
64
this->
transfer_byte
(this->
device_opcode_
| 1);
65
this->
transfer_byte
(reg);
66
*value = this->
transfer_byte
(0xFF);
67
this->
disable
();
68
return
true
;
69
}
70
71
bool
MCP23S17::write_reg
(uint8_t reg, uint8_t value) {
72
this->
enable
();
73
this->
transfer_byte
(this->
device_opcode_
);
74
this->
transfer_byte
(reg);
75
this->
transfer_byte
(value);
76
77
this->
disable
();
78
return
true
;
79
}
80
81
}
// namespace esphome::mcp23s17
esphome::mcp23s17::MCP23S17::dump_config
void dump_config() override
Definition
mcp23s17.cpp:56
esphome::mcp23s17::MCP23S17::device_opcode_
uint8_t device_opcode_
Definition
mcp23s17.h:24
esphome::mcp23s17::MCP23S17::set_device_address
void set_device_address(uint8_t device_addr)
Definition
mcp23s17.cpp:14
esphome::mcp23s17::MCP23S17::read_reg
bool read_reg(uint8_t reg, uint8_t *value) override
Definition
mcp23s17.cpp:62
esphome::mcp23s17::MCP23S17::setup
void setup() override
Definition
mcp23s17.cpp:20
esphome::mcp23s17::MCP23S17::write_reg
bool write_reg(uint8_t reg, uint8_t value) override
Definition
mcp23s17.cpp:71
esphome::mcp23x17_base::MCP23X17Base::olat_b_
uint8_t olat_b_
Definition
mcp23x17_base.h:49
esphome::mcp23x17_base::MCP23X17Base::olat_a_
uint8_t olat_a_
Definition
mcp23x17_base.h:48
esphome::mcp23xxx_base::MCP23XXXBase< 16 >::setup_interrupt_pin_
void setup_interrupt_pin_()
Definition
mcp23xxx_base.h:35
esphome::mcp23xxx_base::MCP23XXXBase< 16 >::open_drain_ints_
bool open_drain_ints_
Definition
mcp23xxx_base.h:55
esphome::mcp23xxx_base::MCP23XXXBase< 16 >::interrupt_pin_
InternalGPIOPin * interrupt_pin_
Definition
mcp23xxx_base.h:56
esphome::spi::SPIClient::cs_
GPIOPin * cs_
Definition
spi.h:414
esphome::spi::SPIDevice< spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_8MHZ >::enable
void enable()
Definition
spi.h:501
esphome::spi::SPIDevice< spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_8MHZ >::spi_setup
void spi_setup() override
Definition
spi.h:438
esphome::spi::SPIDevice< spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_8MHZ >::disable
void disable()
Definition
spi.h:503
esphome::spi::SPIDevice< spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_8MHZ >::transfer_byte
uint8_t transfer_byte(uint8_t data)
Definition
spi.h:487
log.h
mcp23s17.h
esphome::mcp23s17
Definition
mcp23s17.cpp:4
esphome::mcp23x17_base::MCP23X17_IOCONA
@ MCP23X17_IOCONA
Definition
mcp23x17_base.h:16
esphome::mcp23x17_base::MCP23X17_OLATB
@ MCP23X17_OLATB
Definition
mcp23x17_base.h:33
esphome::mcp23x17_base::MCP23X17_IOCONB
@ MCP23X17_IOCONB
Definition
mcp23x17_base.h:28
esphome::mcp23x17_base::MCP23X17_OLATA
@ MCP23X17_OLATA
Definition
mcp23x17_base.h:21
Generated by
1.12.0