LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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.