I2C ACK wann wieder zurück setzen

Gast #4558044
Lesenswert?

Hallo

Ein ACK beruht laut µC Artikel auf setzen SDA auf Low im 9.Zyk
Wann wird/muss dieses Bit vom ACK Versender (8bit Daten-Empfänger) 
wieder zurück gesetzt werden damit der SDA Pin als Eingang "open-drain" 
wieder fungiert?

Bei mehrfachen Slaves mit gleicher Adresse steht aber auch, dass alle 
auf SDA auf LOW gezogen halten, beeinflusst dass nicht das Lesen jeden 
Slaves an diesem PIN, sind ja dann immer LOW?

Antworten wären sehr hilfreich um das Szenario besser zu verstehen, txs.
Gast #4558054
Lesenswert?

> Wann wird/muss dieses Bit vom ACK Versender wieder zurück gesetzt werden

Unmittelbar nach dem Ende des Taktimpulses.

Wenn mehrere Slaves auf die selbe Adresse reagieren, kannst du nicht 
mehr unterscheiden, welcher und wie viele Slaves acknowledged haben.

Deswegen macht man das normalerweise nicht. In der regel hat jeder Slave 
eine eindeutige Adresse.
Gast #4558071
Lesenswert?

Stefan U. schrieb:
>> Wann wird/muss dieses Bit vom ACK Versender wieder zurück
> gesetzt werden
>
> Unmittelbar nach dem Ende des Taktimpulses.

Also so in etwa?
1
SendACK (void)
2
{
3
while (!SCL); // Takt ist noch LOW, bit wird gesetzt 
4
SDA = 0;      // SDA PIN bekommt output(0)
5
delay_us(1);  // sollte man sowas einbauen oder eher weglassen?
6
SDA = 1;      // SDA PIN bekommt inputstatus ( pulluped = high )
7
}
8

9
SendNACK (void)
10
{
11
// _do_nothing
12
}


txs!
Gast #4558102
Lesenswert?

Du ziehst die Leitung auf Low, sobald der Taktimpuls beginnt. Und du 
lässt sie wieder los, sobald der Takt endet. Also eher so:

// Warte auf Takt
while (SCL==High);
SDA=Output_und_Low;
// Warte auf Ende des Taktimpulses
while (SCL==Low);
SDA=Input;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren