@damfino:
ja, das habe ich zum probieren auch so gemacht mit den Status Abfragen, da ich das ganze dann im Interrupt verarbeiten möchte.
so kann ich schön mit Breakpoints gucken wie der interne Status vom Controller steht.
Code:
//----------------------------------------------------------
BOOL i2c_check(U8 address, U8 ReadWriteMode)
{ volatile U8 stat;
BOOL result;
// stat mueste 0xF8 sein
stat = I2C_STAT;
// setze das Startflag
I2C_CONSET = CON_STA; // STA Set Start flag
// Start Condition wird sofort ausgeschoben
// warte auf das SI Flag, dann ist Startcondition fertig
if (! i2c_waitSI())
{
i2c_stop();
return FALSE;
}
// stat muesste nun 0x08 sein
stat = I2C_STAT;
I2C_CONCLR = CON_STAC; // loesche das Start Flag
// set address and read/write bit to the dat register
I2C_DAT = (address << 1 ) | ReadWriteMode;
// loesche SI Flag startet das Ausschieben der Adresse und RW Bit
I2C_CONCLR = CON_SIC;
// warte auf das SI Flag
if (! i2c_waitSI())
{
i2c_stop();
return FALSE;
}
stat = I2C_STAT;
// stat muesste nun 0x18 sein wenn ACK gesendet wurde vom Slave
// oder 0x20 Adresse transmitted, no ACK received, kein Slave antwortet
// wenn ReadMode also RW Bit = 1 dann wird der status 0x40 oder 0x48
result = FALSE;
if ((ReadWriteMode == I2C_WRITE) && (stat == 0x18)) result = TRUE;
if ((ReadWriteMode == I2C_READ ) && (stat == 0x40)) result = TRUE;
// neu 27.01.2018 , wir lesen ein Byte ein, damit sich die Chips wieder
// synchronisieren können. Einige brauchen das anscheinend
I2C_CONCLR = CON_AAC; // clear the Ackflag // wir wollen danach nichts weiter lesen NACK
I2C_CONCLR = CON_SIC; // loesche SI Flag startet das Ausschieben der Adresse und RW Bit
// warte auf das SI Flag
if (! i2c_waitSI())
{
i2c_stop();
return FALSE;
}
stat = I2C_STAT;
// STOP condition
I2C_CONCLR = CON_STAC; // clear the Start flag
I2C_CONCLR = CON_AAC; // clear the Ackflag
I2C_CONSET = CON_STO; // set STO
// loesche SI Flag startet, das Ausschieben der Stop condition
I2C_CONCLR = CON_SIC;
// stat mueste wieder 0xF8 sein
stat = I2C_STAT;
return result;
}
Lesezeichen