15.10.2013
Interfejs USB-DCD w mikrokontrolerach Kinetis
4. Konfiguracja rejestru zegara.
USBDCD_CLOCK=(DCD_TIME_BASE<<2)|1;
5. W tym momencie aplikacja sprawdza stan linii PTB0, aby dokonać detekcji VBUS, ale przerwanie od portu może także zostać wykorzystane zamiast odpytywania.
// Waiting for VBUS if(FLAG_CHK(0,GPIOB_PDIR) && !FLAG_CHK(VBUS_Flag,gu8InterruptFlags)) { USBDCD_CONTROL=USBDCD_CONTROL_IE_MASK | USBDCD_CONTROL_IACK_MASK; FLAG_SET(USBDCD_CONTROL_START_SHIFT,USBDCD_CONTROL); FLAG_SET(VBUS_Flag,gu8InterruptFlags); }
6. Gdy sekwencja detekcji jest ukończona, aplikacja musi odczytać rezultat z rejestrów DCD, a następnie wysłać je do terminala.
// Rezultaty DCD. if(FLAG_CHK(DCD_Flag,gu8InterruptFlags)) { u8Error=DCD_GetChargerType(); if((u8Error&0xF0)) printf("Oooooops DCD Error"); else { if((u8Error&0x0F)==STANDARD_HOST) printf("Connected to a Standard Host"); if((u8Error&0x0F)==CHARGING_HOST) printf("Connected to a Charging Host"); if((u8Error&0x0F)==DEDICATED_CHARGER) printf("Connected to a Dedicated Charger"); }
Funkcja zwracająca rodzaj ładowarki:
UINT8 DCD_GetChargerType(void) { UINT8 u8ChargerType; u8ChargerType = (UINT8)((USBDCD_STATUS & USBDCD_STATUS_SEQ_RES_MASK)>>16); u8ChargerType|= (UINT8)((USBDCD_STATUS & USBDCD_STATUS_FLAGS_MASK)>>16); return(u8ChargerType); }
Program obsługi przerwania DCD:
void DCD_ISR(void) { USBDCD_CONTROL|= USBDCD_CONTROL_IACK_MASK; // Potwierdzenie. if((USBDCD_STATUS&0x000C0000) == 0x00080000) FLAG_SET(USBOTG_CONTROL_DPPULLUPNONOTG_SHIFT,USBOTG_CONTROL); // Uruchomienie pull-upu. if((!(USBDCD_STATUS & 0x00400000)) || (USBDCD_STATUS & 0x00300000)) FLAG_SET(DCD_Flag,gu8InterruptFlags); // Detekcja ładowarki ukończona.