I2C clock stretching bei Raspberry Pi Zero W

Gast #7137779
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!
Gast #7138413
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.
Gast #7138676
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.
Gast #7138712
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.
Gast #7138724
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.
#7138728
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.
#7138733
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
#7138739
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
Gast #7138744
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.
Gast #7138828
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.
Gast #7138896
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.
Gast #7139167
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.
Gast #7142708
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!
Gast #7143090
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren