Hallo, ich benutze den DFU Bootloader mit deinem Xmega32C4 Mikrocontroller und einen iMX6 als PCU. Die Kommunikation ist mit i2c/twi. Das Aufspielen der Firmware mit dem DFU funktioniert problemlos. Ich möchte nun mit einem Befehl vom PC aus (twi - intterupt driven) den MCU in den Bootloader springen lassen. void (*start_bootloader) (void) = (void (*)(void))(BOOTLOADER_ADDRESS); void reset_mcu(void) { cli(); start_bootloader(); } BOOTLOADER_ADDRESS = 0x40FE Bootloader byte addresse des Mikrocontroller ist 0x8000. (0x40FE = 0x8000/2 + 0x1FC/2) Der MCU scheint auch in den Bootloader zu springen, Problem ist, dass der PC nun aber den USB port nicht erkennt. [12370.129217] usb 2-1.3: device not accepting address 95, error -32 [12370.135683] hub 2-1:1.0: unable to enumerate USB device on port 3 Hat jemand eine Idee?
Patrick Schmelzer schrieb: [...] Dir ist offensichtlich selber nicht ganz klar, wie die Kommunikation des Bootloaders funktioniert. > Die Kommunikation ist mit i2c/twi. Das Aufspielen > der Firmware mit dem DFU funktioniert problemlos. Das ist doch Blödsinn. Entweder läuft die Kommunikation via USB, dann kann sie nicht gleichzeitig über I2C laufen. Und umgekehrt. Oder du hast da irgendeine perverse Mischpoke am Laufen, bei der irgendein USB-Gateway eine Rolle spielt. Dann mußt du natürlich dafür sorgen, daß das Gateway für den Bootloaderbetrieb entsprechend umkonfiguriert wird, es genügt dann eben nicht mehr, einfach nur den Bootloader anzuspringen.
Vielleicht habe ich mich ja ein wenig falsch ausgedrückt(lustig, dass man hier oft gleich angemault wird, deswegen mag ich avrfreaks lieber!) Die Kommunikation zwischen PC und MCU läuft über i2c. Das heisst ich schicke Befehle von PC nach MCU, der danach z.B. Werte wieder zurückt gibt. Eine Funktion ist allerdings, dass man den MCU restartet, damit er in den Bootloader springt. Nachdem der MCU neu gestartet hat, müsste er am PC als COM Port gefunden werden. (Ja hier kommt der USB zum Einsatz)
Das Problem ist hierbei, dass er aber noch den Interrrupt verarbeitet, und deshalb nicht richtig in den Bootloader springen kann.
Hallo Patrik, setze doch einfach im I2C ein Flag. wenn der Interrupt fertig ist, du wieder im normalen Ablauf im PRG bist kannst du das Flag auswerten und in den Bootloader springen. Gruß 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.