Forum: Mikrocontroller und Digitale Elektronik I²C bricht Verbindung ab


von Christian E. (c-e)


Lesenswert?

Hallo,

ich habe ein Problem mit einer I²C-Verbindung, die nach einigen 
gesendeten Bytes einfach abbricht. Aber erst mal von vorne: Ich habe 
einen 32bit µC von Fujitsu am I²C-Bus hängt ein Video Input Processor 
(SAA7113, tut aber eigentlich nix zur Sache), den ich über den Bus 
konfigurieren will, sprich es werden vom Master nur Daten gesendet.

Die Daten sehen so aus:
1
static const UINT8 vic_params[] = {
2
  0x01 , 0x08,  /* Horizontal Increment delay, recommanded */
3
  0x02 , 0xC0,  /* Input,Composite */
4
  0x03 , 0x33,  /* Analog Control , Enable */
5
  0x04 , 0x00,  /* Gain Control */
6
  0x05 , 0x00,  /* Gain Control */
7
        .....usw

Der äußere Aufbau zum Senden sieht so aus:
1
for (i=0; i < sizeof(vic_params); i += 2)
2
  {  
3
    I2C_Start(VIC_ADDR | I2C_WRITE); // Send slave address
4
    I2C_Write(vic_params[i]);  // Send "sub" address
5
    I2C_Write(vic_params[i+1]); // Send value
6
    I2C_Stop();
7
        }

Die Treiberfunktionen hab ich aus einemn Fujitsu-Beispiel-Programm 
entnommen.
Ich hab sie mal verlinkt der Übersichtlichkeit halber:
http://www.file-upload.net/download-345641/i2ctreiber.txt.html


Ziemlich häufig bleibt die Verbindung beim Senden der Daten des 
11.Sendezyklus (Adresse senden, Subadresse senden, Daten senden) hängen.
und zwar in der while-Schleife der Funtkion I2C_Write. Ab und zu 
funktioniert auch das komplette Senden, ist aber eher selten. Habe schon 
400 und 100kbit/s ausprobiert.


Und hier sind noch 3 Oszi-Screenshots, vielleicht helfen die ja auch:
Normaler Sendezyklus: http://www.abload.de/img/i2c_1syr.jpg
Abbruchstelle: http://www.abload.de/img/i2c_2whv.jpg


Im µC-Handbuch ist noch der folgende Flowchart drin: 
http://www.abload.de/img/zwischenablage01c98.jpg
Wie man sieht fehlt in den Treiber die Arbitration Lost Abfrage, ist das 
die Ursache?
Und warum ist die steigende Flanke der Signale eigentlich so kapazitiv 
geprägt?

Vielleicht hat ja jemand von euch einen Tipp für mich.
Auf jeden Fall schonmal vielen Dank

von Christian E. (c-e)


Lesenswert?

Hab jetzt mal noch ein bisschen rumprobiert, auch selbst die Routinen 
nach meinen Vorstellungen neu gemacht. Die Fehlerursache ist, dass 
irgendwer (Master/Slave?) die SDA-Leitung ab und zu einfach dauerhaft 
auf Masse zieht (sieht man auch oben im verlinkten Screenshot). Somit 
kann der Master dann natürlich nichts mehr senden, da sofort der 
Arbitration Loss Fehler kommt.

Was kann denn die Ursache dafür sein?

Das sind die Hardwarebestandteile:

Host CPU: 
http://mcu.emea.fujitsu.com/mcu_tool/detail/SK-91F467-FLEXRAY.htm

Grafik-Controller + Video Input Processor + andere Bauteile, alle 
anscheinend über I2C konfigurierbar: 
http://www.fujitsu.com/emea/services/microelectronics/gdc/gdcdevices/mb86276-lime.html

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.