20 #ifndef SOFT_I2C_MASTER_H
21 #define SOFT_I2C_MASTER_H
30 #if defined(__AVR__) || defined(DOXYGEN) // AVR only
32 #include <util/delay_basic.h>
75 virtual uint8_t
read(uint8_t last) = 0;
82 virtual void start() = 0;
88 virtual void stop() = 0;
90 bool transfer(uint8_t addressRW,
void *buf,
91 size_t nbyte, uint8_t option =
I2C_STOP);
101 virtual bool write(uint8_t data) = 0;
115 void begin(uint8_t sclPin, uint8_t sdaPin);
116 uint8_t
read(uint8_t last);
119 bool write(uint8_t b);
124 volatile uint8_t* _sclDDR;
125 volatile uint8_t* _sdaDDR;
126 volatile uint8_t* _sdaInReg;
128 bool readSda() {
return *_sdaInReg & _sdaBit;}
130 void sclDelay(uint8_t n) {_delay_loop_1(n);}
132 void writeScl(
bool value) {
140 *_sclDDR &= ~_sclBit;
145 void writeSda(
bool value) {
153 *_sdaDDR &= ~_sdaBit;
165 template<u
int8_t sclPin, u
int8_t sdaPin>
252 inline __attribute__((always_inline))
253 void sclWrite(
bool value) {
fastDdrWrite(sclPin, !value);}
255 inline __attribute__((always_inline))
256 void sdaWrite(
bool value) {
fastDdrWrite(sdaPin, !value);}
258 inline __attribute__((always_inline))
259 void readBit(uint8_t bit, uint8_t* data) {
264 if (bit) sclDelay(6);
267 void sclDelay(uint8_t n) {_delay_loop_1(n);}
269 inline __attribute__((always_inline))
270 void writeBit(uint8_t bit, uint8_t data) {
271 uint8_t mask = 1 << bit;
272 sdaWrite(data & mask);
280 #endif // SOFT_I2C_MASTER_H
AVR Software I2C master class.
AVR Fast software I2C master class.
virtual uint8_t read(uint8_t last)=0
bool transfer(uint8_t addressRW, void *buf, size_t nbyte, uint8_t option=I2C_STOP)
const uint8_t STATE_TX_DATA_NACK
uint8_t read(uint8_t last)
uint8_t read(uint8_t last)
Base class for FastI2cMaster, SoftI2cMaster.
const uint8_t STATE_TX_ADDR_NACK
const uint8_t STATE_RX_DATA
static void fastDigitalWrite(uint8_t pin, bool level)
static bool fastDigitalRead(uint8_t pin)
const uint8_t STATE_REP_START
Fast Digital Pin functions.
static void fastDdrWrite(uint8_t pin, bool level)
bool transferContinue(void *buf, size_t nbyte, uint8_t option=I2C_STOP)
const uint8_t STATE_TX_DATA
void begin(uint8_t sclPin, uint8_t sdaPin)
Two Wire Interface constants.
virtual bool write(uint8_t data)=0
const uint8_t STATE_RX_ADDR_NACK