From ec5752b69ce25b0abb1bf4b8493b3e6078e41c1a Mon Sep 17 00:00:00 2001 From: Paul Goeser Date: Sat, 5 Feb 2011 00:50:37 +0100 Subject: [PATCH] i2c fixed --- firmware/slavechip/i2c_simple.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/firmware/slavechip/i2c_simple.c b/firmware/slavechip/i2c_simple.c index 4523863..571ea60 100644 --- a/firmware/slavechip/i2c_simple.c +++ b/firmware/slavechip/i2c_simple.c @@ -2,14 +2,30 @@ #include #include #include +#include #include "i2c_simple.h" +#include "debug.h" + +//#define I2C_WAIT() while(!(TWCR & _BV(TWINT))) +#define I2C_WAIT() i2c_wait(); + + +void inline i2c_wait(){ + uint16_t cntr=0; + while(!(TWCR & _BV(TWINT))){ + cntr++; + if(cntr >= 1000){ + dbgLog("i2c waittime exceeded!\n"); + } + } +} + -#define I2C_WAIT() while(!(TWCR & _BV(TWINT))) void i2c_init() { - TWBR = 32;//bit rate + TWBR = 32;//bit rate: 100kbit TWSR = 0;//Prescaler // TWAR = 0x80;//our address 1000 000, don't listen to general call @@ -53,6 +69,7 @@ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data) data[done] = TWDR; done++; TWCR |= _BV(TWINT) | _BV(TWSTO); + _delay_us(20); // wait about 2 bit periods return done; } @@ -91,6 +108,7 @@ uint8_t i2c_write_i(uint8_t addr, uint8_t len, uint8_t *data, uint8_t stop) } if(stop) {TWCR |= _BV(TWINT) | _BV(TWSTO);} + _delay_us(20); // wait about 2 bit periods return done; }