Hallo zusammen,
dieser Thread ist zwar schon etwas älter, aber ich bin jetzt letztens auch auf das Problem mit dem nicht funktionierenden repeated start gestoßen. Ich bin auf zwei Fehler gestoßen, nach dem beheben dieser Fehler läuft der Slave auch mit dem repeated start bzw. überhaupt. Es wäre schön wenn dies jemand auch im Wiki ändern könnte.
1.Fehler:
Dies ist so Falsch, wenn man die Adresse um eins nach links shiftet schneidet man ein Bit der Adresse ab, richtig wäre:Code:TWAR= (adr << 1); //Adresse setzen um 1 bitshiften wegen TWAR register (siehe Datenblatt!)
Code:TWAR= adr; //Adresse setzen
2. Fehler:
Laut Datenblatt ist dies der Code für den Empfang einer Stop, bzw einer Repeated Start Bedingung, jetzt bin ich mir nicht mehr so sicher, aber mit dieser Lösung funktioniert es:Code:switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen { ... case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert case TW_SR_DATA_NACK: // 0x88 case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received case TW_SR_STOP: // 0xA0 STOP empfangen default: TWCR_RESET; break; } //end.switch (TW_STATUS)
Viele GrüßeCode:switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen { case TW_SR_STOP: TWCR_ACK; break; ... case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert case TW_SR_DATA_NACK: // 0x88 case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received default: TWCR_RESET; break; } //end.switch (TW_STATUS)
KR-500







Zitieren

Lesezeichen