nannan42
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2005-09-27
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:994回复:0

D12:主机发送的是C1而不是C3,所以进行不下去了,怎么回事呢?

楼主#
更多 发布于:2003-04-24 21:16
主机能够找到我的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 缓冲区*/
}

游客

返回顶部