//*** USB SIE Command Code Tabelle *** //************************************* //*** SIE Commandos *** #define USB_SIE_Write 0x01 #define USB_SIE_Read 0x02 #define USB_SIE_Command 0x05 //*** Device commands *** #define USB_SetAddress 0xD0 #define USB_ConfigureDevice 0xD8 #define USB_SetMode 0xF3 #define USB_ReadCurrentFrameNumber 0xF5 #define USB_ReadTestRegister 0xFD #define USB_SetDeviceStatus 0xFE #define USB_GetDeviceStatus 0xFE #define USB_ReadErrorStatus 0xFB //*** SIE Command-Befehl senden void USBCmdToSIE(unsigned char CMD_Code, unsigned char CMD_Data) { //*** SIE Operationstyp "Command" laden *** LPC_USB->USBDevIntClr = 0x10; //Loesche CCEMPTY Bit LPC_USB->USBCmdCode = (CMD_Code << 16); //Schreibe den Code ins SIE Register LPC_USB->USBCmdCode = LPC_USB->USBCmdCode | (USB_SIE_Command << 8); //Schreibe den SIE Operationstyp ins SIE Register while((LPC_USB->USBDevIntSt & 0x10) == 0x00); //Warte bis der Befehl beschrieben wurde LPC_USB->USBDevIntClr = 0x10; //Loesche CCEMPTY Bit //*** SIE Daten in den Ausgewaehlten SIE Register schreiben ** LPC_USB->USBCmdCode = (CMD_Data << 16); //Schreibe die Daten ins SIE Register LPC_USB->USBCmdCode = LPC_USB->USBCmdCode | (USB_SIE_Write << 8); //Schreibe den SIE Operationsty WRITE ins SIE Register while((LPC_USB->USBDevIntSt & 0x10) == 0x00); //Warte bis der Befehl beschrieben wurde LPC_USB->USBDevIntClr = 0x10; //Loesche CCEMPTY Bit } /******************************************************************************************************************************** * Function: USB_IRQHandler(void) * * Input: none * * Output: none * * Overview: - Interruptroutine vom USB * *******************************************************************************************************************************/ void USB_IRQHandler(void) { GPIO_PinWrite(2,1,0); if((LPC_USB->USBDevIntSt & 0x08) != 0x00) { GPIO_PinWrite(2,0,0); uiTest1 = LPC_USB->USBDevIntSt; // Disable Endpoint interrupts and clear all interrupts LPC_USB->USBEpIntEn = 0x0E; LPC_USB->USBEpIntClr = 0xFFFFFFFF; LPC_USB->USBDevIntClr = 0xFFFFFFFF; // USB_Register_Init(); } ------- ------- Auszug aus dem Interrupt Funktion, welche leider gar nicht durchlaufen wird. ------ } void USB_Register_Init(void) { //*** USB Einstellungen *** //************************* //*** Spannungsfreigabe USB / PCONP *** LPC_SC->PCONP = LPC_SC->PCONP | (1UL << 31); //PCUSB einschalten LPC_SC->USBCLKCFG = 0; //*** PINCON *** //P1.30-USB_VBUS //P1.18-USB PIN Connect LPC_PINCON->PINSEL3 = LPC_PINCON->PINSEL3 | 0x20000010; LPC_PINCON->PINMODE3 = LPC_PINCON->PINMODE3 | 0x20000000; //Pull-Up und Pull-Down am Vbus PIN ausschalten //USB PIN[0]29/30 LPC_PINCON->PINSEL1 = LPC_PINCON->PINSEL1 | 0x14000000; //PIN 0.29 und 0.30 auf USB Stellen LPC_PINCON->PINMODE1 = LPC_PINCON->PINMODE1 | 0x28000000; //Pull-Up und Pull-Down ausschalten //USB PIN[2]9 SoftConnect LPC_PINCON->PINSEL4 = LPC_PINCON->PINSEL4 | 0x00040000; //PIN 2.9 auf SoftConnect einstellen //*** PLL1 Einstellung 48MHz *** //****************************** LPC_SC->PLL1CFG = 0x23; LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; LPC_SC->PLL1CON = 0x01; // PLL1 Enable LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; while (!(LPC_SC->PLL1STAT & (1<<10))); // Wait for PLOCK1 LPC_SC->PLL1CON = 0x03; // PLL1 Enable & Connect LPC_SC->PLL1FEED = 0xAA; LPC_SC->PLL1FEED = 0x55; while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8)))); // Wait for PLLC1_STAT & PLLE1_STAT //*** Einstellung USB Engine *** //****************************** //*** USBClkCtrl *** LPC_USB->USBClkCtrl = 0x12; //Device Clock Enable / Disable :Bit1 / AHB Clock Enable / Disable :Bit4 while((LPC_USB->USBClkSt & 0x12) != 0x12); //*** Interrupts loeschen *** LPC_USB->USBEpIntClr = 0xFFFFFFFF; //Endpunkt Interrupt loeschen LPC_USB->USBDevIntClr = 0xFFFFFFFF; //Device Interrupt loeschen //*** Endpunkt 0 *** LPC_USB->USBReEp = LPC_USB->USBReEp | 1; //*** USBEplnd *** LPC_USB->USBEpInd = 0; //:Bit0-4 PHY_EP = Auswahl vom Endpoint //*** USBMaxPSize *** LPC_USB->USBMaxPSize = 8; //:Bit0-9 = MPS / Groesse vom Endpoint while((LPC_USB->USBDevIntSt & 0x0100) == 0x00); //Warte bis EP_RLZED gesetzt wurde LPC_USB->USBDevIntClr = 0x0100; //*** Endpunkt 1 *** LPC_USB->USBReEp = LPC_USB->USBReEp | 2; //*** USBEplnd *** LPC_USB->USBEpInd = 1; //:Bit0-4 PHY_EP = Auswahl vom Endpoint //*** USBMaxPSize *** LPC_USB->USBMaxPSize = 8; //:Bit0-9 = MPS / Groesse vom Endpoint while((LPC_USB->USBDevIntSt & 0x0100) == 0x00); //Warte bis EP_RLZED gesetzt wurde LPC_USB->USBDevIntClr = 0x0100; //*** Endpunkt 2 *** //*** USBEplnd *** LPC_USB->USBReEp = LPC_USB->USBReEp | 4; LPC_USB->USBEpInd = 2; //:Bit0-4 PHY_EP = Auswahl vom Endpoint //*** USBMaxPSize *** LPC_USB->USBMaxPSize = 8; //:Bit0-9 = MPS / Groesse vom Endpoint while((LPC_USB->USBDevIntSt & 0x0100) == 0x00); //Warte bis EP_RLZED gesetzt wurde LPC_USB->USBDevIntClr = 0x0100; //*** Interrupts loeschen *** LPC_USB->USBEpIntClr = 0xFFFFFFFF; //Endpunkt Interrupt loeschen LPC_USB->USBDevIntClr = 0xFFFFFFFF; //*** USBEpIntEn *** LPC_USB->USBEpIntClr = 0xFFFFFFFF; LPC_USB->USBEpIntEn = 0x3F; //Interruptfreigabe EP0, EP1 und EP2. Wird zudaetzlich der Slave Mode fuer diese EP freigegeben //*** USBEpIntPri *** LPC_USB->USBEpIntPri = 0x0000; //Interruptprioritaet der einzelnen Endpunkte //*** USBCmdCode *** //SIE SetMode USBCmdToSIE(USB_SetMode, 0x7F); //*** USBEpDMADis *** //Endpunkte vom DMA loeschen LPC_USB->USBEpDMADis = 0xFFFFFFFC; //*** USBDMARClr *** //Endpunkt DMA Interruptflag loeschen LPC_USB->USBDMARClr = 0xFFFFFFFC; //*** DMA Interrupts loeschen *** LPC_USB->USBEoTIntClr = 0xFFFFFFFF; LPC_USB->USBNDDRIntClr = 0xFFFFFFFF; LPC_USB->USBSysErrIntClr = 0xFFFFFFFF; //*** USBCmdCode *** //SIE SetAddress und DEV_EN einschalten USBCmdToSIE(USB_SetAddress, 0x80); //*** USBDevIntEn *** LPC_USB->USBDevIntEn = 0x0E; //Interruptffreigabe / DEV_STAT, EP_SLOW, EP_FAST LPC_SC->USBIntSt = 0x80000000; //*** Interrupteinstellung *** NVIC_ClearPendingIRQ(USB_IRQn); //Clear pending USB interrupt NVIC_EnableIRQ(USB_IRQn); //USB Interrupt einschalten //*** USBCmdCode *** //CON Pin auf LOW Level setzen USBCmdToSIE(USB_SetDeviceStatus, 0x01); //*** USBCmdCode *** //USB PIN Connect LED einschalten USBCmdToSIE(USB_ConfigureDevice, 0x01); } int main(void) { //*** Startup Einstellung *** //**************************** SystemInit(); SystemCoreClockUpdate (); /* Update system core clock */ //*** Ende Startup Einstellung *** //********************************* //*** GPIO Einstellung *** //************************* //*** Porteinstellung *** GPIO_SetDir(2,0,GPIO_DIR_OUTPUT); GPIO_SetDir(2,1,GPIO_DIR_OUTPUT); GPIO_SetDir(2,2,GPIO_DIR_OUTPUT); GPIO_SetDir(2,3,GPIO_DIR_OUTPUT); GPIO_SetDir(2,4,GPIO_DIR_OUTPUT); GPIO_SetDir(2,5,GPIO_DIR_OUTPUT); GPIO_SetDir(2,6,GPIO_DIR_OUTPUT); GPIO_SetDir(2,7,GPIO_DIR_OUTPUT); GPIO_SetDir(2,8,GPIO_DIR_OUTPUT); GPIO_SetDir(2,9,GPIO_DIR_OUTPUT); GPIO_SetDir(2,10,GPIO_DIR_OUTPUT); GPIO_SetDir(2,11,GPIO_DIR_INPUT); GPIO_SetDir(2,12,GPIO_DIR_INPUT); GPIO_SetDir(2,13,GPIO_DIR_OUTPUT); GPIO_SetDir(1,18,GPIO_DIR_OUTPUT); GPIO_SetDir(1,30,GPIO_DIR_INPUT); GPIO_SetDir(0,29,GPIO_DIR_INPUT); GPIO_SetDir(0,30,GPIO_DIR_INPUT); GPIO_SetDir(2,9,GPIO_DIR_OUTPUT); //*** Einzelne Pins setzen / loeschen GPIO_PinWrite(2,0,1); GPIO_PinWrite(2,1,1); GPIO_PinWrite(2,2,1); GPIO_PinWrite(2,3,1); GPIO_PinWrite(2,4,1); GPIO_PinWrite(2,5,1); GPIO_PinWrite(1,18,1); GPIO_PinWrite(2,9,1); GPDMA_Uninitialize(); // GPIO_PinWrite(2,9,0); USB_Register_Init(); // GPIO_PinWrite(2,9,0); while(1) { if(USBSIEtoCPU(0xFD,0xFD) == 0xA50F) { GPIO_PinWrite(2,2,0); } if(GPIO_PinRead(2,12) == 0x00) { GPIO_PinWrite(2,0,1); GPIO_PinWrite(2,1,1); GPIO_PinWrite(2,2,1); GPIO_PinWrite(2,3,1); GPIO_PinWrite(2,4,1); } } }