Hi Dirk,
danke für Deine Antwort.
Zuletzt hat SlyD doch gesagt, dass das nach ganz oben muss?!
Wenn ich das unter die Abfragen mache, kommt die Fehlermeldung und das, was ich zuletzt als Bild gepostet habe am Oszilloskop.
Viele Grüße
teamohnename
EDIT:
Anscheinend haben wir den Fehler gefunden, nachdem wir uns nochmal das Datenblatt angeschaut haben. Vorher war das so in der ISR:
Code:
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(0<<TWSTA)|(no_rep_start<<TWSTO)| // Initiate a STOP condition.
(0<<TWWC); //
Dabei würde aber ein Stop durchgeführt werden, wenn no_rep_start 1 ist. Wenn das 0 ist, passiert irgendwas anderes, auf jeden Fall kein Repeated Start, da ein Repeated Start nur durchgeführt wird, wenn das so aussieht:
Code:
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| // Initiate a REPEATED START condition.
(0<<TWWC); //
Jetzt haben wir das so in eine if-Abfrage gepackt:
Code:
if(no_rep_start == 1){
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| // Initiate a STOP condition.
(0<<TWWC); //
}
else{
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| // Initiate a REPEATED START condition.
(0<<TWWC); //
}
Jetzt wird definitiv ein repeated Start gesendet, nachdem die Leseanfrage gesendet wird, bricht der Slave aber mit einem Nack ab (Fehlercode 0x48).
Woran könnte das liegen? Wahrscheinlich ja an der Lesefunktion, wenn man die ausklammert, ist der Fehler da nicht mehr. Was muss man da aber ändern?
EDIT2:
Das Nack liegt daran, dass no_rep_start nicht wieder auf 1 zurückgesetzt wird, nachdem es in der Transmit Funktion auf 0 gesetzt wurde.
Woran liegt das? Vermutlich ja an task_i2c... Aber wo muss das jetzt genau hin?
EDIT3:
So haben wir den test durchgeführt:
Code:
void getIR(void)
{
I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
while(no_rep_start == 0){} //hier bleibt der Code hängen
I2CTWI_readRegisters(0x55<<1, 0x07, sensorBuf, 3);
// This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
//mlx90614_l = (((sensorBuf[1] & 0x007F) << 8) + sensorBuf[0]);
}
Wenn wir jetzt aber neben no_rep_start = 1 eine LED anschalten, geht diese an...
Komisch.
Lesezeichen