Forum: Mikrocontroller und Digitale Elektronik i2c verständnissfrage Si1141 wann bit setzten/lesen


von Christian G (Gast)


Lesenswert?

Hallo,

ich versuche mich gerade daran den Si1141/42/43 Sensor auf dem deca fpga 
board zum laufen zu bringen und hab da etwas Schwierigkeiten das i2c 
timing zu verstehen. Genauer wann SDA umgeschaltet werden soll (input / 
output) und wann der Zustand von SDA gesetzt / gelesen werden soll.

Im db des Sensors stehen folgende Angaben:
1
SCL freq: max 3.4 MHz
2
Clock Pulse Width Low: min 160 ns
3
Clock Pulse Width High: min 60 ns
4
Rise Time: min 10 ns, max 40 ns
5
Fall Time: min 10 ns, max 40 ns
6
Start Condition Hold Time: min 160 ns
7
Start Condition Setup Time: min 160 ns
8
Input Data Setup Time: min 10 ns
9
Input Data Hold Time: min 0 ns
10
Stop Condition Setup Time: min 160 ns

Ich würde SCL mit 400KHz betreiben.

Mein Plan (ausgenommen während der start / stop condition) ist 
umschalten von SDA (input / output) sowie setzen von SDA in der Mitte 
der SCL Low Phase und lesen von SDA in der Mitte der SCL High Phase.

Was mich dabei aber etwas verwirrt ist die Input Data Hold Time: min 0 
ns. Bedeutet das jetzt wenn ich SDA lesen möchte z.B. ACK/NACK vom 
Sensor das ich das beim Flankenwechsel (low->high) von SCL machen sollte 
weil in der Mitte der SCL High Phase evtl. der Zustand nicht mehr valide 
ist oder interpretiere ich da einfach zuviel rein?

Wollte das einfach nur verstanden haben bevor ich jetzt wild drauflos 
designe und mich dann nachher wundere warum es evtl. nicht funktioniert.

Thx

von Tim (Gast)


Lesenswert?

Wenn das Bauteil sich wirklich an den I2C-Standard hält kannst Du 
alternativ auch in der I2C-Spezifikation von NXP nachsehen falls da noch 
Fragen zum Signaltiming offen sind. In der Regel dürften die meissten 
hier eine fertige I2C-Libary benutzen und sich damit wohl kaum 
beschäftigen.

Viel Erfolg beim Projekt.

von STK500-Besitzer (Gast)


Lesenswert?

Tim schrieb:
> In der Regel dürften die meissten hier eine fertige I2C-Libary benutzen
Das gilt für FPGA-Programmierer, oder?
Beim Microcontrollern ist sowas in die Hardware integriert.

von Frank K. (fchk)


Lesenswert?

Christian G schrieb:

Lese den Standard. Da steht alles drin, was Du wissen musst.

https://www.nxp.com/docs/en/user-guide/UM10204.pdf

> Mein Plan (ausgenommen während der start / stop condition) ist
> umschalten von SDA (input / output) sowie setzen von SDA in der Mitte
> der SCL Low Phase und lesen von SDA in der Mitte der SCL High Phase.

Ja. SDA darf sich nur ändern, solange SCL stabil low ist. Sobald SCL 
wieder am Steigen ist, muss SDA eingeschwungen sein.

> Was mich dabei aber etwas verwirrt ist die Input Data Hold Time: min 0
> ns. Bedeutet das jetzt wenn ich SDA lesen möchte z.B. ACK/NACK vom
> Sensor das ich das beim Flankenwechsel (low->high) von SCL machen sollte
> weil in der Mitte der SCL High Phase evtl. der Zustand nicht mehr valide
> ist oder interpretiere ich da einfach zuviel rein?

Das ACK-Bit ist ein normales Daten-Bit, und dafür gilt das gleiche.

Wie gesagt, lies den Standard.

fchk

von Thorsten S. (thosch)


Lesenswert?

Christian G schrieb:
> Rise Time: min 10 ns, max 40 ns
> Fall Time: min 10 ns, max 40 ns

Das ist svhonmal nicht I2C-konform.
So schnelle Risetime ist mit den im I2C-Standard festgeschriebenen
open-Collector bzw. Open-Drain Ausgängen und Pull-Up-Widerständen nicht 
erzielbar.

Ich hatte mal Audio-ICs, die auch solche nichtkonformen Parameter 
forderten und sich am konformen I2C auch ständig verschluckten...

Bei dem Teil galt das nur für die SCL Leitung. Hat man die Push-Pull 
getrieben, lief es zuverlässig.

Da am gleichen Bus ein anderes IC hing, welches Clockstretching macht, 
war das jedoch keine Lösung.

Ich hatte das Problem dann mit einer modifizierten Ausgangsansteuerung 
im FPGA gelöst: Der Ausgang wurde einen Taktpunkt lang aktiv high 
getrieben, um die steigende Flanke steil zu bekommen, danach I2C-konform 
hochohmig.
Damit ging dann auch das Clockstretching des anderen ICs.

von Oliver S. (oliverso)


Lesenswert?

Thorsten S. schrieb:
> Das ist svhonmal nicht I2C-konform.
> So schnelle Risetime ist mit den im I2C-Standard festgeschriebenen
> open-Collector bzw. Open-Drain Ausgängen und Pull-Up-Widerständen nicht
> erzielbar.

Christian G schrieb:
> SCL freq: max 3.4 MHz

Finde den Fehler...

Oliver

von Christian G (Gast)


Lesenswert?

Danke für die Antworten.

Ich habe es erstmal hinbekommen in dem ich alles einen Takt(20ns) nach 
dem Flankenwechsel von SCL mache.
Der output des Sensor ist aber wohl auch über die ganze high Phase von 
SCL stabil.
Die SCL Frequenz habe ich erstmal auf 400KHz gelassen, die max. 3.4MHz 
teste ich die Tage mal.
Der Sensor scheint auch kein clock-stretching zu machen, steht auch 
nichts davon im db.

VG

von W.S. (Gast)


Lesenswert?

Christian G schrieb:
> Mein Plan (ausgenommen während der start / stop condition) ist
> umschalten von SDA (input / output)

Das war wohl nix. Also: ob man lesen oder schreiben will, wird bei der 
Adressierungsphase festgelegt.
Also
- StartCond
- Adressierung: Adresse und R/W-Bit
- ...

Was du vermutlich meinst, ist der Bitwechsel bei der Übertragung. Die 
MUSS bei Clock=Low erfolgen, sonst ist es je nach Datenwechsel eine 
StartCond oder eine StopCond.
Ich mache es bei reinem Software-Interface zumeist so, daß ich immer 
einen Abstand der Datenänderung von den Flanken des Clocksignals lasse. 
Dadurch wird das Clock-Signal zumeist ein wenig unsymmetrisch. Das 
sollte aber nach menschlichem Ermessen etwas weniger wichtig sein, als 
ein bissel Abstand der Datenwechsel zu den Clockflanken.

W.S.

von Christian G (Gast)


Lesenswert?

Hi W.S. Danke für deine Antwort, evtl. habe ich mich etwas 
missverständlich ausgedrückt mit umschalten von SDA (input / output) 
meinte ich wirklich das setzten des SDA fpga Pins von 'Z' auf '0' oder 
'1' und umgekehrt. Das mit dem rw Bit hinter der Adresse läuft alles, 
bekomme korrekte Daten vom Sensor und dieser auch von mir.

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.