本帖最后由 David_ming 于 2011-4-25 14:45 编辑
-
- EP0事件的解析过程。。。。。
- void EP0Event()
- {
- }
- USB中断函数:
- void UsbInt(void) interrupt 15 using 1
- {
- static uint8_t counter = 0;
- uint8_t intFlag;
- intFlag = ReadSfr(UPCON); // Status in Power Control Register
- printf("%3u:",(uint16_t)counter++);
- if(intFlag & 0x0f)
- {
- if(intFlag & USUS)
- {
- WriteSfr(UPCON, (intFlag&0xf0) | USUS); 如果检测到总线挂起信号,则会到这里
- printf("Suspend!\n");
- }
- else if(intFlag & URST)
- {
- WriteSfr(UPCON, (intFlag&0xf0) | URST); 如果检测到总线复位信号,则会到这里
- printf("Reset!\n");
- WriteSfr(UPCON, intFlag | URST);
- UsbReset();
- WriteSfr(UPCON, ReadSfr(UPCON) | CONEN);
- }
- else
- {
- WriteSfr(UPCON, (intFlag&0xf0) | URSM); 如果总线恢复(唤醒),那么会到这里
- printf("Resume!\n");
- }
- }
- else 从这里往下是非总线信号,即标准的USB请求信息
- {
- intFlag = ReadSfr(UI**);
- if(intFlag & UTXD1)
- {
- WriteSfr(UI**, UTXD1); EP1发送完毕则会到这里
- printf("EP1.\n");
- }
- else if(intFlag & URXD0)
- {
- WriteSfr(UI**, URXD0); EP0接收到一个包就到这里
- printf("EP0RX->");
- if(ReadSfr(RXCNT) != 0)
- {
- WriteSfr(EPINDEX, EP0); //must be delay sometimes
- EP0Event();
- }
- else
- {
- printf("host ACK.\n");
- }
- }
- else if(intFlag & UTXD0)
- {
- WriteSfr(UI**, UTXD0); EP0发送完一个包就到这里
- printf("EP0TX.\n");
- }
- else
- {
- WriteSfr(UI**, 0xff); 防呆,全部清一下
- }
- }
- }
|