Hardware Reference
In-Depth Information
Ganz gleich, was geschehen soll, für Interrupt Flagregister und deren Enable Register
ist es immer gut, wenn sie auf null gebracht werden, bevor Interruptquellen aktiviert
werden. Eine Besonderheit ist nun das Löschen des Interrupt-Bits ACTVIF. Dieses Bit
kann nicht gelöscht werden, wenn das USB-Modul im Suspended-Zustand ist oder
diesen Zustand gerade erst verlassen hat. Es braucht einige Taktzyklen, bis der interne
Zustand der SIE synchronisiert worden ist. Vorher hat ein Löschbefehl auf ACTVIF
keine Wirkung. Deswegen muss in einer Schleife abgefragt werden, ob ACTVIF wirk-
lich gelöscht worden ist. Dazu gibt es das Unterprogramm clearACTVIF.
; Initialization of the USB interrupt funnel (reference: DS39632C Section 17.5)
call clearACTVIF
clrf UIR
clrf UIE
clrf UEIR
clrf UEIE
;******************************************************************************
; Clear Bus Activity Detect Interrupt Bit, reference: DS39632C Section 17.5.1.1
;******************************************************************************
clearACTVIF
bcf UCON,SUSPND
clrACTVIFloop
btfss UIR,ACTVIF
bra clrACTVIFdone
bcf UIR,ACTVIF
bra clrACTVIFloop
clrACTVIFdone
return
An dieser Stelle ist alles soweit vorbereitet, dass das USB-Modul eingeschaltet wer-
den kann, ohne dass mit irregulärem Verhalten gerechnet werden muss. Dazu muss
lediglich das Bit USBEN im Register UCON auf 1 gesetzt werden.
; enable USB interface
bsf
UCON,USBEN
Nun braucht es einige Zeit, bis die Spannungen auf den Leitungen D+ und D- ein-
geschwungen sind und damit nicht irrtümlich eine Reset-Bedingung detektiert
wird. Dazu wird das Bit SE0 im Register UCON abgefragt. Solange dieses Bit 1 ist,
ist der Einschwingvorgang auf den Leitungen noch nicht abgeschlossen. Wenn in
dieser Zeit schon Interrupts freigegeben wären, könnte fälschlich ein USB Reset
detektiert werden.
; 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 preventing the firmware from misinterpreting this
; unique event as a USB bus reset from the USB host.
Search WWH ::




Custom Search