libDaisy
Hardware Library for Daisy
Loading...
Searching...
No Matches
tca9534.h
Go to the documentation of this file.
1#pragma once
2#ifndef DSY_TCA9534_H
3#define DSY_TCA9534_H
4
5#include "per/gpio.h"
6#include "per/i2c.h"
7
8namespace daisy
9{
21enum class Tca9534Register : uint8_t
22{
23 INPUT = 0x00,
24 OUTPUT = 0x01,
25 POLARITY = 0x02,
26 CONFIG = 0x03,
27};
28
30enum class Tca9534Mode : uint8_t
31{
32 INPUT,
33 OUTPUT,
34};
35
59{
60 public:
61 struct Config
62 {
64 uint8_t i2c_address;
65
66 void Defaults()
67 {
73 // TCA9534 default (A2/A1/A0 = 000). Do not left-shift: libDaisy
74 // Read/WriteDataAtAddress expect the 7-bit address.
75 i2c_address = 0x20;
76 }
77 };
78
80 : i2c_(nullptr),
81 address_(0x20),
82 output_state_(0x00),
83 config_(0xFF),
84 last_ok_(false),
85 owns_i2c_(false)
86 {
87 }
88
90 void Init()
91 {
92 Config cfg;
93 cfg.Defaults();
94 Init(cfg);
95 }
96
98 void Init(const Config& config)
99 {
100 address_ = config.i2c_address;
101 owns_i2c_ = true;
102 owned_i2c_.Init(config.i2c_config);
103 i2c_ = &owned_i2c_;
104 // Datasheet power-on: all pins inputs (0xFF), outputs low.
105 config_ = 0xFF;
106 output_state_ = 0x00;
107 WriteReg(Tca9534Register::CONFIG, config_);
108 WriteReg(Tca9534Register::OUTPUT, output_state_);
109 }
110
115 void Init(I2CHandle& i2c, uint8_t address = 0x20)
116 {
117 i2c_ = &i2c;
118 address_ = address;
119 owns_i2c_ = false;
120 config_ = 0xFF;
121 output_state_ = 0x00;
122 }
123
125 bool SetConfig(uint8_t config)
126 {
127 config_ = config;
128 return WriteReg(Tca9534Register::CONFIG, config_);
129 }
130
131 bool SetOutputState(uint8_t output)
132 {
133 output_state_ = output;
134 return WriteReg(Tca9534Register::OUTPUT, output_state_);
135 }
136
137 bool PinMode(uint8_t pin, Tca9534Mode mode)
138 {
139 if(pin > 7)
140 return false;
141 if(mode == Tca9534Mode::INPUT)
142 config_ |= static_cast<uint8_t>(1u << pin);
143 else
144 config_ &= static_cast<uint8_t>(~(1u << pin));
145 return WriteReg(Tca9534Register::CONFIG, config_);
146 }
147
148 bool WritePin(uint8_t pin, bool high)
149 {
150 if(pin > 7)
151 return false;
152 if(high)
153 output_state_ |= static_cast<uint8_t>(1u << pin);
154 else
155 output_state_ &= static_cast<uint8_t>(~(1u << pin));
156 return WriteReg(Tca9534Register::OUTPUT, output_state_);
157 }
158
159 bool ReadInput(uint8_t& value)
160 {
161 last_ok_ = ReadReg(Tca9534Register::INPUT, value);
162 return last_ok_;
163 }
164
165 bool ReadPin(uint8_t pin, bool& high)
166 {
167 uint8_t value = 0;
168 if(!ReadInput(value) || pin > 7)
169 return false;
170 high = (value & static_cast<uint8_t>(1u << pin)) != 0;
171 return true;
172 }
173
174 bool LastTransferOk() const { return last_ok_; }
176 bool LastReadOk() const { return last_ok_; }
177
178 uint8_t OutputState() const { return output_state_; }
179 uint8_t ConfigRegister() const { return config_; }
180 uint8_t Address() const { return address_; }
181
182 private:
183 bool WriteReg(Tca9534Register reg, uint8_t value)
184 {
185 if(i2c_ == nullptr)
186 {
187 last_ok_ = false;
188 return false;
189 }
190 last_ok_ = i2c_->WriteDataAtAddress(
191 address_, static_cast<uint8_t>(reg), 1, &value, 1, 10)
193 return last_ok_;
194 }
195
196 bool ReadReg(Tca9534Register reg, uint8_t& value)
197 {
198 if(i2c_ == nullptr)
199 {
200 last_ok_ = false;
201 return false;
202 }
203 last_ok_ = i2c_->ReadDataAtAddress(
204 address_, static_cast<uint8_t>(reg), 1, &value, 1, 10)
206 return last_ok_;
207 }
208
209 I2CHandle* i2c_;
210 I2CHandle owned_i2c_;
211 uint8_t address_;
212 uint8_t output_state_;
213 uint8_t config_;
214 bool last_ok_;
215 bool owns_i2c_;
216};
217
220} // namespace daisy
221
222#endif // DSY_TCA9534_H
Definition i2c.h:26
Result ReadDataAtAddress(uint16_t address, uint16_t mem_address, uint16_t mem_address_size, uint8_t *data, uint16_t data_size, uint32_t timeout)
Result Init(const Config &config)
Result WriteDataAtAddress(uint16_t address, uint16_t mem_address, uint16_t mem_address_size, uint8_t *data, uint16_t data_size, uint32_t timeout)
Definition tca9534.h:59
void Init(const Config &config)
Definition tca9534.h:98
bool ReadPin(uint8_t pin, bool &high)
Definition tca9534.h:165
bool PinMode(uint8_t pin, Tca9534Mode mode)
Definition tca9534.h:137
bool ReadInput(uint8_t &value)
Definition tca9534.h:159
uint8_t OutputState() const
Definition tca9534.h:178
bool LastTransferOk() const
Definition tca9534.h:174
Tca9534()
Definition tca9534.h:79
void Init()
Definition tca9534.h:90
bool SetOutputState(uint8_t output)
Definition tca9534.h:131
uint8_t ConfigRegister() const
Definition tca9534.h:179
bool LastReadOk() const
Definition tca9534.h:176
bool WritePin(uint8_t pin, bool high)
Definition tca9534.h:148
uint8_t Address() const
Definition tca9534.h:180
void Init(I2CHandle &i2c, uint8_t address=0x20)
Definition tca9534.h:115
bool SetConfig(uint8_t config)
Definition tca9534.h:125
Tca9534Mode
Definition tca9534.h:31
Tca9534Register
Definition tca9534.h:22
Hardware defines and helpers for daisy field platform.
Definition index.h:2
@ PORTB
Definition daisy_core.h:178
Definition i2c.h:30
struct daisy::I2CHandle::Config::@15 pin_config
Mode mode
Definition i2c.h:65
Pin scl
Definition i2c.h:60
Speed speed
Definition i2c.h:64
Peripheral periph
Definition i2c.h:57
Pin sda
Definition i2c.h:61
representation of hardware port/pin combination
Definition daisy_core.h:193
Definition tca9534.h:62
void Defaults()
Definition tca9534.h:66
I2CHandle::Config i2c_config
Definition tca9534.h:63
uint8_t i2c_address
Definition tca9534.h:64