Någon som har hållit på med DCMI förut?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

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

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
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å.
Skärmklipp.PNG
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.
Skärmklipp.PNG
Skärmklipp.PNG
Skärmklipp.PNG
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)
Skärmklipp.PNG
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 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! :shock:
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);
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 ?
Skärmklipp.PNG
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.
STM32_OV7670_DCMI_8_Bit.zip
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: Någon som har hållit på med DCMI förut?

Inlägg av agehall »

pData är antagligen bara adressen du vill skriva data till. Normalt sett borde det vara en pekare, men uppenbarligen används en uint32_t för det så då får du skicka in adressen så istället. Vad i minnet du skriver data är väl helt upp till dig - det är ditt ansvar som utvecklare att se till att det finns en minnesyta där bilden kan sparas.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Någon som har hållit på med DCMI förut?

Inlägg av JimmyAndersson »

Här var vi några som svarade på frågan i rubriken:
viewtopic.php?p=1589361#p1589361

(Längre ner på den sidan har du dokumenterat vad du testade då. Kanske finns något där som du glömt sedan dess? Tycker själv det är smidigt att titta tillbaka på vad man gjort. :) )

En annan tråd i ämnet, som tyvärr spårade ur:
viewtopic.php?f=7&t=97592

(Önskar att någon moderator kunde rensa ut det ovidkommande därifrån…)
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

agehall skrev: 14 april 2022, 19:51:28 pData är antagligen bara adressen du vill skriva data till. Normalt sett borde det vara en pekare, men uppenbarligen används en uint32_t för det så då får du skicka in adressen så istället. Vad i minnet du skriver data är väl helt upp till dig - det är ditt ansvar som utvecklare att se till att det finns en minnesyta där bilden kan sparas.
Tackar för svar.
Ja! Jag är medveten om att jag måste sparar i ett minne. Men jag är riktigt van med att det ska vara en pekare. Men här är det absolut ingen pekare alls. Då känner jag inte igen mönstret. Det var något nytt. Hur gör man här då, ställer jag mig frågan.

Alltså borde man bara kunna skriva så här?

Kod: Markera allt

  uint32_t image[320*240*2];
  HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)image, sizeof(image)/sizeof(image[0]));
JimmyAndersson skrev: 14 april 2022, 19:53:21 Här var vi några som svarade på frågan i rubriken:
viewtopic.php?p=1589361#p1589361

(Längre ner på den sidan har du dokumenterat vad du testade då. Kanske finns något där som du glömt sedan dess? Tycker själv det är smidigt att titta tillbaka på vad man gjort. :) )

En annan tråd i ämnet, som tyvärr spårade ur:
viewtopic.php?f=7&t=97592

(Önskar att någon moderator kunde rensa ut det ovidkommande därifrån…)
Vänta lite!
Så det är FSMC minnet jag ska skriva till?
Men den är upptagen av min LCD då jag använder FSMC för att skriva till min LCD.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Någon som har hållit på med DCMI förut?

Inlägg av Mr Andersson »

Pekare är bara vanliga nummer, precis som allt annat i en processor. Typer används av kompilatorn för att kontrollera misstag men det är inget som processorn ser.
Men det är ganska slarvigt av ST att använda fel typ om man förväntas använda en pekare.

Det är ingen som säger att du måste skriva till FSMC. Det kanske är lämpligt om du bara vill flytta bilder direkt från kameran till displayen utan någon bildbehandling men annars måste du skriva det till vanligt RAM först.
PS din image-vektor är fel storlek. Enligt ditt datablad ger kameran ut 640*480*8bpp.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

Ja, det är slarvigt av ST...förvirrande.

Men då vet jag att jag behöver bara göra som ovan så fungerar det.
Angående storleken så tycker jag att det är svårt att tolka databladet vad exakt man ska skriva för att få ett visst resultat. Databladet rabblar bara upp en lista på register. Jaha? Vad gör dom då och när ska man skriva till dom? I vilken ordning?

Sedan så undrar man vad standardvärde 0x00 egentligen ger för resultat.
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Någon som har hållit på med DCMI förut?

Inlägg av ffredrik »

Mr Andersson skrev: 14 april 2022, 21:18:36 Pekare är bara vanliga nummer, precis som allt annat i en processor. Typer används av kompilatorn för att kontrollera misstag men det är inget som processorn ser.
Men det är ganska slarvigt av ST att använda fel typ om man förväntas använda en pekare.

Det är ingen som säger att du måste skriva till FSMC. Det kanske är lämpligt om du bara vill flytta bilder direkt från kameran till displayen utan någon bildbehandling men annars måste du skriva det till vanligt RAM först.
PS din image-vektor är fel storlek. Enligt ditt datablad ger kameran ut 640*480*8bpp.
"nummer" ? Jag anser att man skall använda normal, vedertagen vokabulär.
I detta fall t ex "värde".
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Någon som har hållit på med DCMI förut?

Inlägg av Mr Andersson »

Ja, nummer.
matematisk storhet uttryckt l. uttryckbar med en l. flera siffror l. motsv. tecken; tal (använt vid räkneoperationer). - SAOB

Daniel:
Ok kameran klarar tydligen 320x240. Jag snabbkollade bara så jag trodde det bara var 640x480.
Det står ju vad 0 betyder.
Inte reset
Inte CIF (352x288), Inte QVGA (320x240), Inte QCIF (176x144). Alltså är default 640x480.
Ingen color bar
YUV-format

Jag kan hålla med om att det kan vara svårt att tyda registerlistor. Egentligen bör det ju inte spela någon roll vilken ordning man skriver registrerna så länge det inte står att det påverkar / påverkas av något annat, men det händer att den biten utelämnas ibland.
En del tillverkare har appnotes eller exempelkod för init-procedurer.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

Jag tänker välja QVGA (320x240) utan "color bar". Betyder det då att färgen blir grå, dvs jag behöver bara använda storleken 320x240 och inte 320x240x2 ? För det är väll den där extra tvåan som är till för färgen?

Eller kan det vara så att QVGA (320x240) är QVGA (320x240x2) oavsett om jag väljer att ha med färg eller inte?

Jag har hittat ett bibliotek som sägs ska fungera
https://github.com/arduino-libraries/Ar ... 670.c#L338

Jag skriver om detta till ren C kod, så det blir rent, snyggt och provinsiellt uppställt med register som verkligen följer strikt databladet!
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Någon som har hållit på med DCMI förut?

Inlägg av JimmyAndersson »

”För det är väll den där extra tvåan som är till för färgen?”

Jäpp.

”Eller kan det vara så att QVGA (320x240) är QVGA (320x240x2) oavsett om jag väljer att ha med färg eller inte?”

Nä det bör bli utan färg. QVGA står bara för storleken. (Q = quarter.) VGA är nåt i stil med Video Graphics ..Adapter(?)
Nope, Array. :) (Var tvungen att googla.)
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

Så när jag då väljer QVGA, så måste jag ha min DMA array 320*240*2 trots allt?
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Någon som har hållit på med DCMI förut?

Inlägg av JimmyAndersson »

Jag tror inte det. Det bör räcka med 320*240.
(Om de inte har hittat på något eget knasigt..)
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Någon som har hållit på med DCMI förut?

Inlägg av DanielM »

Men visst fungerar det som att när HREF går upp från låg så börjar en ny rad byggas? Men D[7:0] är bara 8 bytes. Hur kan det vara en rad?
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Någon som har hållit på med DCMI förut?

Inlägg av JimmyAndersson »

Jag håller med. Det ser märkligt ut…
Tyvärr minns jag inte hur det var. :humm:
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: Någon som har hållit på med DCMI förut?

Inlägg av agehall »

Va? Varifrån får du att du bara får en byte per rad? Det är ju uppenbart i fig 5 att du får en byte per PCLK när HREF är hög. Och tittar du noga i fig 6 så indikeras samma sak - det är bara att man visat första byten tydligt.
Skriv svar