Forum: Mikrocontroller und Digitale Elektronik DFU Bootloader Xmega<--USB-->PC


von Patrick S. (patricksch)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von Patrick S. (patricksch)


Lesenswert?

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)

von Patrick S. (patricksch)


Lesenswert?

Das Problem ist hierbei, dass er aber noch den Interrrupt verarbeitet, 
und deshalb nicht richtig in den Bootloader springen kann.

von Thomas DG5MPQ (Gast)


Lesenswert?

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

von Patrick S. (patricksch)


Lesenswert?

Gute Idee!

von Patrick S. (patricksch)


Lesenswert?

funktioniert, Danke!

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.