reworked/fixed i2c_simple with _BV's

master
Paul Goeser 15 years ago committed by Dario Ernst
parent acd9c72eac
commit 01470cf054

@ -5,33 +5,34 @@
#include "i2c_simple.h" #include "i2c_simple.h"
#define I2C_WAIT() while(!(TWCR & _BV(TWINT)))
void i2c_init() void i2c_init()
{ {
TWBR = 32;//bit rate TWBR = 32;//bit rate
TWSR = 0;//Prescaler TWSR = 0;//Prescaler
TWAR = 0x80;//our address 1000 000, don't listen to general call // TWAR = 0x80;//our address 1000 000, don't listen to general call
TWAMR = 0; // TWAMR = 0;
TWCR = TWEA | TWEN;/* TWINT clear -> we must do something; unset TWSTA manually!, TWSTO */ TWCR = _BV(TWEA) | _BV(TWEN);/* _BV(TWINT) clear -> we must do something; unset _BV(TWSTA) manually!, _BV(TWSTO) */
//TWDR - data //TWDR - data
} }
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data) uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data)
{ {
TWCR &= ~TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTA);
TWCR |= TWINT | TWSTA; I2C_WAIT();
while(~TWCR & TWINT) {;}/* get bus access */
/* no error possible */ /* no error possible */
TWDR = addr | 1; TWDR = addr | 1;
TWCR &= ~(TWSTA | TWSTO); TWCR &= ~(_BV(TWSTA));
TWCR |= TWINT; TWCR |= _BV(TWINT);
while(~TWCR & TWINT) {;}/* transmit address */ I2C_WAIT();
/* possible results: ACK, NAK, abitration lost */ /* possible results: ACK, NAK, abitration lost */
if(TW_STATUS == TW_MR_SLA_NACK) if(TW_STATUS == TW_MR_SLA_NACK)
{ {
TWCR |= TWINT | TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTO);
return 0; return 0;
} }
else if(TW_STATUS == TW_MR_ARB_LOST) {return 0;} else if(TW_STATUS == TW_MR_ARB_LOST) {return 0;}
@ -39,37 +40,36 @@ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data)
uint8_t done = 0; uint8_t done = 0;
while(done + 1 < len) while(done + 1 < len)
{ {
TWCR |= TWEA | TWINT;/* send ack after byte */ TWCR |= _BV(TWEA) | _BV(TWINT);/* send ack after byte */
while(~TWCR & TWINT) {;}/* read data */ I2C_WAIT();
data[done] = TWDR; data[done] = TWDR;
done++; done++;
TWCR |= TWINT; TWCR |= _BV(TWINT);
} }
TWCR &= ~TWEA; TWCR &= ~_BV(TWEA);
TWCR |= TWINT;/* send nak after byte */ TWCR |= _BV(TWINT);/* send nak after byte */
while(~TWCR & TWINT) {;}/* read data */ I2C_WAIT();
data[done] = TWDR; data[done] = TWDR;
done++; done++;
TWCR |= TWINT | TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTO);
return done; return done;
} }
uint8_t i2c_write_i(uint8_t addr, uint8_t len, uint8_t *data, uint8_t stop) uint8_t i2c_write_i(uint8_t addr, uint8_t len, uint8_t *data, uint8_t stop)
{ {
TWCR &= ~TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTA);
TWCR |= TWINT | TWSTA; I2C_WAIT();
while(~TWCR & TWINT) {;}/* get bus access */
/* no error possible */ /* no error possible */
TWDR = addr; TWDR = addr;
TWCR &= ~(TWSTA | TWSTO); TWCR &= ~(_BV(TWSTA));
TWCR |= TWINT; TWCR |= _BV(TWINT);
while(~TWCR & TWINT) {;}/* transmit address */ I2C_WAIT();
/* possible results: ACK, NAK, abitration lost */ /* possible results: ACK, NAK, abitration lost */
if(TW_STATUS == TW_MT_SLA_NACK) if(TW_STATUS == TW_MT_SLA_NACK)
{ {
TWCR |= TWINT | TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTO);
return 0; return 0;
} }
else if(TW_STATUS == TW_MT_ARB_LOST) {return 0;} else if(TW_STATUS == TW_MT_ARB_LOST) {return 0;}
@ -78,19 +78,19 @@ uint8_t i2c_write_i(uint8_t addr, uint8_t len, uint8_t *data, uint8_t stop)
while(done < len) while(done < len)
{ {
TWDR = data[done]; TWDR = data[done];
TWCR |= TWINT; TWCR |= _BV(TWINT);
while(~TWCR & TWINT) {;}/* write data */ I2C_WAIT();
/* possible results: ACK, NAK, abitration lost */ /* possible results: ACK, NAK, abitration lost */
if(TW_STATUS == TW_MT_DATA_NACK) if(TW_STATUS == TW_MT_DATA_NACK)
{ {
TWCR |= TWINT | TWSTO; TWCR |= _BV(TWINT) | _BV(TWSTO);
return done; return done;
} }
else if(TW_STATUS == TW_MT_ARB_LOST) {return done;} else if(TW_STATUS == TW_MT_ARB_LOST) {return done;}
done++; done++;
} }
if(stop) {TWCR |= TWINT | TWSTO;} if(stop) {TWCR |= _BV(TWINT) | _BV(TWSTO);}
return done; return done;
} }

Loading…
Cancel
Save