Forum: Mikrocontroller und Digitale Elektronik OV7670 an STM32F102


von Dirk K. (dekoepi)


Angehängte Dateien:

Lesenswert?

Mein Projekt einer Zeitraffer-Kamera mit einem Bild am Tag schreitet 
endlich wieder voran. Der STM32F103 wartet immer wieder mit neuen 
Überraschungen auf. Die heutige Lösung, die zum Auslesen eines Bildes 
geführt hat: Meine verwendeten Pins PB3 und PB4 sind standardmäßig schon 
als JTAG in Verwendung. Nachdem AFIO das Clock-Signal bekommen hat, kann 
man das Pin-Remapping dafür abstellen und schon die Pins als Inputs 
nutzen.

Anbei der Code, der jetzt Daten liefert - wenn auch noch nicht ganz die, 
die ich erwartet hätte. Das I2C-Problem, dass ich in i2c_send() mittels 
UART-Ausgabe verzögern muss, hat noch Bestand. Die Register in der 
Header-Datei sind gar nicht nötig, aber falls man die Kamera mal 
umstellen mag, nützlich. Die Kamera funktioniert auch mit 
minimalistischem Setup (XCLK mit Clock-Signal versorgen, gegebenenfalls 
noch Prescaler via I2C setzen, und dann Bild auslesen).

Als nächstes kommt jetzt ein SD-Kartenleser dran, damit ich die Daten 
wegspeichern und dann mal überprüfen kann, was ich da zu sehen bekomme. 
Anschließend die RTC und Power-Save-Modes.

Da auch andere mit diesem Kameramodul arbeiten und es nur Code für die 
merkwürdigsten Plattformen gibt, wollte ich hier mal eine Alternative 
anbieten - ohne Interrupts, nur mit Polling.

Ausgabe:
1
RAM chip 0 is OK.
2
RAM chip 1 is OK.
3
RAM chip 2 is OK.
4
RAM chip 3 is OK.
5
RAM chip 4 is OK.
6
Starting communication with OV7670.
7
i2c_send: [66].
8
i2c_send: [66].
9
i2c_send: [17].
10
i2c_send: [67].
11
Reading COM11 from I2C target: [176].
12
Reset all registers of the OV7670.
13
i2c_send: [66].
14
i2c_send: [18].
15
i2c_send: [128].
16
Setting OV7670 defaults - long list!
17
i2c_send: [66].
18
i2c_send: [17].
19
i2c_send: [67].
20
Reading COM11 from I2C target: [128].
21
i2c_send: [66].
22
i2c_send: [17].
23
i2c_send: [159].
24
Writing COM11 prescaler to I2C target.
25
i2c_send: [66].
26
i2c_send: [107].
27
i2c_send: [67].
28
i2c_send: [66].
29
i2c_send: [107].
30
i2c_send: [10].
31
Writing DBLV disable PLL to I2C target.
32
i2c_send: [66].
33
i2c_send: [17].
34
i2c_send: [67].
35
Reading COM11 again from I2C target: [159] -> Prescaler 32, frequency 250 kHz.
36
Select first RAM chip.
37
Bank: 1 at byte 131071.
38
Bank: 2 at byte 262142.
39
Bank: 3 at byte 393213.
40
Bank: 4 at byte 524284.
41
Writing image succeeded! Wrote 612715 bytes, used 4 RAM chips.
42
Image dimension: 640 x 478 pixel. First 10 bytes captured:
43
[101]: 116   [102]: 192   [103]: 110   [104]: 209   [105]: 126   [106]: 181   [107]: 119   [108]: 187   [109]: 114   [110]: 205

von Dirk K. (dekoepi)


Lesenswert?

Nach einer Nacht drüber schlafen fallen einige Probleme und deren 
Lösungen ins Auge:

- Laut "Datenblatt" zum OV7670 sollte PCLK mindestens 1MHz haben. 
Darunter kommen ganz offensichtlich unsinnige Werte beim Auslesen 
zustande.

- Da manuelles Polling bei 1MHz aber nur ein Bild halber Größe erzeugt 
;) , muss wohl DMA her. Irgendwie gehen die Nullen flöten und sauber 
ausgelesen sind die Werte so auch nicht ...
1
Reading COM11 again from I2C target: [135] -> Prescaler 8, frequency 1000 kHz.
2
Select first RAM chip.
3
Bank: 1 at byte 131071.
4
Bank: 2 at byte 262142.
5
Writing image succeeded! Wrote 383380 bytes, used 2 RAM chips.
6
Image dimension: 407 x 470 pixel. First 10 bytes captured:
7
[101]: 129   [102]: 133   [103]: 129   [104]: 134   [105]: 133   [106]: 126   [107]: 128   [108]: 132   [109]: 128   [110]: 128

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.