打印
[圈圈教你玩USB]

【求助】c8051单片机usb固件的get_report问题

[复制链接]
2433|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
graycker|  楼主 | 2012-5-31 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Get_Report (void)
{
        unsigned char test[] = {0x01, 0x02, 0x03, 0x04};
   // call appropriate handler to prepare buffer
   ReportHandler_IN_ISR(SETUP.wValue.c[LSB]);
   // set DATAPTR to buffer used inside Control Endpoint

        DATAPTR = test;
        DATASIZE = SETUP.wLength.c[LSB];
   /*
   DATAPTR = IN_BUFFER.Ptr;
   DATASIZE = IN_BUFFER.Length;
   */
   if (EP_STATUS[0] != EP_STALL)
   {
          // Set serviced SETUP Packet
      POLL_WRITE_BYTE (E0CSR, rbSOPRDY);
      EP_STATUS[0] = EP_TX;            // Endpoint 0 in transmit mode
      DATASENT = 0;                    // Reset DATASENT counter
   }
}

中断里面的处理是这样的
Fifo_Write_InterruptServiceRoutine (FIFO_EP0, DATASIZE, (unsigned char*)DATAPTR);
ControlReg |= rbDATAEND;// Add Data End bit to bitmask
EP_STATUS[0] = EP_IDLE; // Return EP 0 to idle state

还有发送函数
void Fifo_Write_InterruptServiceRoutine (unsigned char addr, unsigned int uNumBytes, unsigned char * pData)
{
   int i;

   // If >0 bytes requested,
   if (uNumBytes)
   {
      while (USB0ADR & 0x80);          // Wait for BUSY->'0'(register available)
      USB0ADR = (addr);                // Set address (mask out bits7-6)

      // Write <NumBytes> to the selected FIFO
      for (i=0; i<uNumBytes; i++)
      {
         USB0DAT = pData;
         while (USB0ADR & 0x80);       // Wait for BUSY->'0' (data ready)
      }
   }
}

流程是接收到get_report命令后进入函数,然后进入中断,再fifo_write发送出去
可我接收到的数据不对,只有00和DATASIZE
想问下是什么原因呢?

相关帖子

沙发
graycker|  楼主 | 2012-6-1 00:10 | 只看该作者
没有谁遇到同样问题么?

使用特权

评论回复
板凳
graycker|  楼主 | 2012-6-1 18:12 | 只看该作者
void Fifo_Write_InterruptServiceRoutine (unsigned char addr, unsigned int uNumBytes, unsigned char * pData)
{
   int i;

if ((*DATAPTR == 0x00)&&(flag_led == 1)) ////////////调试
{
        P0 |= 0x10;
        *DATAPTR = 0x03;
}

   // If >0 bytes requested,
   if (uNumBytes)
   {
      while (USB0ADR & 0x80);          // Wait for BUSY->'0'(register available)
      USB0ADR = (addr);                // Set address (mask out bits7-6)

      // Write <NumBytes> to the selected FIFO
      for (i=0; i<uNumBytes; i++)
      {
         USB0DAT = pData[i];
         while (USB0ADR & 0x80);       // Wait for BUSY->'0' (data ready)
      }
   }
}
程序一进入这个函数DATAPTR 的值就改变(也就是pData)半天都想不明白,可能什么原因呢?
if ((*DATAPTR == 0x00)&&(flag_led == 1)) ////////////调试
{
        P0 |= 0x10;
        *DATAPTR = 0x03;
}
这个是我为了调试加进去的,不知道有没有谁遇到过

使用特权

评论回复
地板
graycker|  楼主 | 2012-6-2 12:13 | 只看该作者
我用的是c8051的单片机,之前模拟鼠标还好的,后来改了下,就什么都不输出了,用bus hound抓包是空的数据
在输出get report的时候,也是这样,我就在输出函数
void Fifo_Write_InterruptServiceRoutine (unsigned char addr, unsigned int uNumBytes, unsigned char * pData)
{
   int i;

if (flag_getreport == 1) ////////////调试
{
        uNumBytes = 2;
        pData[0] = 0x01;
        pData[1] = 0x01;
        flag_led = 0;
}
……
}
里加了中间调试句,谁告诉我下啊
没人回复,再发个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

150

帖子

2

粉丝