Recently i've been trying to implement non-blocking I2C transfers on my FRDM-k22f but i'm struggling to make proper transfers.
As example i'm trying to send slave adress, register address and 2 data bytes but at the end i end up with 5 bytes instead of 4. I double check and i write to data register only 4 times so it seems analyzer sees random states on the bus as a byte?
I checked how much interrupts i get and there is 1 caused by STARTF, 4 caused by TCF and one by STOPF which seems to correct using this way of thinking:
1. startf - slaveaddress
5. no data to send - generate stop condition
6. stopf interrupt
Now the problem starts because even i got interrupt by stopf i cannot get correct stop condition on the bus?
At 5th interrupt i use my I2C_stop function to generate stop condition:
void I2C_stop(I2C_Type *base)
base->C1 &= ~(I2C_C1_MST_MASK|I2C_C1_TX_MASK|I2C_C1_TXAK_MASK);
That's how it looks on analyzer:
Any ideas what might be wrong? I followed block schematic from k22f manual to properly handle interrupts but it's still not enough to get it going.