Forum: Mikrocontroller und Digitale Elektronik I2C im Bitbang-Mode über FT232H


von I2C-Haderer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche nun schon seit zwei Tagen, einen Sensirion SHT25-
Feuchtesensor ans Laufen zu bekommen, doch leider bisher ohne
Erfolg. Ich hänge an einer bestimmten Stelle fest und komme
gerade nicht weiter; vielleicht hat ja jemand von Euch eine
Idee, woran es liegen könnte ? Wahrscheinlich ist es nur
irgendeine Kleinigkeit, die ich übersehen habe...

Folgendes Setup:

Der Sensor hat ein I2C-Interface. Dieses will ich über
Bitbanging via einen FT232H-Chip von FTDI ansteuern, welcher
über USB mit meinem PC verbunden ist. Programmiert werden soll
das ganze in VB.Net 2005. Den MPSSE-Mode vom FT232H möchte ich
bewußt nicht verwenden.

Der FT232H steckt in einem fertigen USB-Kabel von FTDI drin
(Typ C232HD-DDHSP-0), in welchem die Leitungen des in einigen
Beispielen benutzten CBuses nicht herausgeführt sind. D. h.
ich kann nur den DBus benutzen. Von diesem sind die einzelnen
Pins über farbcodierte Litzen nach außen geführt.

Ich habe ADBUS0 (orange) mit SCL verbunden und ADBUS1 (gelb)
mit SDA. Schwarz ist GND und Rot ist +3.3V. Da der SHT25 nur
wenige 100 µA zieht, müßte die Versorgung aus dem FTDI-Kabel
ausreichen. 100 nF Abblockung sind vorhanden, ebenso jeweils
10 kOhm Pullups an SCL und SDA.

Auf dem PC habe ich mir den aktuellen FTDI-Treiber mit der
D2XX.DLL installiert.

Die Kommunikation mit dem FT232H funktioniert grundsätzlich;
ich kann aus meinem VB.Net-Programm heraus dessen Seriennummer
abfragen. An den Leitungen SCL und SDA werden vom Programm
wie gewünscht entsprechende Logikpegel ausgegeben, dies habe ich
mit einem Oszi überprüft (das Bild ist von Hand zusammengestückelt,
da mit dem Oszi nur Screenshots möglich waren).

Das Einlesen von Pegeln an der SDA-Leitung funktioniert grundsätzlich
auch. Wenn ich SDA per Kurzschlußbrücke auf GND zwinge, dann kann ich
das mit der Funktion FT_GetBitMode detektieren.

Das Problem ist nun, daß trotzdem mit dem SHT25 keine Kommunikation
zustande kommt. Ich habe versucht, das Beispiel für eine Temperatur-
messung im No-Hold-Master-Mode aus dem Datenblatt nachzuprogrammieren.

Die I2C-Routinen habe ich einem Beispiel-Source-Code nachempfunden,
den ich für den LM75-Sensor im  Internet gefunden hatte. Dieser wird
dort auch im Bitbang-Mode angesteuert, allerdings an einer seriellen
Schnittstelle vom PC.

Schreiben in den SHT25 kann ich offenbar (mit Write-Adresse &H80 und
Read-Adresse &H81); es sieht auch so aus, als ob der Sensor ein ACK
zurückgeben würde. Jedoch bin ich mir hier schon nicht mehr ganz sicher,
ob SDA bei der ACK-Abfrage wirklich vom Sensor (bzw. dessen Pullup)
hochgezogen wird oder durch den FT232H.

Lesen aus dem SHT25 funktioniert hingegen aber leider nicht. Jedes
Byte, das ich versuche auszulesen, hat den Wert &HFF.

Und genau an der Stelle hänge ich nun.

Schafft es der SHT25 vielleicht aus irgendeinem Grund nicht,
SDA auf Low zu ziehen; vielleicht weil durch einen Programm-
fehler der FT232H mit High dagegenhält ? Oder stimmt sonst
etwas an der I2C-Umsetzung nicht ?

Hartes externes herunterziehen auf Low funktioniert wie gesagt
und wird vom Programm dann auch erkannt.

Anbei das VB.Net-Programm, dessen Ausgabe aus dem Debug-Fenster
und der Screenshot der Signale auf dem I2C-Bus.
Achso, bei dem Screenshot versuche ich nicht, einen Temperatur-
wert aus dem Sensor auszulesen, sondern (einen Teil) seiner
Seriennummer (es gibt von Sensirion eine Anleitung dafür), jedoch
auch mit dem gleichen grundsätzlichen Problem, daß nur &HFF
auf SDA eingelesen wird.

Ich habe nun schon alles noch einmal durchgesehen und einiges
rumprobiert, aber hier hängt es nun irgendwie.

Falls mir jemand weiterhelfen kann, so möchte ich mich schon
einmal herzlich bedanken.

von tt2t (Gast)


Lesenswert?

> ebenso jeweils 10 kOhm Pullups an SCL und SDA.

Die Pullups sind viel zu gross, das ist ein beliebter Fehler bei der 
I2C-Bestückung. Der Strom durch die Widerstände soll laut I2C-Defintion 
bei LO-Pegel etwa 3 mA (!) betragen. 2.2k oder 1.8k sind bei 5 Volt ein 
guter Erfahrungswert, bei 3.3 Volt etwa 1k.

von Jörg S. (joerg-s)


Lesenswert?

>Der Strom durch die Widerstände soll laut I2C-Defintion bei LO-Pegel etwa
>3 mA (!) betragen.
Ja, aber MAXIMAL!
Mit 10k ist das (wenn die Leitung nicht ewig lang ist) kein Problem.



>Schreiben in den SHT25 kann ich offenbar (mit Write-Adresse &H80 und
>Read-Adresse &H81); es sieht auch so aus, als ob der Sensor ein ACK
>zurückgeben würde.
So wie ich das sehe scheint der Screenshot zu zeigen das du nach jedem 
Byte ein Stop machst (steigende Flanke SDA bei SCL high).

von Klaus (Gast)


Lesenswert?

Sind die Ausgänge des FT232H überhaupt I2C kompatibel, also open 
collector, oder sind es nicht push-pull Ausgänge, also für I2C garnicht 
geeignet?

MfG Klaus

von I2C-Haderer (Gast)


Lesenswert?

Oh, so viele Antworten in so kurzer Zeit.

Vielen Dank Euch schon mal soweit !

Den Wert für die 10 kOhm hatte ich einfach einmal aus dem
Sensirion-Datenblatt entnommen. Wäre aber ev. einen Versuch
wert, die Widerstände mal auf 1 kOhm zu verringern.

Das mit dem Stop nach jedem Byte muß ich noch einmal checken.
Wenn, dann sollte das nicht absichtlich so sein.

Die Ausgänge vom FT232H schaue ich mir auch einmal genauer an.
Kann ich aber erst am Montag machen.

von Michael A. (Gast)


Lesenswert?

I2C-Haderer schrieb:
> Schafft es der SHT25 vielleicht aus irgendeinem Grund nicht,
> SDA auf Low zu ziehen; vielleicht weil durch einen Programm-
> fehler der FT232H mit High dagegenhält ?

Wer da an der Leitung zieht bzw. nicht erfolgreich ziehen kann, läßt 
sich doch bequem mit einem kleinen Widerstand in der Leitung, an dem 
z.B. 200mV abfallen, feststellen. Bei 3.3V VCC und 10kΩ Pull-up sollten 
680Ω passen, um die Stromrichtung sichbar zu machen, ohne dass die 
Logikpegel nicht mehr erkannt werden.

von I2C-Haderer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe es zwischenzeitlich hinbekommen, mit dem Sensor im
Bitbang-Modus über den FT232H zu kommunizieren.

Da ich Forenpostings hasse, die beim vorhergehenden Satz enden,
will ich Euch nicht vorenthalten, was ich gemacht habe.

Ich habe zunächst einmal überprüft, ob der FT232H
Open-Drain-Ausgänge hat. So direkt konnte ich dazu im
Datenblatt nichts finden, jedoch gibt es eine AN113 von
FTDI, in welcher der Chip an ein I2C-EEPROM angeschlossen wird
(allerdings im MPSSE-Mode betrieben), was dann eigentlich nur
funktionieren kann, wenn dem der Fall ist.

Der Wert der Pull-up-Widerstände war letztendlich gar nicht
das Problem, es funktioniert jetzt auch mit 10kOhm (steht auch
so im Datenblatt). Kleinere Pull-ups werden wohl erst benötigt,
wenn die Taktrate höher wäre.

Der Fehler meinerseits war folgender:

Ich habe den ADBus1-Port des FT232H immer als Ausgang beschalten,
sowohl wenn darüber ein Low, als auch wenn ein High auf die SDA-
Leitung gegeben werden soll. Für Low muß das so sein, für High
jedoch nicht, da in dem Fall der High-Pegel durch den externen
Pull-up erzeugt wird.
Wenn der High-Pegel aber auch vom FT232H getrieben wird, dann
schafft es der SHT25 nicht, die SDA-Leitung für das ACK auf
Low zu ziehen. Um den Port vom FT232H hochohmig zu bekommen,
setzte ich ihn nun als Input, wenn ich de facto darüber ein
High ausgeben will. Wenn SDA vom FT232H auf Low gezogen werden
soll, muß er vorher wieder als Output gesetzt werden.

Ich hätte da auch früher draufkommen können, weil im Datenblatt
des SHT25 heißt es dazu deutlich:
"To avoid signal contention the micro-controller unit (MCU) must
only drive SDA and SCL low."
Gut, für SCL beachte ich das nun nicht, aber ich denke, das spielt
nur im Hold-Master-Mode des SHT25 eine Rolle.

Daß der SHT25 es nicht schaffte, SDA fürs ACK auf Low zu ziehen,
konnte ich letztendlich dann auch auf dem Oszi sehen (war nicht
leicht, den Screenshot an der richtigen Stelle auszulösen). Mit
ADBus1 für High als Output lag der Pegel auf SDA während des ACK
bei 1.8 V, was für ein Low definitv zu hoch ist.

An der Reihenfolge, wann in den einzelnen I2C-Sequenzen welche
Leitung auf High bzw. Low gesetzt wird, habe ich auch noch ein
wenig rumgespielt; es kann gut sein, daß an der ein oder anderen
Stelle hier softwareseitig auch noch ein Bug drin war.

Es funktioniert nun aber wie gesagt und damit bin ich erstmal
zufrieden. Anbei die soweit laufende Test-Anwendung. Die Temperatur
und die rel. Feuchtigkeit können damit ausgelesen werden, ebenso
der erste Teil der Seriennummer des SHT25 (den zweiten Teil müßte
man noch hinzufügen...). Aktuelle Raumtemperatur ist 23.5 °C bei
53 % Feuchte.

vielen Dank noch einmal allen, die geantwortet haben !

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.