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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.