Forum: Mikrocontroller und Digitale Elektronik 8051 Implementierung von I2C


von Anon A. (anon1234)


Angehängte Dateien:

Lesenswert?

Halli hallo,
ich bin gerade dabei in 8051er (AT89S52) Assembler I2C zu 
implementieren, damit ich dann später die RTC DS1307 auslesen kann.
Momentan habe ich noch keine Geräte an den Bus angeschlossen, sondern 
teste einfach nur so mit dem Logikanalysator, was mein µC ausgibt.
Nun bin ich eigentlich schon relativ zufrieden mit der Ausgabe auf 
meinen beiden I2C-Leitungen, nur der Protokoll-Analyzer vom 
Logikanalysator leider noch nicht.
Der erkennt nämlich doofer weise nicht alle 8 Bits, die ich sende als 
ein Byte, sondern nur die ersten sieben Bits als zu dem Byte zugehörig. 
Das 8.Bit deutet er dann als "Read".
Leider stehe ich hier auf dem Schlauch und Frage mich, ob es einfach nur 
falsch interpretiert wird oder ob ich noch irgendwo einen Fehler 
reingehauen hab..

Ich habe den Code und ein Screenshot vom LA angehängt..
Ich würde mich freuen, wenn mir hier jemand helfen könnte :)

Viele Grüße
anon1234

von Mr. Claudius (Gast)


Lesenswert?

War es nicht so, dass bei I²C die erste Übertragung des Masters immer 
die Adresse des Slaves (7 Bit) und ein R/W-Bit (Lesen/Schreiben vom/zum 
Slave) ist?

von Ralph S. (jjflash)


Lesenswert?

Hmm, grundsätzlich sollte man, der besseren Leßbarkeit wegen, bei 
Verwendung von Registern mit "besonderer" Bedeutung Kommentare verteilen 
(in deinem Falle, dass R7 wohl die Adresse des Slaves am I2C Bus sein 
soll... bei dir hier der Wert 055h).

Namen für die Portbits (und einer der richtig schönen Vorteile der 
MCS-51 Familie ist deren Bitadressbarkeit auch bei den Portbits) wären 
auch nicht "schlecht"...

scl      equ 0a7h        ;   0A7h = P2.7
sda      equ 0a6h        ;   0A6h = P2.6

So sieht man im Programm auch sofort den Zusammenhang

Deine Adresse 055h entspricht 0101.0101 binär und das niederwertigste 
Bit ist eine 1 !!!!

Eine I2C-Adresse ist aber nur 7 !!!!! Bit lang. Bei den Startconditions 
ist das gesendete niederwertigste Bit der Indikator, ob der I2C Bus 
beschrieben oder von ihm gelesen werden soll.

Du darfst also nicht 8 Bits der Adresse hinausschieben, sondern nur 7 
und das niederwertigste Bit entscheidet, ob beim nächsten Zugriff auf 
den Bus gelesen oder geschrieben werden soll !

Würdest du als Slave-Adresse 054h angegeben haben, würde der Bus zum 
Schreiben gestartet werden ...

Gruß,
Ralph

von Ralph S. (jjflash)


Lesenswert?

Mr. Claudius schrieb:
> War es nicht so, dass bei I²C die erste Übertragung des Masters immer
> die Adresse des Slaves (7 Bit) und ein R/W-Bit (Lesen/Schreiben vom/zum
> Slave) ist?

Claudius war schneller (smile es hat etwas gedauert, bis ich wieder 
wußte, welche Adresse P2 hat)

von Anon A. (anon1234)


Lesenswert?

Vielen vielen dank für eure schnellen Antworten..

Mr. Claudius schrieb:
> War es nicht so, dass bei I²C die erste Übertragung des Masters
> immer
> die Adresse des Slaves (7 Bit) und ein R/W-Bit (Lesen/Schreiben vom/zum
> Slave) ist?

Ralph S. schrieb:
> Eine I2C-Adresse ist aber nur 7 !!!!! Bit lang. Bei den Startconditions
> ist das gesendete niederwertigste Bit der Indikator, ob der I2C Bus
> beschrieben oder von ihm gelesen werden soll.
>
> Du darfst also nicht 8 Bits der Adresse hinausschieben, sondern nur 7
> und das niederwertigste Bit entscheidet, ob beim nächsten Zugriff auf
> den Bus gelesen oder geschrieben werden soll !

Aah dann wird mir jetzt einiges klar :D
ich habe garnicht vorgehabt irgendeine spezielle Adresse rauszuschreiben 
sondern hab einfach mal testweise 55h rausgeschrieben um zu sehen ob 
meine write-funktion funktioniert..
Also da wär es diesmal wohl besser gewesen, sich erst anzugucken, was 
für daten mal geschickt werden müssen..

Ralph S. schrieb:
> Hmm, grundsätzlich sollte man, der besseren Leßbarkeit wegen, bei
> Verwendung von Registern mit "besonderer" Bedeutung Kommentare verteilen
> (in deinem Falle, dass R7 wohl die Adresse des Slaves am I2C Bus sein
> soll... bei dir hier der Wert 055h).

sorry das mit den kommentaren und den Namen für die Portbits mache ich 
normaler weise auch..
aber weil es jetzt heute abend schnell gehen musste hab ichs erstmal 
weggelassen..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.