This repository has been archived on 2025-01-09. You can view files and clone it, but cannot push or open issues or pull requests.
pig-feeder/lib/utils/TWI.cpp

77 lines
1.8 KiB
C++

#include "TWI.h"
namespace TWI {
BusState startMessage(Address addr) {
TWCR = (1 << TWSTA) | (1 << TWEN) | (1 << TWINT);
wait();
uint8_t status = sendByte(addr);
if (status == 0x18 || status == 0x40) return TWI_OK;
else return status;
}
void close() {
TWCR = (1 << TWSTO) | (1 << TWEN) | (1 << TWINT);
}
BusState sendByte(uint8_t byte) {
TWDR = byte;
TWCR = (1 << TWEN) | (1 << TWINT);
wait();
uint8_t status = (TWSR & 0xF8);
if (status != 0x28 && status != 0x30) return status;
else return TWI_OK;
}
void wait() {
while (!(TWCR & (1 << TWINT)));
}
BusState nack() {
TWCR = (1 << TWEN) | (1 << TWINT);
wait();
uint8_t status = (TWSR & 0xF8);
if (status != 0x50 && status != 0x58) return status;
else return TWI_OK;
}
BusState ack() {
TWCR = (1 << TWEN) | (1 << TWINT) | (1 << TWEA);
wait();
uint8_t status = (TWSR & 0xF8);
if (status != 0x50 && status != 0x58) return status;
else return TWI_OK;
}
uint8_t readByte() {
return TWDR;
}
void init(uint32_t busSpeed) {
// TWSR = ~(1 << TWPS0);
// TWSR = ~(1 << TWPS1);
TWBR = ((F_CPU / busSpeed - 16) / (2 * 4));
/*
// initialize twi prescaler and bit rate
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;*/
/* twi bit rate formula from atmega128 manual pg 204
SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
note: TWBR should be 10 or higher for master mode
It is 72 for a 16mhz Wiring board with 100kHz TWI */
// enable twi module, acks, and twi interrupt
TWCR = _BV(TWEN) | _BV(TWEA); //| _BV(TWIE);
//
}
}