Jag använder mig av en kamera OV7670 som har pinnarna
Datablad: http://web.mit.edu/6.111/www/f2016/tool ... 0_2006.pdf
Kod: Markera allt
3.3V = Matning
GND = 0V
SOIC = I2C Clock
SOID = I2C Data
VSYNC = Vertical Sync Output
HREF = HREF Output
PCLK = System Clock Output
XCLK = Pixel Clock [b]Input[/b]
D7 = YUV/RGB Video Component Output Bit 7
D6 = YUV/RGB Video Component Output Bit 6
D5 = YUV/RGB Video Component Output Bit 5
D4 = YUV/RGB Video Component Output Bit 4
D3 = YUV/RGB Video Component Output Bit 3
D2 = YUV/RGB Video Component Output Bit 2
D1 = YUV/RGB Video Component Output Bit 1
D0 = YUV/RGB Video Component Output Bit 0
RESET = Nollställ alla register vid logisk 0. Normal ställning är logisk 1
PWDN = Aktiv vid logisk 0. Avaktiverad vid logisk 1
Men hur som helst så börjar jag med inkopplingen:
Hårdvara:
1. För att börja med så kollar jag alla absoluta spänningsnivån för kameran. Det är 4.5V. Men maximala spänningsnivån är 3.0V.
2. Där efter börjar jag kolla vad externa kristallen XCLK ska ha för frekvens. Den ska ha mellan 10 MHz och 48 Mhz med en duty cycle på 45% - 55%. Då har jag valt en sådan oscillator. Som har 45/50% i duty call och 24 Mhz.
https://www.mouser.se/datasheet/2/122/E ... 479682.pdf
3. Jag börjar kolla vad I2C klockan skall vara. Enligt denna bild så är tF = 300 ns, tLOW = 1.3 us och tHIGH = 600 ns.
Detta blir totalt en I2C frekvens på F = 1/(2*300*10^-9 + 1.3*10^-6 + 600*10^-9) = 400000 Hz.
Jag har valt min I2C klocka på 100000 Hz. Så jag ska nog klara mig med att min I2C klocka går 4 gånger långsammare än kamerans maxnivå. 4. Jag anser att pixelklockans polaritet är aktiv på höjd kant. YSYNC är aktiv på höjd kant och HSYNC är aktiv på låg kant. 5. PWDN koppar jag till GND.
Mjukvara:
1. För att få data från min kamera till STM32:n så måste jag använda något som heter DMA. Jag använder WORD (32-bit) 2. För att få data från kameran så används DCMI och får att styra kameran så används I2C. Så jag börjar med att se till så data kan komma över till min processor.
Då ska jag använda denna funktion. DCMI_Mode kan vara DCMI_MODE_CONTINUOUS eller DCMI_MODE_SNAPSHOT. Men här är problemet! Argumentet pData.
Kod: Markera allt
HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length);

Detta betyder att jag min pData ska alltså vara ett nummer, som visar en address.
Detta är kod från ST:s egna dokumentation AN5020.
Kod: Markera allt
#define FRAME_BUFFER 0xC0000000
uint32_t Im_size = 0x9600; // 320*240*2
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS , (uint32_t)FRAME_BUFFER, Im_size);
Jag laddar upp det här. Koden är snyggt skrivet.