PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STM32F4 mit ADNS3090, Bildfehler



voda
28.03.2017, 20:11
Hallo liebes Roboternetz,

dies ist mein erster Eintrag und ich komme mit einem Problem. Über einen STM32F446 (mit 80 MHz, habe ich am MCO-Pin nachgemessen) lese ich per SPI die Bilddaten eines ADNS3090 (30x30) ein. Der SPI-Takt beträgt 1,25 MHz. Allerdings schwankt dieser laut Oszilloskop leicht zwischen 1,24 und 1,26 MHz. Über eine USART sende ich die Bilddaten an ein Matlabprogamm. Allerdings wird das Bild stets versetzt angezeigt (Die Position wechselt wechselt und ich habe stets ein 0x00 und das nebeneinder.) Die Baudrate betägt 921600 Baud.

Laut SPI-Diagramm ist für das Schreiben MSB=1 erforderlich. Danach soll 3 Frames + 10 µs gewartet werden. Im diesen Falle ist es 1510 µs (3*1/2000+10) da die Standardframe 2000 fps beträgt. Hier meine Implementierung:



void adns3090_FrameCapure_Config(void)
{
ADNS3090_NSS_LOW;
delay_us(1);
adns3090_Write(SPI2,ADNS3090_FRAME_CAPTURE|0x80);
delay_us(50);
adns3090_Write(SPI2,0x83);
delay_us(50);
ADNS3090_NSS_HIGH;
delay_us(1510);
}



Hier meine Funktion zum Lesen des Register Pixel_Burst (0x40). Der Beginn jedes Frames ist als 0b0100000 = 0x40 markiert. Bei jedem Pixel ist MSB = 1. Der Linksschift resultieren durch den Framemarker und dem MSB = 1.



void adns3090_Pixel_Burst(uint8_t *image)
{
bool is_first_pixel = false;
uint8_t adns3090_pixel;

adns3090_FrameCapure_Config(); /*Hier findet das Vorgeplänkel statt*/
ADNS3090_NSS_LOW;
//adns3090_Read(SPI2, ADNS3090_FRAME_CAPTURE);
delay_us(50);

for (i=0; i<30;i++)
{
for (j=0; j<30;j++)
{
register_val = adns3090_Read(SPI2,ADNS3090_PIXEL_BURST);
if(!is_first_pixel && (register_val&0x40))
{
i=0;
j=0;
adns3090_fail(); /*Hier leuchtet meine Debug-LED*/
}
is_first_pixel = true;
*image = (register_val<<2);
delay_us(10);
adns3090_pixel = *image;
image++;
send_image(adns3090_pixel); /*meine USART*/
//delay_us(50);
}
}
ADNS3090_NSS_HIGH;
delay_us(50);
}


Die USART-Senderoutine:



void send_image (uint8_t temp)
{
USART_SendData(USART3, temp);
while(!(USART3->SR & USART_FLAG_TXE));
}


In der Main habe ich folgendes implementiert.


uint8_t picture[2000];

int main (void)
{
startUp(); /*GPIO, RCC, usw.*/
USART_config(); /*USART, Senderoutine*/
//bma020_SPI_SETTINGS();
adns3090_STARTUP(); /*GPIO, SPI2, RCC */
SysTick_Init();

while(1)
{
SystemCoreClockUpdate();
adns3090_Pixel_Burst(picture); /*Meine Funktion*/
}
}


Was könnte hier die Ursache sein? Könnt Ihr mir einen Tipp geben?