Forum: Mikrocontroller und Digitale Elektronik Fragen zum I2C Bus.


von Matthias (Gast)


Lesenswert?

Servus Leute,

hab momentan ein kleines Verständnisproblem und wohl auch ein 
Ausführungsproblem mit meine I2C Bus.

Controller ist ein Mega 16 und Endgerät ist ne Kamera Typ C3088.
Die SCL und SDA sind beide mit 10k auf VCC.

Laut Datenblatt ist die Slave-Adresse der Kamera C1 in Hex.

Mein Quellcode ist so...(Bascom)
----------------------------------------------------
Config Sda = Portc.1
Config Scl = Portc.0

I2cinit

Dim X As Byte

   X = 0

   I2cstart
   I2cwbyte &HC1
   I2cwbyte &H00
   I2crbyte X , Ack
   I2cstop


   Print #1 , X
----------------------------------------------------

Aber ich krieg nur FF zurück egal ob ich bei i2crbyte mit Ack oder Nack 
anspreche.

Habt ihr ne Idee worans liegen könnte, denn normalerweise sollte bei der 
Adresse C1:00 als Rückgabe auch 00 kommen da der Gain defaultmässig auf 
00 steht.

MfG
Matthias

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Als 4. von 81 Treffern findet Google mit den Suchworten C3088 camera 
datasheet:

http://www.robozes.com/inaki/dproject/
http://www.robozes.com/inaki/dproject/report.pdf

Kurze Zusammenfassung:

In den Datenblättern der C3088 steht nach zwar, dass das I2C Protokoll 
benutzt wird, aber es fehlt die Beschreibung der Ansteuerung.

Sie haben daher nachgesehen, wie der eigentliche Controller OV6620 auf 
dem Kameramodul angesteuert wird. Durch dessen Datenblatt kommt raus, 
dass das sog. SCCB Protokoll benutzt wird. Das ist ähnlich wie I2C aber 
nicht genau so.

Sie haben das Protokoll mit Hilfe einer fremden Library per Software 
über die TWI Schnittstelle eines Atmega16 (@ 16 MHz!!!) implementiert. 
Langwieriges Debuggen war notwendig, bis die Fehler beim Lesen durch 
Korrektur des Timings behoben werden konnten.

Der Sourcecode ist auch erhältlich, allerdings ist es C-Quellcode. Mit 
Bascom-Code sieht es mit der Kamera relativ dünn aus.
http://www.google.de/search?hl=de&q=%28c3088+OR+ov6620%29+bascom&btnG=Suche&meta=

Über Google findet man die SCCB Beschreibung

Serial Cameral Control Bus Functional Specification
http://www4.cs.umanitoba.ca/~jacky/Robotics/DataSheets/ov-sccb.pdf

Darin sieht es mir beim schnellen Durchblättern so aus, als ob für ein 
ordentliches Lesen VIER Bytes übertragen werden (drei vom Master, eins 
vom Slave), nicht DREI wie in deinem Beispiel.

 ID-Adresse-W, Subadresse   ID-Adresse-R, Read Data
<- 2-phase write transm. -><- 2-phase read transm. ->
<--------------- Master -----------------><- Slave ->

Über Google findet man die ID-Adressen im Datenblatt des OV6620:

http://www.ovt.com/pdfs/ov6620DSLF.PDF
http://www.cs.cmu.edu/~cmucam/Downloads/ov6620DSLF.PDF

Die ID-Adresse-W können sein (je nach Hardware-Beschaltung von 3 
Adressleitungen am OV6620): C0, C4, C8, ... und die ID-Adresse-R sind 
jeweils +1 (C1, C5, ...). Die Subadressen sind ebenfalls aufgeführt.

Nun gibt es hier auch einen über 1 Jahr alte, unbeantwortete Frage 
(Beitrag "Kamera C3088, OV6620"), bei der selbst das nicht 
hilft. IMHO ist dort möglicherweise ein 1 Byte zu viel Fehler im Teil 
(<- 2-phase read transm. ->).

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

ich hab mit dem einen Link auf robozes eine Verbindung herstellen 
können.
Bin mittlerweilen auch auf C umgestiegen deshalb...da kann ich sachen 
umstellen. Bilder krieg ich aber trotzdem nicht.
Eins kam mal einem Bild nahe (siehe anhang)...aber seitdem zufall wo ich 
selber noch was im Bitmap per Hexeditor änder musst krieg ich nur noch 
Salat.

Ich weis jedenfalls nicht mehr weiter...das Modul kann ich wohl aus 
Fehlversuch abhaken. Doku beschissen...keiner Macht was damit deshalb 
auch Internetsuche erfolglos ausser deinem Link und noch einen auf 
jrobots...

Einfach blos zum Kotzen...ein Ami Chip in einer Chinesencam...das konnte 
ja nicht gut gehn...

Dabei will ich einfach einen Snapshot an den Rechner schicken nicht mehr 
und nicht weniger...

Danke dir trotzdem.
MfG
Matthias

von Matthias (Gast)


Lesenswert?

P.S. Die Datenblätter hatte ich schon...

von Wolfgang Wegner (Gast)


Lesenswert?

Hallo Matthias,

schau' Dir am Besten erstmal die I2C-Spec von Philips an...

Zumindest der Bascom-Code ist - auch wenn ich keine Ahnung von Bascom 
habe - grob falsch. Du musst zwischen Schreiben der Subadresse und Lesen 
des Bytes einen Restart oder Stop/Start machen, dann neu adressieren. 
Bei der Adressierung muss für das Schreiben (auch der Registeradresse!) 
das unterste Bit der Slave-Adresse '0' sein, für das Lesen '1'. Die 
Angabe der Adresse C1 für die Kamera irritiert mich daher etwas, denn 
normalerweise wird die Adresse dann ohne ein gesetztes Bit 0 
angegeben...

Dann sollte beim Lesen des letzten Bytes das Acknowledge vom Master 
nicht gesetzt werden, damit der Chip weiß, dass jetzt Schluss ist.

Also so als "Pseudo-Code":

   I2cstart
   I2cwbyte &HC0
   I2cwbyte &H00
   I2cstop
   I2cstart
   I2cwbyte &HC1
   I2crbyte X , Nack
   I2cstop

Gruß,
Wolfgang

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.