Forum: Mikrocontroller und Digitale Elektronik I2C-Bus mithören


von Andy Nagel (Gast)


Lesenswert?

Hallo Leute,

ich habe folgendes Anliegen:

Ich habe ein geschlossenens System (eine Automatensteuerung). In diesem
System bedindet sich ein I2C-Datenbus, mit einem Master und mehren
Slaves. Jetzt möchte ich mit einem externen Mikrocontroller auf den Bus
gehen und diesen abhören.
Wenn zum Beispiel der Master vom Slave ein Byte anfordert, soll der
externe Mikrocontroller auch dieses Byte lesen und nun eine
Folgefunktion einleiten....!
Es reicht wenn der externe Mikrocontroller NUR LESEN KANN!!!


Wie wird sowas realisiert?

Ich steht Gedanklich im Wald!!!!

danke für eure IDEEN!!!

Andy

von Sven F. (sven0876)


Lesenswert?

ABO such ich auch!

von Bernhard S. (bernhard)


Lesenswert?

Hallo Andy,

ist eigentlich kein Problem, um Dir etwas Mut zu machen.

Ich hoffe die SCL-Frequenz dieses Systems ist nicht zu hoch?

Was benötigst Du?

- Einen µC mit ext. Interrupt, um die
  Start-STOP-Prozedur besser zu erkennen
- Ist die SCL-Frequenz bekannt? Wenn nicht ==> mit Oszi messen

Lösungsvariante:

Der µC muss die Startprozedur bzw. Repead-START erkennen und
bei jedem SCL-Takt die SDA -Leitung abfragen.

Anschließend kannst Du die Adresse,R/W, und das/die Datenbyte
auswerten.

Die Stopp-Prozedur sollte auch vom µC erkannt werden.

Anmerkung:

Der Aufbau dieses Datenprotololls findest Du z.B. gut beschrieben in
den Datenblättern der µC (z.B. ATmega8)

Bernhard

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein kleiner Programm für einen tiny2313. Ich nutze die USI im TWI
Modus um die Daten zu empfangen.
Die empfangenen Daten werden per UART gesendet.
Folgende Ereignisse werden gemeldet:
Start, Stop, Byte übertragen, ACK/NAK

Bei mir funktionierte das ganze wunderbar, aber ich habe keine Ahnung
wie schnell der I2C Bus maximal sein darf. Bei 100kHz und keinem lang
anhaltenden Dauertransfer hatte ich bisher keine Probleme.

von Andy Nagel (Gast)


Lesenswert?

Hallo Bernhard,

Mut machen ist gut:-)

Habe eine Frequenz von 200kHz. Sollte nicht das Problem sein!

Habe ich das richtig verstanden, das ich jede positive Flanke(über INT)
auf SCL erkenne , und dann im Interrupt prüfe ob SDA HIGH oder LOW
ist.
Die ersten 7 Besuche im INT-Interrupt geben die Adresse an. Der 8
Besuch R/W....... 9 Besuch ACK . Besuch 10- bis 17 das Datenbit???????

Das soll funktionieren=????

Oder kann ich mit dieser methode irgendwelche Probleme bekommen oder
geht es auch leichter?

von Jogibär (Gast)


Lesenswert?

Hallo,

wenn Du z.B. einen AVR mit I2C Schnitstelle nimmst, kannst Du diesen
als Slave konfigurieren.
Ich glaube, da gibt es irgenwie eine "Mithörfunktion".
Schau mal ins Datenblatt z.B. ATMEGA8

mfg
Jogibär

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

I2C Sniffer:

Schematics und Programm.

von mydani (Gast)


Lesenswert?


von Bernhard S. (bernhard)


Lesenswert?

Hallo Andy,

>Habe eine Frequenz von 200kHz. Sollte nicht das Problem sein!

da blieben bei 16MHz µC-Takt, 80 Takte zur Auswertung, das müsste
reichen


>Habe ich das richtig verstanden, das ich jede positive Flanke(über
>INT)auf SCL erkenne , und dann im Interrupt prüfe ob SDA HIGH oder
>LOW ist.

SCL und SDA muss auf Flankenwechsel geprüft werden.

Bsp START      : SDA wird LOW, aber SCL noch HIGH
Bsp Übertragung: SCL wird HIGH, SDA LOW oder HIGH
BSP STOP       : SCL ist HIGH, SDA Pegelwechsel

>Die ersten 7 Besuche im INT-Interrupt geben die Adresse an. Der 8
>Besuch R/W....... 9 Besuch ACK . Besuch 10- bis 17 das
>Datenbit???????

korrekt

>Das soll funktionieren=????

Ja, ABER!!!

Es kann sein, dass sich der Programmierer nicht an dieses Standard

Protokoll halten wollte und in Deinem konkreten Fall davon abgewichen
ist.

Das wirst Du aber sicherlich beim programmieren sehr bald feststellen.

Hierzu gab es hier mal vor einiger Zeit ein sehr interessanten Beitrag
über ein Autoradio (9-Datenbytes).



Hallo Jogibär,

>Ich glaube, da gibt es irgenwie eine "Mithörfunktion".
>Schau mal ins Datenblatt z.B. ATMEGA8

Wo soll denn das stehen, habe es noch nicht rauslesen können?



Bernhard

von Andy Nagel (Gast)


Lesenswert?

Danke Bernhard!

Bin gerade dabei mir eine solche Routine zu schreiben!
Hast du schon erfahrung mit dieser Problematik?
Programmiere in C.

Habe jetzt schon mehrfach im Datenblättern versch. ATMEL Controller
nach einer solchen Mithörfunktion gesucht....aber OHNE ERFOLG!!

Gruss Andy

von Bernhard S. (bernhard)


Lesenswert?

Hallo Andy,

>Bin gerade dabei mir eine solche Routine zu schreiben!
>Hast du schon erfahrung mit dieser Problematik?

Ich würde einen µC mit 16 MHz takten und die externen Interrupts nutzen
(Atmega8 ==> 2Stk)

Hat den Vorteil, dass Du jedes I2C-Protokoll (8 oder 9-Bit -Pakete)
mitlesen könntest)

>Programmiere in C.

Hoffentlich ist C dazu in der Lage (200kHz), da Du nur wenige Takte zur
Verfügung hast.

Benedikt hat sich schon mit diesem Thema tiefgründiger beschäftigt,
vielleicht hielft Dir sein Beispiel weiter?

Wäre Assembler für diesen konkreten Anwendungsfall nicht
treffsicherer?


>Habe jetzt schon mehrfach im Datenblättern versch. ATMEL Controller
>nach einer solchen Mithörfunktion gesucht....aber OHNE ERFOLG!!

Eigentlich benötigst Du nur den konkreten Protokollaufbau

(s. Datenblatt ATmega8), der Rest ist dann Fleißarbeit nach der

Methode "Versuch und Irrtum"  ;)



Vielleicht hilft Dir dieses kleine Werkzeug zum experimentieren etwas:

http://www.mikrocontroller.net/forum/read-4-291891.html

Bernhard

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.