AVR AT32UC3A Problem

OP (Firma: IR-Systeme) #1904829
Lesenswert?

Hallo!
Ich weiß, der Titel ist nicht gerade aussagekräftig, aber ich bin mir 
nicht wirklich sicher, wo mein Problem überhaupt liegt...
Ich benutze den AT32UC3A1256 Mikrocontroller der Firma Atmel und will 
eine USB Verbindung mit einem Rechner herstellen. Als USB Klasse soll 
die HID Klasse zum Einsatz kommen. Ein Ausschnitt aus meinem Source-Code 
sieht etwa so aus:
1
U8 usbReadData[64]; 
2
U8 usbWriteData[64]; 
3

4
int main(void) 
5
{ 
6
   // Local variables 
7
   int i; 
8

9
   // Initializations 
10
   init(); 
11
   usb_task_init(); // init usb 
12

13
   for (i = 0; i < 64; i++) 
14
   { 
15
      usbWriteData[i] = i; 
16
   } 
17

18
   asm volatile ("nop"); 
19

20
   while(TRUE) 
21
   { 
22
      usb_task(); 
23

24
      if (usb_readData(usbReadData)) 
25
          usb_writeData(usbWriteData); 
26
   } 
27
   return 0; 
28
}

Ich habe nun das Problem, dass dieser Code so wunderbar funktioniert, 
d.h. das Device meldet sich am Rechner über USB an, und ich kann Daten 
in beide Richtungen verschicken. Wenn ich aber die Zeile "asm volatile 
("nop")" entferne, funktioniert die Anmeldung am Rechner nicht mehr. Das 
Programm auf dem Mikrocontroller läuft allerdings prinzipiell (bestätigt 
durch eine Blink-Funktion einer LED...). Allerdings scheint es nicht 
wirklich an dem nop Befehl zu liegen, auch ein anderer "nutzloser" 
Befehl könnte den gleichen Effekt haben (z.B. Zuweisen einer Variable, 
die aber später nicht mehr verwendet wird). Genauso ist es z.B. egal an 
welcher Stelle in der Main Funktion dieser nop Befehl steht...
Das Problem ist leider sogar noch viel "willkürlicher". Ändere ich 
irgendwo etwas am Code, etwa in einer Funktion, oder füge ich etwas 
hinzu, kann es sein, dass danach die USB Anmeldung funktioniert, oder 
eben auch nicht. Ein Hinzufügen eines nop Befehles, oder auch von zwei 
nop Befehlen, könnte das wieder ändern. Der Kompiler meldet keine Fehler 
oder Warnungen.
Hat irgendjemand eine Idee, woran das liegen könnte? Ich bin für jede 
Hilfe dankbar, weiß gerade nicht mehr was ich noch versuchen soll...
Ach ja, die Entwicklungsumgebung ist AVR32 Studio 2.6.0, ich verwende 
das Software Framework 1.7.0.

Vielen Dank und viele Grüße
Christian
#1921751
Lesenswert?

Hi,

klingt sehr stark nach einem Alignment Problem. Dabei verrutscht irgend 
etwas dahinter und macht Probleme. Ich hatte damit sehr viel "Spaß" mit 
einem Cypress FX-II, bei dem dann die Descriptoren auf ungerade Adressen 
gerutscht sind. Schaue Dir einfach mal den Symbol Table an, was dann 
noch so alles passiert.
OP (Firma: IR-Systeme) #1940082
Lesenswert?

Hallo!

Für alle, die einmal ein ähnliches Problem haben... In meinem Fall war 
die Lösung der flash wait state. Dieser muss bei CPU-Clocks >33 MHz auf 
1 gesetzt werden (das steht eigentlich auch im Datenblatt ;-), wenn man 
weiß wo das Problem liegt findet man das auch...). Tut man das nicht, 
macht der Mikrocontroller nicht nachvollziehbare Fehler. Eine andere 
Sache, die im Datenblatt eher schwer zu finden ist, ist, dass der PBA 
clock für die Peripherie nicht größer als 33 MHz sein sollte.

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