Amtel atmega 32 als I2C- SLAVE Bus mit 250kBaud im Interrupt Modus
Hallo Zusammen,
hat jemand erfahren mit einem I2C Bus im Fast Modus ?
Leider sind meine Routinen des Master jetzt mit 250KBaud, statt vorher 100kb. :(
Den Kernel mit 100kBaud neu compilieren und wieder einbringen ist nicht ohne.
Ich habe schon versucht, meine Routine zu optimieren, bekomme aber bei einem längeren Schreibzugriff
immer wieder sporadische Fehler. Ich verwende bereits Clock-Stretching.
Da die Interrupt-Routine in C geschrieben ist und der Assembler-Code eigentlich schon recht aussieht,
wollte ich Euch mal fragen, ob ich hier überhaupt eine Chance habe, das ans rennen zu bekommen.
Ich verwende einen atmega32 mit 16Mhz
Würde ein atmega644 mit 20Mhz gehen ?
Gruss R.
Liste der Anhänge anzeigen (Anzahl: 2)
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.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,
ich habe nochmals ein kleines Dokument erstellt, welches die Datenübertragung entsprechend verdeutlichen soll.
siehe Anhang "I2CProtokoll.doc". Es soll die Ereignisse anzeigen und deren Aktionen.
Nur wenn die Routine ein "TW_START" oder "TW_REP_START" empfangen wird, soll weder ein ACK/NAK gesendet werden.
Aber wenn ich das Flag
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA )|(1<<TWSTO)|(0<<TWWC);
Setze ich gleichzeiti ein ACK/NACK oder sehe ich das falsch.
Da ich derzeit kein Speicherscope zur Verfügung habe, habe ich hier ein Problem.
Edit 1:
Versuche mir ein Speicherscope zu besorgen.
Gruss R.