Forum: Mikrocontroller und Digitale Elektronik I2C clock stretching bei Raspberry Pi Zero W


von Raspi-Nutzer (Gast)


Lesenswert?

Hallo!

Habe ein Gerät mit mehreren Chips gebaut, welches mit dem Raspberry Pi 
Zero W angesteuert wird. Der Pi sollte mit den Chips über I2C 
kommunizieren.

Ich wusste leider nicht, dass der Pi kein Clock-Stretching unterstützt. 
Nun habe ich Probleme mit den Glitches auf der Clock-Leitung.

Habe gehört, dass das Problem in Hardware liegt und ein Software-I2C 
davon nicht betroffen wäre.

Aber wie mache ich es, dass an den selben Pins wie jetzt, statt des 
Hardware-I2C ein Software-I2C werkelt?

Danke im Voraus!

von Olaf (Gast)


Lesenswert?

> Aber wie mache ich es, dass an den selben Pins wie jetzt, statt des
> Hardware-I2C ein Software-I2C werkelt?

Ganz einfach, du programmierst es dir weil es ja Software ist. .-)

Olaf

von PittyJ (Gast)


Lesenswert?

Ich habe ein Dutzend verschiedene I2C Chips am Raspi laufen.
Nur ein Chip (DLP von TI) macht Probleme. Der will laut Datenblatt auch 
Clockstrechting machen.
Die Vielzahl der anderen Chips (Temperatur, Beschleunigung, Cryptochip, 
TOF-Sensor) läuft problemlos.

Bevor du jetzt glaubst, dass das Kommunikationsproblem mit 
Clockstretching zu tun hat, lies doch einfach mal das Datenblatt, oder 
der Chip das auch wirklich machen will.

Und bevor du einen Soft-I2C implementierst oder aktivierst, schau dich 
nach Alternativen bei Chips um. Andere Hersteller haben auch schöne 
Chips, die kein Clockstretching benötigen. Das kann einfacher sein, also 
dieses Software-Dinges zu betreiben.

Als erstes würde ich aber ein Scope anschliessen, und schauen, was da 
wirklich los ist.

von Raspi-Nutzer (Gast)


Lesenswert?

Hallo!

Der Chip ist leider vorgegeben und der Grund für das ganze Projekt. Es 
ist bereits sehr viel Arbeit und auch Geld eingeflossen, weshalb es 
definitiv besser ist, den Chip beizubehalten und die Kommunikation zu 
verbessern.

Ich habe bereits mit einem Logic-Analyzerr mir alles angesehen. Immer 
dort, wo ein zu kleiner Teil des Clock-Pulses übrig bleibt, gibt es 
Probleme. Das Bit wird dann falsch gelesen.

Die Einzige Alternative, die ich mir noch vorstellen könnte, wäre eine 
Art "Taktschrittmacher", wo ein zweiter Chip den Puls unterdrückt, bis 
er voll durchgelassen werden würde vom anderen Chip.

Lieber wäre mir eine fertige Lösung in Form einer Bibliothek, die es 
erlaubt, ein beliebiges GPIO als SCL bzw SDA zu definieren. Dann könnte 
ich die I2C-Hardwareschnittstelle abschalten und das Soft-I2C auf die 
gleichen Pins mappen.

von Thomas W. (Gast)


Lesenswert?

Moin, -

Clock-stretching kann schon ein PITA sein. Einige Sensoren (z.b. die 
sht21 Serie von Sensirion) haben halt die Clock angehalten. Damit war 
die deterministische Auslesung des Sensors schwierig geworden.

- Eine Loesung war die Taktfrequenz so herunterzufahren, dass der Sensor 
so oder so fertig ist mit der Wandlung. Ob das fuer Deinen Sensor passt: 
weiss ich nicht.

- Du hast ja einen Raspberry Pi (Linux-System), wo Du so oder so eine 
Latenz bei den Reaktion des Systemes hast. Du schrubst, dass Du noch 
weitere Sensoren am Bus haettest, die bisher einwandfrei funktionieren. 
Dann koenntest Du die anderen Sensoren an dem vorhandenen Bus lassen und 
SoftSerial nur auf zwei GPIO-Pins einsetzt fuer diesen einen Sensor.

- Eventuell bietet der unbekannte Sensor auch die Moeglichkeit des 
Pollens der Daten (z.B. neue Sensirions Geraete haben ein Art Busy-Flag, 
genau wegen dieser Problematik [ja, Hersteller hoeren manchmal zu]).

- Wenn das alles nicht geht: Ein Mikrocontroller der Clock-Stretch 
dazubauen. Leider hat man eine weitere Baustelle, aber wenn Du mit 
Sensor festgelegt bist waere das noch eine Moeglichkeit.

Gruesse

Th.

von Thomas W. (Gast)


Lesenswert?

Eine Sache noch: Ich weiss ja Deinen Aufbau nicht, aber i2c bedeutet 
"Inter-Integrated Circuit" und ist nicht fuer die Langstrecke gedacht. 
Ich weiss ja auch nicht, wieviele Sensoren mit an dem Bus lauschen.

Du schrubst:
> Ich habe bereits mit einem Logic-Analyzer mir alles angesehen. Immer
> dort, wo ein zu kleiner Teil des Clock-Pulses übrig bleibt, gibt es
> Probleme. Das Bit wird dann falsch gelesen.

Bist Du sicher, dass das Clockstretching ist? Normalerweise bleibt bei 
fehlerhaften Clockstretching der Bus stehen.

Anyway, ich wuerde sagen: Send Pics

Gruesse

Th.

von (prx) A. K. (prx)


Lesenswert?

Thomas W. schrieb:
> - Eventuell bietet der unbekannte Sensor auch die Moeglichkeit des
> Pollens der Daten (z.B. neue Sensirions Geraete haben ein Art Busy-Flag,
> genau wegen dieser Problematik).
>
> - Wenn das alles nicht geht: Ein Mikrocontroller der Clock-Stretch
> dazubauen. Leider hat man eine weitere Baustelle, aber wenn Du mit
> Sensor festgelegt bist waere das noch eine Moeglichkeit.

Clock Stretching ist typisch für Slaves, die einen eigenen 
Microcontroller drauf haben. Dann nützt auch kein Busy-Flag, weil der µC 
an bestimmten Stellen im Protokoll per Interrupt reagieren muss und der 
Takt bis dahin automatisch geklemmt wird. Das muss er bei der 
Busy-Abfrage dann auch.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Thomas W. schrieb:
>> Ich habe bereits mit einem Logic-Analyzer mir alles angesehen. Immer
>> dort, wo ein zu kleiner Teil des Clock-Pulses übrig bleibt, gibt es
>> Probleme. Das Bit wird dann falsch gelesen.
>
> Bist Du sicher, dass das Clockstretching ist? Normalerweise bleibt bei
> fehlerhaften Clockstretching der Bus stehen.

Seine Beschreibung entspricht dem dokumentierten Verhalten des Raspberry 
Pi I2C Masters bei Clock Stretching.

http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html

: Bearbeitet durch User
von Patrick C. (pcrom)


Lesenswert?

Raspi-Nutzer schrieb:
> Nun habe ich Probleme mit den Glitches auf der Clock-Leitung.
Was haben glitches mit Clock Strechting zu tun ?

Raspi-Nutzer schrieb:
> wo ein zu kleiner Teil des Clock-Pulses übrig bleibt
Wie meinst du 'zu kleiner Teil'

Wie bereits von anderen genennt, :
- Bist du sicher das Problem wird von (Nicht)-clock stretching 
verursacht ?
- Geschwindigkeit der I2C zurueckbringen

Patrick aus die Niederlaende

von Thomas W. (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Thomas W. schrieb:
>>> Ich habe bereits mit einem Logic-Analyzer mir alles angesehen. Immer
>>> dort, wo ein zu kleiner Teil des Clock-Pulses übrig bleibt, gibt es
>>> Probleme. Das Bit wird dann falsch gelesen.
>>
>> Bist Du sicher, dass das Clockstretching ist? Normalerweise bleibt bei
>> fehlerhaften Clockstretching der Bus stehen.
>
> Seine Beschreibung entspricht dem dokumentierten Verhalten des Raspberry
> Pi I2C Masters bei Clock Stretching.
>
> http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html

OK.

von Peter D. (peda)


Lesenswert?

Bei Slaves mit Clock Stretching steht typisch im Datenblatt, daß SCL 
bidirektional ist, d.h. kein reiner Eingang.

von 888 (Gast)


Lesenswert?

Patrick C. schrieb:

> Was haben glitches mit Clock Strechting zu tun ?

Clock Stretching bedeutet, der Slave hält SCL weiter auf Low, nachdem 
der Master die High-Phase eingeleitet hat. Wenn nun der Master das nicht 
bemerkt (weil SCL nicht bidirektional ausgeführt ist) und einfach sein 
Tempo beibehält, dann verkürzt sich die High-Phase des Taktes, oder sie 
wird sogar übersprungen.

von (prx) A. K. (prx)


Lesenswert?

Soul E. schrieb:
> Wenn nun der Master das nicht bemerkt

Oder wenn Clock Stretching zwar vorgesehen aber falsch implementiert 
ist, wie beim Raspberry Pi Prozessor.

: Bearbeitet durch User
von Sebastian W. (wangnick)


Lesenswert?

Raspi-Nutzer schrieb:
> Aber wie mache ich es, dass an den selben Pins wie jetzt, statt des
> Hardware-I2C ein Software-I2C werkelt?

https://github.com/fivdi/i2c-bus/blob/master/doc/raspberry-pi-software-i2c.md

LG, Sebastian

von Lothar (Gast)


Lesenswert?

Es gibt ja SPI / I2C Konverter z.B. SC18IS600 da steht aber nicht im 
Datenblatt ob der Clockstretching kann.

Alternativ geht natürlich noch ein kleiner uC der zwischen Pi I2C und 
I2C Clockstretching Slave übersetzt z.B. EFM8BB3 hat I2C Master und 
Slave in Hardware.

von (prx) A. K. (prx)



Lesenswert?

Lothar schrieb:
> Es gibt ja SPI / I2C Konverter z.B. SC18IS600 da steht aber nicht im
> Datenblatt ob der Clockstretching kann.

Doch, das steht drin. SCL müsste dafür I/O sein.

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Doch, das steht drin. SCL müsste dafür I/O sein.

Vielleicht kann der SC18IS600 doch Clockstretching??

Im Datenblatt steht:

I2C-bus serial interface

Serial clock synchronization can be used as a handshake mechanism to 
suspend and resume serial transfer

... when an I2C-bus slave is (continuously) pulling the SCL clock LOW. 
An interrupt is generated on INT.

von EAF (Gast)


Lesenswert?

Raspi-Nutzer schrieb:
> mit dem Raspberry Pi Zero W
Den kenne ich nicht...
Aber beim 3B hatte ich vergleichbare Probleme.

Erkenntnis daraus:
Stretching innerhalb eines Bytes mag es gar nicht!
Stretching zwischen Bytes, kein Problem, bzw. in Grenzen Einstellbar.

von PittyJ (Gast)


Lesenswert?

Bei einem Raspi haben wir Software I2C aktiviert, um die Probleme mit 
Clockstretching zu umgehen.
Ging irgendwie in der config.txt

dtoverlay=i2c-gpio
dtparam=i2c_gpio_sda=44,i2c_gpio_scl=45

von Raspi-Nutzer (Gast)


Lesenswert?

Halo!

Danke für eure Hilfe!

Die Lösung ist, den entsprechenden Block in /boot/config.txt anzupassen:

# Uncomment some or all of these to enable the optional hardware 
interfaces
#dtparam=i2c_arm=on
dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=1,i2c_gpio_sda=2,i2c_gpio_scl 
=3
#dtparam=i2s=on
#dtparam=spi=on

Damit schaltet man das Hardware-I2C ab und mappt das Software-I2C auf 
die Pins, wo normalerweise die das Software-I2C läuft. Dadurch rettet 
man auch die schon fertige Hardware, die an diesen Pins I2C erwartet.

Im C++ Code (falls man WiringPi verwendet) dann einfach:

i2c_dev=wiringPiI2CSetupInterface("/dev/i2c-3", 0x42);

Die restlichen Funktionen müssen nicht verändert werden.

Soweit ich informiert bin, kann man auch mehrere I2Cs in Software 
implementieren, wobei man dann mit den höheren Nummern beginnen muss. 3 
muss die kleinste Nummer sein.

Seinen Erfolg kann man mit "i2cdetect -l" überprüfen, wenn man die 
i2c-tools installiert hat. (sudo apt update && sudo apt install 
i2c-tools)


Hoffe mit dieser Zusammenfassung konnte ich zukünftigen Lesern das Leben 
etwas vereinfachen!

von Heinz (Gast)


Lesenswert?

Hallo,

ich habe auch mit dem Clock-Stretching Bug des Raspi gekämpft. Letztlich
habe ich die I2C Datenrate runtergesetzt. Die externen Chips stretchen 
immernoch, aber dadurch, dass der Clock langsamer läuft wirkt es sich 
nicht mehr negativ aus.

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.