/******************************************************************** 函数功能:USB芯片初始化。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void UsbChipInit(void) { *AT91C_UDP_TXVC=0; //enable the transceiver *AT91C_UDP_IDR=0xFFFFFFFF; //disable all USB interrupts *AT91C_PIOA_PER=(1<<16); //Enable PA16 *AT91C_PIOA_OER=(1<<16); //Output Enable PA16 ConfigValue=0; //配置值初始化为0 UsbDisconnect(); //先断开USB连接 UsbConnect(); //将USB连接上 }
/******************************************************************** 函数功能:USB芯片初始化。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void UsbChipInit(void) { UsbDisconnect(); //先断开USB连接 PLLCSR=0x04; //PLL clock Prescaler为2分频 PLLCSR|=0x02; //启动PLL while(!(PLLCSR&0x01)); //等待PLL启动完成 USBCON=0x00; //复位USB模块 USBCON=0x80; //使能USB模块 UDPADDH=0x00; //FIFO UPOE=0x00; //disable all USB interrupts UDIEN=0x00; UEIENX=0x00; ConfigValue=0; //配置值初始化为0 UsbConnect(); //将USB连接上 }
/******************************************************************** 函数功能:主函数。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void main(void) //主函数 { uint8 i; uint16 id; uint8 InterruptSource; EA=1; //打开中断 InitKeyboard(); //初始化按键 InitUART(); //初始化串口 for(i=0;i<18;i++) //显示信息 { Prints(HeadTable[i]); } id=D12ReadID(); Prints("Your D12 chip\'s ID is: "); PrintShortIntHex(id); if(id==0x1012) { Prints(". ID is correct! Congratulations!\r\n\r\n"); } else { Prints(". ID is incorrect! What a pity!\r\n\r\n"); } UsbDisconnect(); //先断开USB连接 UsbConnect(); //将USB连接上 ConfigValue=0; //配置值初始化为0 while(1) //死循环 { if(D12GetIntPin()==0) //如果有中断发生 { D12WriteCommand(READ_INTERRUPT_REGISTER); //写读中断寄存器的命令 InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器 if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理 if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理 if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理 if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理 if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理 if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理 if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理 if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理 } if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据 { LEDs=~KeyPress; //利用板上8个LED显示按键状态,按下时亮 if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据 { KeyCanChange=0; //禁止按键扫描 if(KeyUp||KeyDown||KeyPress) //如果有按键事件发生 { SendReport(); //则返回报告 } KeyCanChange=1; //允许按键扫描 } } } }
static void usb_disconnect(struct usb_interface *interface) { UsbDisconnect((pUsb_interface)interface); }