I2C-Bus mithören

Gast #401101
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
#401103
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
Gast #401104
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.
Angehängte Dateien:
Gast #401105
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?
#401109
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
Gast #401110
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
#401111
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

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