Forum: Mikrocontroller und Digitale Elektronik Daten im XRAM ablegen 8051


von Matthias (Gast)


Lesenswert?

Hallo,

ich bin momentan dabei, eine Firmware für einen C8051F320 von Silabs zu 
schreiben, die nichts weiter tun soll, als Daten über USB zu empfangen 
und dann per SPI zu einem anderen uC weiterleiten soll und andersherum 
solls natürlich auch funktionieren.

Dafür muss ich jedoch relativ große Datenpakete (128 Byte) 
zwischenspeichern. Am liebsten so viele wie möglich.

Da ist auch schon mein Problem.

Ich habe mir für die Daten zwischen zu speichern, einen Ringspeicher 
angelegt, der dafür nachfolgende Variablendeklarationen nutzt.
Die inPackets und outPackets sind structs.

Die inPackets 17 Byte groß und die outPackets 128 Byte groß.

Wenn ich nun mehr wie 1 Arrayelement der OutPackets anlegen möchte oder 
mehr als 6 der in Packets, dann kompiliert er trotzdem noch richtig, der 
uC arbeitet das Programm aber nicht ab.

Der XRAM ist damit ja bei weitem nicht voll.

Ich habe jetzt schon Stunden damit verbracht mir die Anleitung des 
Compilers durchzulesen aber leider finde ich den Fehler nicht.

Vll. hat ja einer von euch eine Idee.

SEG_XDATA USB_IN_PACKET inPackets[NUMBER_OF_IN_PACKETS];
SEG_XDATA USB_OUT_PACKET outPackets[NUMBER_OF_OUT_PACKETS];


SEG_XDATA USB_IN_PACKET *pWriteInPacket;  //next free position to write 
In Packet
SEG_XDATA USB_IN_PACKET *pReadInPacket;    //next position to read In 
Packet

SEG_XDATA USB_OUT_PACKET *pWriteOutPacket;  //next free position to 
write Out Packet
SEG_XDATA USB_OUT_PACKET *pReadOutPacket;  //next free position to read 
Out Packet

Viele Grüße

Matthias

von Jim M. (turboj)


Lesenswert?

> der uC arbeitet das Programm aber nicht ab

Der µC arbeitet scheinbar gar nicht mehr?
Dann schlägt der Watchdog - der beim Reset aktiviert wird - beim 
Initialisieren des XRAMs zu. Der default Timeout ist ziemlich kurz. 
Damit erreicht das Programm die main() überhaupt nicht mehr.

Abhilfe schafft eine selbst entwickelte C-Startup routine in Assembler, 
bzw. den vom Compiler verwendeten Code zu überarbeiten.
Eventuell kannst Du auch den Compiler/Linker so einstellen, dass er den 
XRAM nicht initialisiert -> Doku lesen.

von Matthias (Gast)


Lesenswert?

Habs direkt ausprobiert...

Funktionert!!!

Vielen dank! Da hätte ich noch ewig gesucht.

von Ralf (Gast)


Lesenswert?

@Matthias:
Was benutzt du als Basis für USB? Eine VCP-Implementation? Oder HID?
Welchen Compiler verwendest du?

Ralf

von Matthias (Gast)


Lesenswert?

Hallo Ralf,

ich benutze als Basis für USB die Bulk Transfer Implementierung. Also 
keinen VCP. Hostseitig wird der Treiber generisch mittels WinUsb 
erzeugt, sodass man dort die Standard WinUsb Funktionen nutzen kann. Die 
HID Klasse benutze ich jedoch nicht.

Als Compiler benutze ich den SDCC.

Gruß

Matthias

von Ralf (Gast)


Lesenswert?

> ich benutze als Basis für USB die Bulk Transfer Implementierung.
Also das Beispiel direkt von SiLabs?

> Hostseitig wird der Treiber generisch mittels WinUsb
> erzeugt, sodass man dort die Standard WinUsb Funktionen nutzen kann.
Hört sich interessant an. Kannst du das näher erläutern bzw. mir ein 
Demo-Projekt schicken?

Ralf

von Matthias (Gast)


Lesenswert?

Ich habe mir das Beispiel von Silabs als Vorlage genommen und an meine 
Bedürfnisse angepasst.

WinUsb ist eine Windows Library aus dem Windows Driver Kit.

http://msdn.microsoft.com/en-us/library/windows/hardware/gg487428.aspx

Infos zur Implementierung und Nutzung der WinUsb Funktionen, sowie zum 
generieren eines Treibers bekommt man hier.

http://msdn.microsoft.com/en-us/library/windows/hardware/ff540196%28v=vs.85%29.aspx

Leider kann ich dir mein Projekt als Demo nicht zukommen lassen, da es 
einer Geheimhaltungsklausel unterliegt.

Aber ich hoffe mit den Infos kommst du weiter.

Freundliche Grüße

Matthias

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.