Also so einfach finde ich das nicht.
Könntest Du z.B. noch das letzte "pulse" in der i2c_SendByte Funktion erklären ?
Wird da nicht das letzte Bit doppelt gesendet ?
So ohne set_sda ?
Wäre das nicht ein Kommentar wert ?
Hi,Zitat von Freiheitspirat
der Code ist im Grunde sehr einfach verständlich weil ich ja die Funktionen zum setzen des Leitungspegels in eine Sub gekapselt habe. Die einzelnen I2C Funktionen bestehen ja aus ganz wenigen Befehlen.
Da der PC ja bei diesem Beispiel als Master arbeitet, ist die Taktrate eigentlich unerheblich. Es muss garkein besonderes Timing eingehalten werden. Den Delay Wert kann man eigentlich noch weiter reduzieren. Es sorgt nur dafür das der Slave keine Flanke verpaßt. Da im Beispiel auch einige While-Schleifen auf den Slave warten, könnte man an einigen oder allen Stellen sogar Delay raus nehmen. Kann man ja einfach austesten, einfach reduzieren bis nix mehr geht.
Die maximale Busgeschwindigkeit wird sicher über das Basic Programm ohnehin nicht erreicht, aber das ist ja meist sowieso nicht notwendig.
Gruß Frank
Also so einfach finde ich das nicht.
Könntest Du z.B. noch das letzte "pulse" in der i2c_SendByte Funktion erklären ?
Wird da nicht das letzte Bit doppelt gesendet ?
So ohne set_sda ?
Wäre das nicht ein Kommentar wert ?
Du meinst also dieses Funktion:
Das letzte Pulse dient eigentlich zum Abruf des sogenannten Acknowledge-Bits (kurz immer Ack genannt). Wenn der angewählte Slave die Daten richtig empfangen hat, dann zieht er kurz die SDA Leitung bei diesem Pulse auf Low. Dies kann dann hier im Master als Bestätigung aufgefasst werden, das ein Slave das Byte empfangen hat.Code:Sub i2c_SendByte(wert As Byte) Dim i As Integer Dim bitmask As Byte bitmask = 128 For i = 1 To 8 set_sda (0) If (wert And bitmask) > 0 Then set_sda (1) Else set_sda (0) End If bitmask = bitmask / 2 delay pulse Next i delay pulse delay End Sub
In meinem Beispiel/Treiber wird dieses Ack Bit nicht ausgewertet, daher nur der einfache Pulse Befehl. Es gibt viele Treiber die das Ack-Bit nicht auswerten, so zum Beispiel auch Betriebsystem-Routinen in der C-Control.
Wer es richtig auswerten möchte, kann also vorher die SDA-Leitung auf High legen und dann prüfen. Notwendig ist es nicht unbedingt, manchmal ist es sogar Nachteilig wenn wegen einem nicht angekoppelten Slave Fehler beim Senden gemeldet werden
Aber zum einfachen Anwenden der implementierten I2C-Funktionen ist dieses interne Wissen nicht wichtig - das sei nur gesagt um Einsteiger nicht zu verunsichern wenn sie mal einen I2C Baustein ansteuern wollen.
Gruß Frank
Erstmal vielen Dank für die gut Erklärung.
Es gibt aber auch gerade hier im Board eine ganze Menge Leute, die gerne etwas mehr Hintergrundwissen über solche Funktionsweisen erlernen möchten.Aber zum einfachen Anwenden der implementierten I2C-Funktionen ist dieses interne Wissen nicht wichtig![]()
Ja das sehe ich auch so und ist auch gut so! Ich wollte mit der kurzen Anmerkung nur beiden Gruppen gerecht werden. Aus Erfahrung weiß ich wie schnell man was gutes bei Seite legt wenn es sich auf den ersten Blick zu kompliziert anhörtZitat von Freiheitspirat
![]()
@ Freiheitspirat
die Verbindung mit einem DS1621 ist auf http://radagast.bglug.ca/epia/epia_h...#I2C_Connector
beschrieben was für die Verkabelung hilfreich sein sollte. Im Forum von VIA gibts auch eine Lösung um auf den I2C mit Windows zuzugreifen. Such auf http://forums.viaarena.com/ nach I2C. Einer der Threads heißt "Using I2C port under Windows - Solved" da ist alles erklärt.
MfG
Mike
Hallo Michael,
das Problem ist, das der SMBUS eine erweiterte Spezifikation des I2C ist und eigentlich nicht mit I2C gleich zu setzen ist, wie in den vielen Beschreibungen.
Der DS1621 unterstützt z.B. von sich aus das SMBUS-Protokoll, aber mein Problem ist, das ich reine I2C-Chips OHNE SMBUS-Unterstützung gerne nutzen möchte (Z.B. ein einfaches Ultraschall-Modul srf0.
Die beschrieben Software hatte ich auch schon zu Beginn dieses Artikels als Link gepostet, aber auch sie setzt auf die Spezifikationen des SMBUS und nicht des "nackten" I2C...
Lesezeichen