I've just started with the I2C protocol. I read about it in the datasheet, other documents, blogs and videos.
So, I started to develop my code and I think I did my first success, I succeeded to send start and check TWST for sending start signal.
I get started OK, but I can't proceed to send data. What I'm missing? I'm thinking I didn't send the correct address.
void I2C_init(void);
void I2C_start(void);
void I2C_stop(void);
void I2C_tx(uint8_t data);
void I2C_TWSR_Check(void);
void setup() {
Serial.begin(9600);
I2C_init();
// I2C_TWSR_Check();
I2C_start();
I2C_TWSR_Check();
I2C_tx(0x40); // sending the address
I2C_TWSR_Check(); // waiting for response
}
void loop() {
uint8_t i;
// simple loop to blink an LED on the I/O expander pin
for (i=0;i<5;i++) {
I2C_tx(0xff);
I2C_TWSR_Check();
_delay_ms(500);
I2C_tx(0x00);
I2C_TWSR_Check();
_delay_ms(500);
}
}
void I2C_init(void) {
//set SCL to 100kHz
TWSR = 0x00;
TWBR = 0x48;
//enable TWI
TWCR = (1<<TWEN);
}
void I2C_start(void) {
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
void I2C_stop(void) {
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
void I2C_tx(uint8_t u8data) {
TWDR = u8data;
while (!(TWCR & (1<<TWINT)));
}
void I2C_TWSR_Check(void) {
uint8_t Status;
Status = TWSR & 0xF8;
switch(Status) {
case 0x08: // start OK
Serial.println("Start is OK");
break;
case 0x10: // Re start
Serial.println("Re start");
break;
case 0x18: // SLA+W OK ACK
Serial.println("SLA+W OK ACK");
break;
case 0x20: // SLA+W no ACK
Serial.println("SLA+W no ACK");
break;
case 0x28: // data OK ACK
Serial.println("data OK ACK");
break;
case 0x30: // data OK no ACK
Serial.println("data OK no ACK");
break;
case 0x38: // arbitration lost in SLA+W or data TX
Serial.println("arbitration lost in SLA+W or data TX");
break;
default:
Serial.println("Error");
break;
}
}