PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bidirektionale Level-Converter I2C



extremesports
16.04.2012, 22:58
Hallo,


ich stehe vor folgendem Problem:

Ich möchte an mein ATmega128 zwei I2C Module anschließen, die aber mit 3,3 Volt laufen, wobei der Microcontroller mit 5 Volt läuft.

Datenübertragung muss so weit ich das verstehe in beide Richtungen erfolgen können, weshalb ich einen bidirektionalen Level-Converter benötige.

Die Module die ich anschließen möchte sind folgende:

- http://www.hoperf.com/sensor/app/hdpm01.htm

- http://jeelabs.com/products/lux-plug

Ich denke, dass ich mit einem der folgenden Level-Converter glücklich werden könnte:

- http://www.watterott.com/de/8-channel-Bi-directional-Level-Converter-TXB0108

- http://www.lipoly.de/index.php?main_page=advanced_search_result&search_in_description=1&keyword=BOB-08745

Die Fragen, die sich jetzt stellen sind zum einen, ob ich grundsätlich mit meinem Lösungsansatz richtig liege und ob die genannten Level-Converter das können was ich erwarte. Zum anderen stellt sich mir die Frage, wie das ganze zu verkabeln wäre, da ich zumindest bei dem Sparkfun Level-Converter jede Converter-Leitung nur in einer Richtung benutzen kann wenn ich das richtig verstanden hab.
Bei dem Converter von Texas Instruments sollte doch jede Leitung bidirektional zu nutzen sein, so dass ich pro I2C Modul nur 2 Leitungen benötige (eine für SDA und eine für SCL).

Oder kann ich auch die Module mit dem I2C Bus verbinden (noch auf der 3,3 Volt Seite) und dann mit dem ganzen Bus nur 2 Leitungen eines solchen Level-Converters nutzen? Habt ihr für den Fall einen Vorschlag für ein mgl. kleines Modul, da mein verfügbarer Platz etwas begrenzt ist.


[edit] Ich hab gerade herausgefunden, dass es die ICs von Texas Instrument auch kleiner gibt: txb0101 bsp. für nur eine Leitung (oder auch für 2,3,etc.) [edit]



Danke für alle Tips...



Grüße

PICture
17.04.2012, 00:33
Hallo!

Ich habe nur die Level Converters aus deinen Links angeschaut und folgendes gefunden:

zu 1: "Only thing that doesn't work well with this chip is i2c (because it uses strong pullups which confuse auto-direction sensor)."

zu 2: keine Infos über zulässige "pullup's"

Wenn du Zeit und Lust dafür hättest, könntest du vielleicht meine Idee ausprobieren (bisher keine Rückmeldung): https://www.roboternetz.de/community/threads/54800-Bidirektionaler-Pegelwandler-Funktionsweise . ;)

Klebwax
17.04.2012, 05:41
Ich möchte an mein ATmega128 zwei I2C Module anschließen, die aber mit 3,3 Volt laufen, wobei der Microcontroller mit 5 Volt läuft.

Datenübertragung muss so weit ich das verstehe in beide Richtungen erfolgen können, weshalb ich einen bidirektionalen Level-Converter benötige.


Bidirektional reicht nicht, die I2C Leitungen sind Open Collector und werden in beiden Richtungen getrieben. Deine beiden Beispiele sind für I2C gänzlich ungeeignet.

Versuch einfach mal, ob dein ATmega128 mit einem I2C Bus klarkommt, bei dem die Pullups an 3,3V gehen. Das ist die einfachste (und kleinste) Lösung.

MfG Klebwax

ePyx
17.04.2012, 06:07
Dafür funktioniert die die Schaltung die in dem letzten Link verwendet wurde ohne Probleme seit einigen Monaten. Die Schaltung ist einer NXP/Phillips-AppNote nachempfunden die Widerstände auf der Schaltung werden 1k bis 10k sein. An Master/Slave sollten dennoch die üblichen Pullup-Widerstände 1k-10k hängen.

Alternativ könnte man noch einen PCA9306 nehmen, das wäre ein Bidirektionaler Levelshifter für TWI und SMBus. Bei Maxim gab es auch noch Einiges im Sortiment.

PICture
17.04.2012, 06:20
Hallo ePyx ! :)

Sch ... ade, ich wolltw es gerade selber ausprobieren und sofort patentieren lassen ... :(

Aber vieeelen Dank für deine Info, weil ich mir das sowieso als Rentner nicht leisten kann ... :lol:

ePyx
17.04.2012, 06:22
@ PICture : Tut mir leid, wollte dir natürlich keinen Strich durch die Rechnung machen. ;)

22158

Die Schaltung bei Lipoly wird in etwa so aussehen. Für TWI brauch man die natürlich genau 2mal.

extremesports
17.04.2012, 08:28
Vielen Dank für die vielen und schnellen Antworten.

@PICture: Danke für den Link, schaut gut aus.


Ich hab jetzt noch ein anderen IC gefunden, den ich wohl erst mal ausprobieren werde. Wenn der zur Zufriedenheit funktioniert verwende ich den:

http://www.ti.com/product/pca9306

Der is auch speziell für I2C gemacht.

Ich werd mir den mal besorgen und dann berichten. Ohne Level-Converter IC möchte ich es ungern probieren. Hab keine Lust mir mein ATmega 128 zu zerschießen oder was viel wahrscheinlicher wäre meine Sensoren. ;-)


Grüße

ePyx
17.04.2012, 12:58
Den würde ich einfach bei TI sampeln, da der recht teuer und schwer zu bekommen ist.

extremesports
17.04.2012, 14:04
Danke für den Tip Daniel. Hab ich so gemacht. Jetzt heißt es warten bis das Päckchen von TI kommt.

Bzw. ich kann ja wenn ich am Wochenende die Zeit finde schon mal ein kleines Layout fertig machen um ne Platine dafür zu ätzen.
Werd ich dann hier posten so bald ich was vorzeigbares hab. ;-)


Grüße

ePyx
17.04.2012, 17:00
Hab auch erst letzten Freitag ein Päckchen von TI bekommen. Hatte die noch im Hinterkopf und hab welche mit genommen. Ansonsten funzt die Schaltung mit dem N-Kanal MOSFET auch tadellos.

extremesports
18.04.2012, 22:51
Weiß jemand, ob es irgendwo ne Eagle Libary gibt worin DCK Packages mit 6 Pins enthalten sind?
Oder muss ich mir die jetzt auch noch selbst erstellen? ^^

Grüße

extremesports
20.04.2012, 20:28
[edit] sorry Laptop spinnt grad, deshalb neu verfasst. (kann man eigene Beiträge irgendwo löschen?)

extremesports
20.04.2012, 20:30
So ein Mist - ich kann einfach kein passendes Package finden. Übrigens muss es ein DCK Package mit 8 Pins sein.

Mit selber erstellen komme ich leider gar nicht zurecht. Mir ist einfach nicht klar, wie ich das ganze Maßstabsgetreu zeichnen kann, dass die Abstände und Breiten der Pads nachher stimmen.

Grüße

ePyx
20.04.2012, 21:01
DCK ist doch genauso groß wie SSOP8. habe meinen AVRDRagon mit neuen Analogschaltern in dem Format bestückt.

extremesports
20.04.2012, 22:02
Echt????? Unglaublich - ne bessere Info hätt ich heut Abend nicht bekommen können. ^^
Dann werd ich mir einfach ein Bauteil in SSOP8 suchen und das verwenden um mein Bauteil zu erstellen.

Vielen Dank Daniel!

Grüße

ePyx
20.04.2012, 22:04
Zur Sicherheit mal ausdrucken und Bauteil auf den Pads platzieren.

extremesports
20.04.2012, 22:11
Erst mal layouten... ;-)
Aber dann werd ich es erst testen - danke!

[edit]
Hab gerade mal gesucht, wo ich in eagle ein passendes Package finde: Analog Devices AD623R is ein SO8 Package welches auch identisch mit SSOP8 und mit DCK8 sein sollte.



[edit]
So, jetzt hab ich mal das Texas Instruments PCA9306 entsprechend dem Datenblatt angelegt. Wenn also jemand Interesse hat einfach melden, dann lad ich die .lbr. hoch.

Layout wird denke ich bis Sonntag fertig und dann hier gepostet.


Grüße

e.

extremesports
24.04.2012, 20:49
Mit dem Layout ging es leider nicht so schnell wie erwartet. Ich hab mir jetzt mal angeschaut, was in dem Päckchen von TI drinnen war und da kam die Ernüchterung. Trotz dass ich pca9306 bestellt hab kamen txb0102.

http://www.ti.com/lit/ds/symlink/txb0102.pdf

Kann ich das mit denen auch aufbauen (steht nichts direkt von I2C im Datenblatt)?
Es steht immerhin was von "auto direction sensing" drinnen - sollte doch so weit ich das verstehe auch für I2C funktionieren.

Grüße
e.

PICture
24.04.2012, 21:41
Hallo!

Laut 3.Seite des o.g. Datenblatts (DB) ist der Ausgang vom txb0102 bipolar (Io = +/- 50mA). Ich glaube, dass für I2C muss man jeden Ausgang mit einer Schottky-Diode nur unipolar machen (siehe Code). ;)

VCC
+
|
.-.
| |
----------+ | |
| '-'
txb0102 | |
Ausgang |-S<-+ I2C Leitung
| |
| |
| |

(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

ePyx
24.04.2012, 21:49
Naja ich würde mir Seite 10 anschauen :

Pullup or Pulldown Resistors on I/O Lines
The TXB0102 is designed to drive capacitive loads of up to 70 pF. The output drivers of the TXB0102 have low
dc drive strength. If pullup or pulldown resistors are connected externally to the data I/Os, their values must be
kept higher than 50 kΩ to ensure that they do not contend with the output drivers of the TXB0102.


For the same reason, the TXB0102 should not be used in applications such as I²C or 1-Wire where an
open-drain driver is connected on the bidirectional data I/O. For these applications, use a device from the TI
TXS01xx series of level translators.

PICture
24.04.2012, 22:07
Ja, das habe ich schon gesehen, aber das mit "pullups" > 50 k und max. Io passt mir (z.B. für 4,7 k bei I2C) irgendwie nicht zusammen. In meiner Skizze sollte dank der Schottky Diode "virtuelles open-drain driver" enstehen. Wenn man überflüssigen TXB0102 hätte, könnte man das ohne Risiko ausprobieren, da über "sinking strength" nix drin steht. ;)

ePyx
24.04.2012, 22:12
mit "pullups" > 50 k und max. Io passt mir (z.B. für 4,7 k bei I2C) irgendwie nicht zusammen

Genau darauf wollte ich auch hinaus. Das mit der Shottky-Diode sollte man zu mindestens Testen ;) . Wir kennen ja auch nicht das Endprodukt bzw. wo es eingesetzt werden soll.

Klebwax
25.04.2012, 04:04
Genau darauf wollte ich auch hinaus. Das mit der Shottky-Diode sollte man zu mindestens Testen ;) . Wir kennen ja auch nicht das Endprodukt bzw. wo es eingesetzt werden soll.

Mal abgesehen davon, ob der der Low-Pegel mit der Diode noch erreicht wird, geht das nur in einer Richtung. I2C ist aber bidirektional.

For the same reason, the TXB0102 should not be used in applications such as I²C or 1-Wire where an
open-drain driver is connected on the bidirectional data I/O.

Die Leute von TI haben sicher recht. Auch wenn "should not" wie "sollte nicht" klingt, heißt es aber "kann nicht" oder "darf nicht".

MfG Klebwax

ePyx
25.04.2012, 07:30
Naja muss gestehen, bevor ich das mit der Diode verbauen würde, würde ich eher zwei MOS-FETs und die 4 Widerstände nehmen. Nichts gegen PICtures Idee, aber da weiß ich das Sie funktioniert. Das würde man auch mit SOT-223 und 0602/0805 Widerständen relativ klein hinbekommen.

extremesports
25.04.2012, 16:56
Danke für die vielen Antworten!

Erst mal schnell dazu wo es eingesetzt werden soll:
Ich hab ein ATmega128 Board (letATwork128 welches mit 5 Volt läuft. Daran sollen zwei I2C Sensoren betrieben werden, die aber nur mit 3,3 Volt laufen.

Ich denke ich werd versuchen bei TI noch mal die richtigen ICs zu bestellen (http://www.ti.com/lit/ds/symlink/pca9306.pdf)
Sonst werde ich es einfach mal mit der Mosfet Schaltung aufbauen.

Den Versuch mit den Schotky Dioden kann ich mal durchführen wenn ich mehr Zeit übrig hab. In 4 Wochen stehen erst mal die Fachabi Prüfungen an... danach is dann mehr Zeit verfügbar ;-)

Grüße
e.

ePyx
25.04.2012, 17:36
Um welche Sensoren handelt es sich denn ? Manch sind auch 5V tolerant.

extremesports
25.04.2012, 17:42
Hi Daniel,

es handelt sich um folgende Sensoren:

http://jeelabs.com/products/heading-board

http://jeelabs.com/products/lux-plug

Ich konnte bis jetzt nichts finden, dass diese 5 Volt kompatibel wären.

Grüße
e.

ePyx
25.04.2012, 17:52
Hast du eigentlich auch noch andere TWI-Slaves die mit 5Volt arbeiten ? Wenn nein, kann man auch die Pullups an 3,3V hängen der ATmega kann dann immer noch zwischen Low und High unterscheiden. Allerdings die MOSFET-Schaltung funktioniert auf jeden Fall.

Klebwax
25.04.2012, 18:39
Beim ersten Sensor konnte ich nur finden, daß er nicht mehr produziert wird.


Hast du eigentlich auch noch andere TWI-Slaves die mit 5Volt arbeiten ? Wenn nein, kann man auch die Pullups an 3,3V hängen der ATmega kann dann immer noch zwischen Low und High unterscheiden.

Das hatte ich schon vorgeschlagen, extremesports ist aber wohl der Meinung (siehe weiter oben), daß sich die 5V auf magische Weise über OC-Ausgänge und Pullups an 3,3V auf seine Sensoren übertragen und sie zerstören werden. Da muß er nun mal basteln.

MfG Klebwax

extremesports
25.04.2012, 20:25
Also wenn ihr alle meint, dass das kein Problem ist das über Pull-Ups auf 3,3V anzuschließen werd ich das mal versuchen. Ich hab da immer so ein flaues Gefühl im Magen wenn ich mit verschiedenen Spannungen arbeite...
Ich probiers die Tage mal auf den Steckbrett. Andere TWI-Slaves mit 5V hab ich momentan nicht geplant. Ich versuch trotzdem mal bei TI die entsprechenden ICs zu bekommen.

Wäre das mit den Pull-Ups denn so richtig? Die beiden schwarzen Vierecke sollen die Pull-Ups sein. Hatte grad leider keine Zeit nen vernünftigen Schaltplan zu zeichnen...

22240
Gerüße
e.

Klebwax
25.04.2012, 20:58
Das sieht so ok aus. Und mach sie nicht so groß, so ca. 1 bis 2kOhm. Ein I2C Treiber muß 3mA treiben können. (Umgekehrt kann eine Body/Schutzdiode an einem IC-Eingang 5mA oder mehr nach der jeweiligen Versorgung vertragen)

MfG Klebwax

PICture
25.04.2012, 21:07
Für mich einfachste Lösung wäre den AVR auch mit 3,3 V zu versorgen. ;)

extremesports
25.04.2012, 21:14
Hey PICture:
es handelt sich um folgendes ATmega128 Board:
http://www.avr-tools.de/component/page,shop.product_details/flypage,shop.flypage_avr/product_id,29/category_id,24/manufacturer_id,0/option,com_virtuemart/Itemid,29/vmcchk,1/
Im Datenblatt steht dass entweder 5 Volt oder 7-20 Volt mgl. sind.
Man kann zwar den ATmega direkt mit Spannung versorgen, aber der Rest an ICs benötigt wohl 5 Volt. Und zwei Spannungsversorgungen sind nicht mgl.

Grüße
e.

PICture
25.04.2012, 21:18
Dann kannst du es wirklich nicht machen, wenn es noch mehr Hardware gibt, die 5 V benötigt. Ich habe nur an deinen letzten Schaltplan gedacht (kenne AVR's nur grob). ;)

extremesports
25.04.2012, 21:21
Beim ersten Sensor konnte ich nur finden, daß er nicht mehr produziert wird.

Das von Jeelabs is ja nur ne Breakout Platine ohne weitere Bestückung und da is folgende Sensorplatine dabei, die ich noch nicht auf das Breakoutboard gelötet hab:
http://www.kosmodrom.com.ua/pdf/HDPM01.pdf
Im Datenblatt is zu finden dass die Spannung von 2,4-5,25V mgl. ist.
Weiter unten findet man aber auch die Angabe, dass 2,2-3,6V der mgl. Bereich ist.

Evtl. weiß jemand mehr zu diesem Sensor?

[edit]
@PICture: Ja ich hab auf dem Schaltplan nur nen AVR gezeichnet, da wäre das mit den 3,3 Volt mgl. Bei dem letATwork Modul leider nicht. Deshalb beschäftigt mich die Sache mit dem 3,3Volt I2C ja auch so... ;-)
[edit]

Grüße
e.

ePyx
26.04.2012, 07:26
Ja so war es von Klebwax und mir gemeint. Pullups für SDA und SCL an die Versorgungsspannung der Slaves.



Das hatte ich schon vorgeschlagen, extremesports ist aber wohl der Meinung (siehe weiter oben), daß sich die 5V auf magische Weise über OC-Ausgänge und Pullups an 3,3V auf seine Sensoren übertragen und sie zerstören werden. Da muß er nun mal basteln.

Tut mir leid, hab ich wohl überlesen.

extremesports
27.04.2012, 22:16
Am Dienstag werd ich das mit den Pullups auf dem Steckbrett mal testen. Bei TI hab ich jetzt noch mal Samples bestellt, die seit heute auf dem Weg zu mir sind.
Dabei handelt es sich dann um folgende ICs:
http://www.ti.com/lit/ds/symlink/tca9406.pdf
Dafür werd ich also nebenbei auch mal ein Layout entwerfen, damit ich es dann letztendlich mit denen aufbauen kann.

Grüße e.

extremesports
03.05.2012, 18:58
Ich habs in der Zwischenzeit geschafft das Ganze mal aufzubauen.

Allerdings hab ich jetzt für die ersten Versuche eine etwas abgeänderte Hardware verwendet:
Ein ATmega 8 (Code poste ich weiter unten noch) läuft mit 5 Volt.
Als I2C Sensor hab ich ein Lux Plug von Jeelabs genommen (http://jeelabs.net/projects/hardware/wiki/Lux_Plug) da ich da die I2C Adresse kenne. Beim Heading Board ist mir die Adresse nicht bekannt - konnte sie noch in keinem Datenblatt finden. Außerdem benötigt das Heading Board ein Master Clock Signal mit 32 kHz. Das kann ja eigentlich ohne Probleme vom ATmega erzeugt werden, muss dann aber auch auf 3,3 Volt gebracht werden...
Zurück zum momentanen Aufbau: Ich hab die Spannungsversorgung vom Sensor an 3,3 Volt angeschlossen. SDL und SDA sind am ATmega8 laut Datenblatt an Pin C4 und C5 angeschlossen und die Pullups(1kOhm) gehen auf 3,3 Volt.
Vom ATmega gehen die UART Leitungen (RXD und TXD) zu einer USBtoUART Bridge, damit ich am PC über Hterm die Ausgabe des Controllers verfolgen kann.

Hier mal der Code, der auf dem ATmega läuft:

' BASCOM-Programm
' I2C-Scanner mit ATMega8
'
' In: beliebige I2C-Slaves an C.4=SDA und C.5=SCL
' Out: SerialOut über UART
' Funktion dieses Demo-Programmes:
' Scannen der Slave-Adressen

'$sim

$regfile = "m8def.dat" ' benutzter Mikrocontroller
$crystal = 8000000 ' Taktfrequenz

$hwstack = 40 ' Hardware Stack
$swstack = 32 ' SW Stack
$framesize = 60 ' Frame

$baud = 9600

Waitms 250

Config Sda = Portc.4
Config Scl = Portc.5

'Config I2cdelay = 20

I2cinit

Dim Slaveadresse As Byte
Dim Lux As Byte
Lux = 0

Do
Print "I2C Slaves"
Print "suchen..."
Wait 2

For Slaveadresse = 0 To 254 Step 1
I2cstart 'Startbedingung senden
I2cwbyte Slaveadresse ' Addresse senden

If Err = 0 Then 'I2C-Slave gefunden?
Print "Slave dec: " ; Slaveadresse
Print "h" ; Hex(slaveadresse) ; " b" ; Bin(slaveadresse)
Wait 2
End If

I2cstop 'Bus freigeben
Next

Print "Ende Scan"
Wait 2

I2cstart
I2creceive &H72 , Lux
Print "Lux72: " ; Lux
I2cstop

I2cstart
I2creceive &H73 , Lux
Print "Lux73: " ; Lux
I2cstop

I2cstart
I2creceive &H74 , Lux
Print "Lux74: " ; Lux
I2cstop

I2cstart
I2creceive &H75 , Lux
Print "Lux75: " ; Lux
I2cstop
Loop
End

Die 4 Blöcke mit den 4 Adressen zum Ende des codes kommen daher, dass ich als Ausgabe der eigentlichen Programmes diese 4 Adressen zurück bekommen hab.
Laut Datenblatt sollte die Adresse 0x39 sein.

Bei den Adressen &H72 und &H73 bekomme ich einen Wert von 0 zurück, bei den Adressen &H74 und &H75 bekomme ich einen Wert von 255 zurück. Diese Werte verändern sich leider nie.
Eigentlich sollten doch nur die ungeraden Adressen die zum Lesen sein?!

Hat mir evtl. jemand nen Tipp, wo meine Fehler bzw. meine Fehler liegen könnten - ich bin etwas ratlos.


[edit]
Ich hab gerade einen Schaltplan gefunden, wo jemand als Pullups gegen 3,3 Volt 10kOhm verwendet. Kann es daran liegen, dass ich die falschen Pullups verwende(1kOhm)?
[edit]

[edit]
Ich bin mir ziemlich sicher, dass ich den Fehler in meinem Code und in meinen Gedanken gefunden hab:
Nachdem das Modul ja mit 7 bit Adressen arbeitet, ich aber 8 bit Adressen abfrage finde ich binär: 01110010
Die Adresse ist aber eigentlich nur 0111001 und somit dezimal 57 anstatt 72 oder was auch immer...
Hier (http://www.rn-wissen.de/index.php/I2C#Aufbau_einer_7-Bit-Adresse) hab ich herausgefunden, dass bei 7 bit Adressen das 8 byte das lesen oder schreiben angibt wobei 1 für lesen steht. Also sollte ich mit der Adresse 011100101 meinen Sensor auslesen können?! Dezimal wäre das dann die 229 (also die ungerade Adresse) und die 228 (also die gerade Adresse) um zu schreiben.
[edit]


Viele Grüße
e.

extremesports
03.05.2012, 21:32
Hmmm... woran liegt es nur, dass das nicht will wie ich? ;-)

Hab es gerade noch mal getestet aber es funktioniert noch nicht.
Hier mal der aktuelle Code:


' BASCOM-Programm
' I2C-Scanner mit ATMega8
'
' In: beliebige I2C-Slaves an C.4=SDA und C.5=SCL
' Out: SerialOut über UART
' Funktion dieses Demo-Programmes:
' Scannen der Slave-Adressen

'$sim

$regfile = "m8def.dat" ' benutzter Mikrocontroller
$crystal = 8000000 ' Taktfrequenz

$hwstack = 40 ' Hardware Stack
$swstack = 32 ' SW Stack
$framesize = 60 ' Frame

$baud = 9600

Waitms 250

Config Sda = Portc.4
Config Scl = Portc.5

Config I2cdelay = 10

I2cinit

Dim Slaveadresse As Byte
Dim Lux As Byte
Lux = 0

Dim Lux01 As Byte
Dim Lux02 As Byte

Do
Print "I2C Slaves"
Print "suchen..."
Wait 2

For Slaveadresse = 0 To 254 Step 1 ' für alle geraden Adressen
I2cstart 'Startbedingung senden
I2cwbyte Slaveadresse ' Addresse senden

If Err = 0 Then 'I2C-Slave gefunden?
Print "Slave dec: " ; Slaveadresse
Print "h" ; Hex(slaveadresse) ; " b" ; Bin(slaveadresse)
Wait 2
End If

I2cstop 'Bus freigeben
Next

Print "Ende Scan"
Wait 2



I2cstart
I2cwbyte &H72 , Lux
If Err = 0 Then
Print "Lux72: " ; Lux
Waitms 250
Else
Print "Lux72: no ACK"
End If
I2cstop

I2cstart
I2cwbyte &H73 , Lux
If Err = 0 Then
Print "Lux73: " ; Lux
Waitms 250
Else
Print "Lux73: no ACK"
End If
I2cstop

I2cstart
I2cwbyte &H74 , Lux
If Err = 0 Then
Print "Lux74: " ; Lux
Waitms 250
Else
Print "Lux74: no ACK"
End If
I2cstop

I2cstart
I2cwbyte &H75 , Lux
If Err = 0 Then
Print "Lux75: " ; Lux
Waitms 250
Else
Print "Lux75: no ACK"
End If
I2cstop

I2cinit

I2cstart
I2cwbyte 57 '0x39
I2cwbyte 140 '0x8C
I2crbyte Lux01 , Ack
I2cwbyte 109 '0x6d
I2crbyte Lux02 , Nack

Print "erster Wert: " ; Lux01
Print "zweiter Wert: " ; Lux02

I2cinit
Loop

End

Und was Hterm dabei ausgibt:

22299

Falls da mal jemand drüber schauen kann und mir evtl. Fehler im Code aufzeigt, damit ich nachbessern kann...

Viele Grüße
e.

Klebwax
03.05.2012, 21:32
Ich hab gerade einen Schaltplan gefunden, wo jemand als Pullups gegen 3,3 Volt 10kOhm verwendet. Kann es daran liegen, dass ich die falschen Pullups verwende(1kOhm)?


Zuerst mal dazu: der I2C Bus ist digital und nicht analog. Trotzdem gibt es ein furchtbares rumgeeier mit den Pullups. Das kommt wohl daher, daß keiner mehr mit digitaler Logic, Opencollector-Ausgängen und Wired-Ors umgehen kann. Also ganz kurz: der High-Pegel sowohl von SDA als auch SCL wird nur durch die Pullups gebildet. Der Wert ist eigentlich egal, solange damit gegen die Eigangsströme aller Busteilnehmer ein High erzeugt werden kann. Da reicht leicht 1 µA oder weniger. Aber: je größer die Kapazität der Busleitung ist, desto länger dauert es das High zu erreichen. Wenn man es also zügig haben will, sollte man die Pullups klein machen. Die Grenze sind da die 3 mA, die das normgerechte Maximum für einen I2C Ausgang sind (obwohl die meisten auch mehr leisten können). Bei wenigen cm Bus und nur zwei drei Bausteinen am Bus, passen zwischen 50k und 1k, läßt sich leicht ausrechen (oder einfach mit dem Scope sehen).

Jetzt zu dem Code:

Du scanst über 256 Busadressen, der I2C hat aber nur 128. Und bevor jetzt gleich gemault wird, so stehts in der Spec. Diese Adresse wird in den obersten 7 Bit des ersten Bytes eines Telegrams übertragen. Das unterste Bit zeigt an, ob es ein Read oder Write werden wird.

Also: I2CWRITE(Adresse << 1 | RW_Bit)

Da ich dein Basic ? nicht kenne, eine art pseudo C. Wenn man nur den Bus scannen will, sollte man nur Writes schicken und dann mit Stop abbrechen. Manche einfachen Slaves wollen nach einem Read unbedingt daß der Master etwas liest und hängen bis zum nächsten Reset.

Wenn mein Hex-Rechner richtig funktioniert, ist 0x39 << 1 | 0 gleich 0x72, also gar nicht so falsch.

Da ich nicht weiß, was die Funktion "I2creceive" macht, kann ich dazu wenig sagen, nur mit 0x39 << 1 | 0 als erstes Byte kann man nur schreiben, lesen kann man mit 0x39 << 1 | 1 .

MfG Klebwax