阅读:994回复:0
D12:主机发送的是C1而不是C3,所以进行不下去了,怎么回事呢?
主机能够找到我的D12,可是第一次读取设备描述符时,DATA0中发送的是C1,而不是C3,但DATA中发送的是80 06 00 01 00 00 40 00,这样并不正确.也就是说,主机连设备描述符都取不到!
为什么呢?我想应该是固件的问题,可不知为什么? 固件程序如下,恳请兄弟们帮一下!谢谢! 我使用的不是中断,而是轮询: #include <reg51.h> #define D12_COMMAND (*(unsigned char xdata *)0x8100) #define D12_DATA (*(unsigned char xdata *)0x8000) extern void D12_int(); sbit D12_suspend=P1^0; sbit D12_int_n=P3^2; sbit D12_eot_n=P1^1; sbit D12_DMAck_n=P1^2; sbit D12_DMAreq=P1^3; void main(void) { P1 = 0xff; D12_int_n = 1; D12_COMMAND = 0xf3; D12_DATA = 0x06;/*设置模式0*/ D12_DATA = 0x03;/*初始化频率 12MHz*/ D12_COMMAND = 0xd0; D12_DATA = 0x80;/*设置地址 0 使能*/ D12_COMMAND=0xd8; D12_DATA=0x01;/*设置端点使能 此时LED亮*/ D12_COMMAND = 0xf3;/*连接主机*/ D12_DATA = 0x16; while(1) { if(!D12_int_n) { D12_int(); }else if(D12_DMAreq) { D12_DMAck_n = 0;/*DMA应答控制*/ D12_DATA = 49; /*单发模式*/ D12_DMAck_n=1; } 中断程序: #include <reg51.h> sbit D12_suspend=P1^0; #define D12_COMMAND (*(unsigned char xdata *)0x8100) #define D12_DATA (*(unsigned char xdata *)0x8000) extern void Setup_read(); extern void Setup_control(); extern void USB_submit(); typedef struct { unsigned char b[8]; unsigned char out; unsigned char in; unsigned char wrLength; unsigned char pNum; unsigned char *p; }TRANSMIT_STRUCT; extern TRANSMIT_STRUCT XmtBuff; void bus_reset(void); void dma_eot(void); void read_out(); char ist; void D12_int() { XmtBuff.pNum = 16; D12_COMMAND = 0xf4;/* 读中断寄存器*/ ist = D12_DATA; if(ist & 0x01) /*ENDP0_OUT*/ { XmtBuff.out = 0; XmtBuff.in = 1; D12_COMMAND = 0x40; /*读 OUT 最后状态*/ ist= D12_DATA; if (ist & 0x20) /*收到 SETUP 包*/ { Setup_read(); Setup_control(); } else { read_out(); } } else if(ist & 0x02)/*ENDP0_IN*/ ...... ...... void read_out() { char i; D12_COMMAND = XmtBuff.out;/* 选择端点0(指针指向0位置)*/ D12_COMMAND = 0xf0;/* 读标准控制码*/ XmtBuff.b[0] = D12_DATA; XmtBuff.b[1] = D12_DATA; for(i=0;i<8;i++) { XmtBuff.b = D12_DATA; } D12_COMMAND = 0xf2;/* 清 OUT 缓冲区*/ } |
|