Forum: Mikrocontroller und Digitale Elektronik Interruptgesteuerter Datenempfang über Virtual Comport (AT91SAM7S256)


von Thomas L. (santos10)


Lesenswert?

Hallo,

Ich habe das Beispiel Programm "AT91SAM7S-USART_USB_SAM7S" von Martin 
Thomas in den AT91SAM7S256 mit einem selbstgebautem Wiggler und Openocd 
flashen können. Das Programm läuft stabil und ich kann über dem Programm
"HTerm" Strings zwischen der RS232 und dem virtuellen Comport hin- und
her schicken.

Jetzt habe ich versucht, den Datenempfang am virtuellen Comport
Interrupt gesteuert zu machen. Es soll ein Interrupt ausgelöst werden,
wenn ich über HTerm (virtueller Comport) ein Character über der
Tatastur eingebe. In der Interrupt Service Routine soll die READ
Funktion aus "cdc_enumerate.c" aufgerufen werden. Die READ Funktion
habe ich aus der while(1) in main.c rausgenommen. Den USB Interrupt
habe ich folgendermaßen im AIC konfiguriert:

(in cdc_enumerate.c)

void AT91F_USB_Interrupt_Enable(void)

{
  AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_UDP , 0, 0, usb_isr);

  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);

  AT91F_UDP_EnableIt(AT91C_BASE_UDP, (1<<1));
//ENDPOINT 1 Interrupt

}


Die Definition von usb_isr (ebenfalls in cdc_enumerate.c)

void usb_isr(void)
{
       unsigned int length;
       char Daten[MSG_SIZE];
       struct _AT91S_CDC pCDC_Interrupt;

       length = pCDC_Interrupt.Read(&pCDC_Interrupt, Daten, MSG_SIZE);
       Daten[length]=0;
}

In der main.c habe ich aus der while(1) Schleife

length = pCDC.Read(&pCDC, Daten, MSG_SIZE);
Daten[length]=0;

herausgenommen. In main.c habe ich

AT91F_USB_Interrupt_Enable();

while(1)

{

........

}

eingefügt.

In der Funktion AT91F_UDP_EnableIt setze ich das ENDPOINT 1 Interrupt
Flag im UDP_IER. Wenn ich das ganze auf den µC flash, wird der USB
Anschluß nicht mehr als virtueller Comport erkannt. Mit dem ENDPOINT 1
als Interrupt Quelle bin ich mir nicht so sicher, ob dies stimmt.  Wie
kann ich ein Receive Data Interrupt beim virtuellen Comport
realisieren? Also wie ein "RXRDY: RXRDY Interrupt" bei der echten
"RS232".

Hat jemand vielleicht einen Tipp?
Danke im voraus!

Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.