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