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
> 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.
Habs direkt ausprobiert... Funktionert!!! Vielen dank! Da hätte ich noch ewig gesucht.
@Matthias: Was benutzt du als Basis für USB? Eine VCP-Implementation? Oder HID? Welchen Compiler verwendest du? Ralf
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.