Правильно ли я реализовал I2C master на atmega328? Просто код ниже не работает нормально, а программная реализация I2C. Хочу понять я недокурил даташит или у моей atmega нерабочий программный модуль I2C (я уже много экспериментов ставил, вдруг чего спалил).
Раздел: AVR
void i2c_init(unsigned char pullups) {
DDRC &= ~(_BV(5) | _BV(4));
if (pullups) {
PORTC |= _BV(5) | _BV(4);
} else {
PORTC &= ~(_BV(5) | _BV(4));
}
TWBR = (F_CPU / I2C_FREQ - 16) / 2;
TWSR &= ~(_BV(TWPS1) | _BV(TWPS0));
}
void i2c_start() {
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
while (!(TWCR & _BV(TWINT)));
TWCR &= ~_BV(TWSTA);
}
void i2c_stop() {
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
while (TWCR & _BV(TWSTO));
}
void i2c_write(unsigned char value) {
TWDR = value;
TWCR = _BV(TWEN) | _BV(TWINT);
while (!(TWCR & _BV(TWINT)));
}
unsigned char i2c_read() {
TWCR = _BV(TWEN) | _BV(TWINT);
while (!(TWCR & _BV(TWINT)));
return TWDR;
}
Раздел: AVR