Hallo Mitstreiter
Ich hab hier ein sporadisch auftretendes Problem, welches sich bisher nur durch neu Flashen beheben läßt. Zuerst aber mal was zu meinen Umgebungsbedingungen.
Ich hab einen PIC18F4553, der über USB verschiedene Daten (Analogwerte, Digitale I/Os) an einen PC liefert.
Ich benutze den USB Stack von MC in Version 2.2, den ich zuerst auf dem DemoBoard und nun auf meinem Controller nutze. Was ich mit übernommen habe sind die LEDs, die mir den USB Bus Status anzeigen (sind ja in den Demoapplikationen für das DemoBoard auch mit dabei)
Nun ist es an einigen Leiterplatten schon ein paar mal aufgetreten, dass der Controller nicht mehr erkannt wird, wenn er in den PC gestöpselt wird (USB HID-Applikation). Eine genauere Analyse ergab, dass der USB im sogenannten POWERED_STATE hängt (Nur eine LED leuchtet) und nicht weiter läuft, wenn man ihn ansteckt. Nach der Recherche wann dieser Status eintritt ist mir folgendes Codeschnipsel aufegefallen:
void USBDeviceTasks(void)
{
....diverser Code....
if(USBDeviceState == ATTACHED_STATE)
{
/*
* After enabling the USB module, it takes some time for the
* voltage on the D+ or D- line to rise high enough to get out
* of the SE0 condition. The USB Reset interrupt should not be
* unmasked until the SE0 condition is cleared. This helps
* prevent the firmware from misinterpreting this unique event
* as a USB bus reset from the USB host.
*/
if(!USBSE0Event)
{
USBClearInterruptRegister(U1IR);// Clear all USB interrupts
U1IE=0; // Mask all USB interrupts
USBResetIE = 1; // Unmask RESET interrupt
USBIdleIE = 1; // Unmask IDLE interrupt
USBDeviceState = POWERED_STATE;
}
}
....diverser Code....
}
Dieses Codeschnipsel ist die einzige Stelle, die den POWERED_STATE bedient. (Ich habe im gesamten Code von mir keine andere Stelle gefunden.)
Wenn dieses Problem nun auftritt dann kann man den Controller nur durch neu flashen wieder zum laufen bringen.
Das SE0 bit wird ja durch den Transceiver im USB Configuration Register gesetzt. Kann es theoretisch möglich sein, dass der Controller, respektive der Transceiver durch äußere Einflüsse (EMV auf Kabel, oder durch andere magnetische Störungen) derart durcheinander gebracht wird, dass der Controller nicht mehr anläuft? Gibt es noch andere Punkte, wo ich mit der Fehlersuche ansetzen kann? Ist diese Stelle überhaupt der richtige Ansatz?
Ich bin über jede Antwort und Hilfestellung dankbar.
Grüße
Daimonion