77 lines
1.8 KiB
C++
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);
|
|
|
|
//
|
|
|
|
|
|
}
|
|
|
|
} |