X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/rsbs2/blobdiff_plain/453203717769c12e37678c93fcaf4150f2d16a39..989281f290d774ce78f71c8a420870987407a831:/bmc/i2c.c diff --git a/bmc/i2c.c b/bmc/i2c.c index f081991..bd4d69c 100644 --- a/bmc/i2c.c +++ b/bmc/i2c.c @@ -14,14 +14,24 @@ volatile uint8_t i2c_len = 0x00; static volatile uint8_t i2c_pos = 0x00; volatile uint8_t i2c_done = 0x00; +#define I2C_FREQ 20000UL + void i2c_init() { - TWBR = 0xff; + /* SCLf = F_CPU / (16 + 2 * TWBR * 4^TWPS) + * TWPS is 0 => + * TWBR = (F_CPU/(2 * SCL)) - 8 + */ + TWBR = (F_CPU/(2*I2C_FREQ))-8; TWAR = BMC_ADDR & 0xfe; TWDR = 0x00; TWCR &= ~((1<= sizeof(i2c_databuf)) { + TWCR_RESET; + i2c_pos = 0x00; + break; + } i2c_databuf[i2c_pos] = TWDR; i2c_pos++; TWCR_ACK; @@ -102,6 +129,13 @@ ISR (TWI_vect, ISR_BLOCK) TWCR_RESET; break; + case TW_NO_INFO: +#ifdef DEBUG + printf("I2C: TW_NO_INFO received status 0x%2x\n", TW_STATUS); +#endif + TWCR |= (1<