ADNS3090 nur jede zweite Zeile

OP Persönliche Seite #4952524
Lesenswert?

Guten Abend liebes Forum,

leider habe ich ein Problem mit meinem ADNS3090 auf einem STM32F4, und 
zwar es wird nur jede zweite Zeile übertragen.

Ich habe das SPI-Zeitdiagramm (siehe Bild) wie folgt implementiert:

Funktion adns_FrameCapure_Config:
1
void adns3090_FrameCapure_Config(void)
2
{
3
 ADNS3090_NSS_LOW;
4
  delay_us(1);
5
  /*FRAME_CAPTURE = 0x13*/
6
  adns3090_Write(SPI2,ADNS3090_FRAME_CAPTURE|0x80);
7
  delay_us(50);
8
  adns3090_Write(SPI2,0x83);
9
  delay_us(50); 
10
 ADNS3090_NSS_HIGH;
11
  /*Warte 3 Frames + 10 µs = 1/2000 * 3 + 10 = 1510 µs*/
12
  delay_us(1510);
13
}

und die Pixelübertragung:
1
{
2
  bool is_first_pixel = false;
3
  adns3090_FrameCapure_Config();
4
  ADNS3090_NSS_LOW;
5
  //adns3090_Read(SPI2, ADNS3090_FRAME_CAPTURE);
6
  delay_us(50); /*t_SRAD*/
7
   
8
   for (i=0; i<ADNS3090_RESOLUTION;)
9
   {
10
    for (j=0; j<ADNS3090_RESOLUTION;)
11
    {
12
     register_val = adns3090_Read(SPI2,ADNS3090_FRAME_CAPTURE);
13
     if(!is_first_pixel && (register_val&0x40))
14
     {
15
      i=0;
16
      j=0;
17
     /* Wird der Firstframemarker 0x40 nicht gefunden, 
18
     wird meine DEBUG-LED aktiviert, welche in der Funktion
19
     implementiert ist */
20
      adns3090_fail();          
21
     }
22
     else
23
     {
24
      is_first_pixel = true;
25
      *image = (register_val<<2);  
26
      USART_SendData(USART3, *image); /*Sende Pixel an die USART*/
27
      delay_us(10); /*t_LOAD*/
28
      image++;    
29
     }
30
    delay_us(50);
31
    j++;
32
    }  
33
     if(is_first_pixel)
34
      {
35
       i++;
36
      }
37
    }
38
  ADNS3090_NSS_HIGH;
39
  delay_us(14); /*t_BEXIT*/
40
 }

Und die main:
1
uint8_t picture[1536];
2

3
int main (void)
4
{
5
  startUp();
6
  USART_config();
7
  adns3090_STARTUP();
8
  SysTick_Init();
9

10
  while(1)
11
  {
12
   SystemCoreClockUpdate();  
13
   adns3090_Pixel_Burst(picture);
14
  }
15
}

Das Bildergebnis sieht irgendwie komisch aus. Die 
Übertragungsgeschwindigkeit passt, aber irgendwie wird etwas 
verschluckt.

Kann mir da einer einen Rat geben?

Danke und Gruß
Daniel
Angehängte Dateien:
OP Persönliche Seite #4952862
Lesenswert?

Jim M. schrieb:
> Kann es sein dass die USART_SendData() Funktion zu lange braucht?
> Ich
> hätte das gepuffert und erst danach übertragen.

Ja so in etwa habe ich das auch erst gemacht, da ist meine 
Übertragungsgeschwinidgkeit in den Keller gegangen.
1
int main (void)
2
{
3
 uint8_t picture [1536];
4
 int imageData;
5
 int n;
6
 while(1)
7
 {
8
   adns3090_Pixel_Burst(picture);
9
   for (n=0;n<900;)
10
   {
11
    imageData = picture [n];
12
    USART_SendData(USART3, imageData); 
13
   }
14
 }
15
}
Hmm, Moment mal,  beim schreiben fällt mir gerade auf, ich sende die 
Daten über die Funktion USART_SendData aber ich warte kein Flag ab, d.h. 
er sendet weiter auch wenn das Register leer ist (0x00)...

Muss ich verifizieren, wenn ich zuhause bin und ich halte euch weiter 
auf dem Laufenden...

Danke und Gruß
Daniel
OP Persönliche Seite #4953673
Lesenswert?

So ihr Lieben,

soweit läuft das System, hab aber noch eine böse Verschiebung. Hier der 
Code:
1
void adns3090_Pixel_Burst(uint8_t *image)
2
{
3
 bool is_first_pixel = false;
4
 uint8_t adns3090_pixel;
5
 
6
 adns3090_FrameCapure_Config();
7
 ADNS3090_NSS_LOW;
8
 delay_us(50);
9
    
10
 for (i=0; i<ADNS3090_RESOLUTION;)/*=30*/
11
 {
12
   for (j=0; j<ADNS3090_RESOLUTION;)/*=30*/
13
     {
14
       /* Register: 0x40 */ 
15
       register_val = adns3090_Read(SPI2,ADNS3090_PIXEL_BURST);
16
       if(!is_first_pixel && (register_val&0x40))
17
        {
18
   i=0;
19
   j=0;
20
         /*Dies ist eine Fehlerfunktion, hier blinkt meine Debug-LED*/
21
         adns3090_fail();      
22
  }
23
  else
24
  {
25
   is_first_pixel = true;
26
   *image = (register_val<<2);  
27
   delay_us(10); 
28
   adns3090_pixel = *image;
29
   image++;
30
   send_image(adns3090_pixel); /*sendet das Bild zur USART*/ 
31
  }
32
      delay_us(50);
33
      j++;
34
     }  
35
     if(is_first_pixel)
36
     {
37
       i++;
38
     }
39
    }
40
 ADNS3090_NSS_HIGH;
41
 delay_us(14);
42
}

Der Fehler lag an die USART-Flags und ich habe das falsche Register 
abgefragt. Dennoch habe ich einen Versatz in meiner Bildausgabe (siehe 
Bild). Dieser wandert auch von Frame zu Frame. Ich habe auch einen 
wandernen Versatz.

Was kann das sein?

Danke und Gruß
Daniel
Angehängte Dateien:
Beitrag #4954796 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren