Någon som har hållit på med DCMI förut?
Postat: 14 april 2022, 19:04:34
STM32 har något som heter DCMI. Det är alltså en databuss för att föra över data.
Jag använder mig av en kamera OV7670 som har pinnarna
Datablad: http://web.mit.edu/6.111/www/f2016/tool ... 0_2006.pdf
Mitt mål är att koppla ihop denna OV7670 kamera. Men jag vet inte hur.
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.
Detta betyder att jag ska alltså lägga in en variabel på 32-bitar t.ex. uint32_t som min bild ska finns i där. Men detta är alltså 4 bytes data!
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.
Enligt ST så finns det ett register som heter DCMI_CR och där ska man tydligen markera in sin FRAME_BUFFER. Men här står det stilla. Vad ska jag göra liksom? Hur kom ST fram till 0xC0000000 ?
3. För I2C så har jag redan lite C kod som jag vill köra. Jag har fått ihop det hyfsat bra.
Jag laddar upp det här. Koden är snyggt skrivet.
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.