Wie prüft man richtig, ob ein angesprochener Slave die vom Master
ausgehende Adressierung mit ACK oder NACK quittiert hat?
Hintergrund ist ein EEPROM, der sich vom Bus komplett trennt, wenn er
Daten empfangen hat. Eine Feste Wartezeit zwischen den Zugriffen möchte
ich vermeiden.
>Minimizing System Delays by Polling On ACK>During the internal Write cycle, the device> discon-nects itself from the bus, and writes a copy of the>data from its internal latches to the memory cells.
Ist noch nie jemand mit dem Problem konfrontiert worden, einen Slave
erst auf das "Vorhandensein" prüfen zu müssen? Beim AVR geht es noch
auch, da hat es gereicht nach dem Senden der Adresse auf ACK zu
prüfen...
Ich habe so etwas ahnlich geschrieben. Wichtig : die pull-up
Wiederstande mussen functionieren, oder er bleibt irgendwo hangen
Program. Das ist hier wirklich "quick und dirty" Slave_Read() sendet
eine 7 bit adresse, wen ACK komt wird das in eine variabele gesetzt, LED
leuchtet. GPIO und Clocks mussen naturlich auch noch configuriert
werden. An pin C9 hangt die LED (Discovery VL board).
af schrieb:> Wie prüft man richtig, ob ein angesprochener Slave die vom Master> ausgehende Adressierung mit ACK oder NACK quittiert hat?
Mit einem Logic Analyzer???
@ Heinz
danke, aber mir geht's um die Softwarerealisierung.
@ Jan H.
und das tut mein STM32 eben nicht. Auf dem STM3210C Eval Board sind 4k7
Pullups dran. EEprom trennt sich dem Datenblatt nach vom Bus, wenn er
die gepufferten Daten schreibt. Also kann der die Leitungen nicht auf
Low halten. Demnach muss man beim nächsten Zugriff auf EEProm die
Adresse senden ung gucken, ob ein ACK kommt oder nicht. Beim Atmega war
das ganz einfach sowas wie:
do {
} while (!i2c_start(0xA0))
Und diese Zeilen verursachen halt eine endlose Schleife, wenn der Slave
nicht mit ACk antwortet:
Habe es mir angeschaut und ausprobiert. Lief positiv ab, jetzt aber
plötzlich gibt es Probleme mit dem EEPROM zu kommunizieren. Hat der STM
irgendwelche Register, sodass nach dem DeInit und Stromreset die Werte
beibehalten werden? Irgendwie läuft der Code was zuvor funktioniert hat
gar nicht mehr....
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.