tone-generator/soft_twi.cpp

57 lines
1.0 KiB
C++

#include "soft_twi.hpp"
#include <Arduino.h>
void SoftTWI::set_pin(uint8_t pin, bool state) {
uint8_t bitmask = digitalPinToBitMask(pin);
volatile uint8_t& reg = *portModeRegister(digitalPinToPort(pin));
if(state) {
reg &= ~bitmask;
} else {
reg |= bitmask;
}
}
void SoftTWI::begin() {
digitalWrite(_sda, 0);
digitalWrite(_scl, 0);
}
bool SoftTWI::read_pin(uint8_t pin) {
return digitalRead(pin);
}
uint8_t SoftTWI::read(bool ack) {
uint8_t v = 0;
for(unsigned m = 0x80; m; m >>= 1) {
if(read_bit()) {
v |= m;
}
}
write_bit(!ack); // send ACK
return v;
}
bool SoftTWI::write(uint8_t v) {
for(unsigned m = 0x80; m; m >>= 1) {
write_bit(v & m);
}
return !read_bit(); // get ACK
}
void SoftTWI::read(uint8_t* data, unsigned data_len, bool nack_at_end) {
for(unsigned i = 0; i < data_len; i++) {
data[i] = read(nack_at_end ? (i < data_len - 1) : true);
}
}
unsigned SoftTWI::write(const uint8_t* data, unsigned data_len) {
for(unsigned i = 0; i < data_len; i++) {
if(!write(data[i])) {
return i;
}
}
return data_len;
}