From 3e3144ab84b14191e0b61848d4928765d6049137 Mon Sep 17 00:00:00 2001 From: Nidan Date: Fri, 10 Dec 2010 21:57:08 +0000 Subject: [PATCH] implemented i2c_read_write --- firmware/slavechip/i2c_simple.c | 12 +++++++++--- firmware/slavechip/i2c_simple.h | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/firmware/slavechip/i2c_simple.c b/firmware/slavechip/i2c_simple.c index 8c5772e..9b3f795 100644 --- a/firmware/slavechip/i2c_simple.c +++ b/firmware/slavechip/i2c_simple.c @@ -55,7 +55,7 @@ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data) return done; } -uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data) +uint8_t i2c_write_i(uint8_t addr, uint8_t len, uint8_t *data, uint8_t stop) { TWCR &= ~TWSTO; TWCR |= TWINT | TWSTA; @@ -90,11 +90,17 @@ uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data) done++; } - TWCR |= TWINT | TWSTO; + if(stop) {TWCR |= TWINT | TWSTO;} return done; } +inline uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data) +{ + return i2c_write(addr, len, data, 1); +} + uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata) { - return 0; //TODO: implement + if(writelen == i2c_write_i(addr, writelen, writedata, 0)) {return i2c_read(addr, readlen, readdata);} + return 0; } diff --git a/firmware/slavechip/i2c_simple.h b/firmware/slavechip/i2c_simple.h index 2e76444..2f05186 100644 --- a/firmware/slavechip/i2c_simple.h +++ b/firmware/slavechip/i2c_simple.h @@ -5,9 +5,11 @@ void i2c_init(); /* reads len bytes from the i2c device addr into data */ +/* returns the number of bytes read */ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data); /* writes to an i2c device */ +/* returns the number of bytes written. if abitration was lost within a byte or it was followed by a NAK that byte is NOT counted */ uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data); /* writes, followed by a repeated start and a read */