bidirektionale Level-Converter I2C
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-channe...verter-TXB0108
- http://www.lipoly.de/index.php?main_...word=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
Liste der Anhänge anzeigen (Anzahl: 1)
@ PICture : Tut mir leid, wollte dir natürlich keinen Strich durch die Rechnung machen. ;)
Anhang 22158
Die Schaltung bei Lipoly wird in etwa so aussehen. Für TWI brauch man die natürlich genau 2mal.
Liste der Anhänge anzeigen (Anzahl: 1)
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...
Anhang 22240
Gerüße
e.
Liste der Anhänge anzeigen (Anzahl: 1)
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:
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:
Anhang 22299
Falls da mal jemand drüber schauen kann und mir evtl. Fehler im Code aufzeigt, damit ich nachbessern kann...
Viele Grüße
e.