#include <stdio.h>
#include "i2c.h"
#include "bmc.h"
+#include "config.h"
#include "ipmb.h"
#define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
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<<TWSTA) | (1<<TWSTO));
TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWSTO));
while(TWCR & (1<<TWSTO)) {}
- TWCR = (1<<TWINT) | (1<<TWEN);
out:
- TWCR = old_TWCR;
SREG = old_SREG;
+ TWCR = old_TWCR | (1<<TWINT);
}
ISR (TWI_vect, ISR_BLOCK)