Hallo,
irgendwie gebe ich Dir ja recht, nur gibt es den irgendwo eine entsprechende Beschreibung, wann welches Signal innerhalb der Interrupt-Routine ausgelöst wird. Die Beschreibung aus der Headerdatei <twi.h> ist nicht wirklich hilfreich oder ?
Ich weiss zum Beispiel nicht sicher, welchen Anteil der Steuersignal die Hardware des atmega32 durchführt und welche nicht.
Folgende Signale verarbeitet meine und auch die RN-Wissens Routine eins Slave im Interrupt Mode.
Code:
{
switch (TW_STATUS) //Check the TWI-Status register
{
case TW_REP_START: // Repeated Start bestätigen
break
case TW_SR_SLA_ACK: // 0x30 Slave Receiver, Slave was addressed
break;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver, a data byte received
break;
case TW_ST_SLA_ACK: //0xA8 Slave addressed in read mode
case TW_ST_DATA_ACK: //0xB8 Slave Transmitter, Request of data
break;
// case TW_ST_DATA_NACK: // 0xC0 No more data requested
// case TW_SR_DATA_NACK: // 0x88
// case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has ben transmitted (TWEA = “0”);
//case TW_SR_STOP: // 0xA0 STOP empfangen has been received
default:
AcknowlegeFlag=2;
break;
break;
}
if (AcknowlegeFlag == TRUE ) TWCR_ACK;
if (AcknowlegeFlag == FALSE ) TWCR_NACK;
if (AcknowlegeFlag == 2 ) TWCR_RESET;
}
Nur werden hier Start / Stop / Repeated Start komplett aussen vorgelassen, diese werden laut diesem Code über den Default geleitet (also Reset ?!).
Wird diese Routine auch dann ausgeführt, wenn ich mit einem anderen Partner rede ? Die Daten der Adresse werden natürlich mit einem Takt von 250kBaud übertragen. Der atmega kann den Fast Modus, das sollte also nicht das Problem sein.
Edit1:
Die Bilder 1 und 2 zeigen jeweils das eigentlich Protokoll, was ich verwende
Picture 1: Zeigt den Schreibzugriff. Das erste Byte ist hierbei die Adresse, wo die Daten abgelegt werden
Picture 2: Zeigt den Lesezugriff. Das erste Byte ist hierbei die Adresse, wo die Daten gelesen werden soll. Danach der Repeated Start und der Lesezugriff.
Hier wäre das Problem, der Repeated Start und die neue Slave-Adresse, dieser ist aber bei Lesen, was ja geht
Edit2:
Ich habe den "Repeated Start" noch eingefügt. Hier wird dann mit einem ACK geantwortet.
Nur habe ich ja nur mit dem Schreiben Probleme, hier wird ja eh nur jedes Byte vom Master mit "ACK" beantwortet.
Es erfolgt keine Änderung der Datenrichtung (Repeated Start). Dies ist ja doch eigentlich die einfache Richtung.
Edit3: Hier die Bedingungen, wann das Modul TWI einen Interrupt auswirft.
Seite 176 vom Atmega32 gab mir die Infos:
The TWINT Flag is set in the following situations:
•
After the TWI has transmitted a START/REPEATED START condition
•
After the TWI has transmitted SLA+R/W
•
After the TWI has transmitted an address byte
•
After the TWI has lost arbitration
•
After the TWI has been addressed by own slave address or general call
•
After the TWI has received a data byte
•
After a STOP or REPEATED START has been received while still addressed as a slave
•
When a bus error has occurred due to an illegal START or STOP condition
Gruss R.
Lesezeichen