打印

st关于usb库函数的端点0控制传输疑问

[复制链接]
1544|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxl6534|  楼主 | 2011-12-14 08:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
st提供的usb库函数里端点0带数据的控制传输是用以下函数实现的:
RESULT banlv_Data_Setup(u8 RequestNo)
{
u8 *(*CopyRoutine)(u16);

  CopyRoutine = NULL;
    if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))
      && (pInformation->USBwIndex0 == 0))
          {
                   if (pInformation->USBwValue1 == 0x06)
            {
              CopyRoutine = banlv_GetDevicequalifierDescriptor;
            }                    
          }
/*********************************************************************************************************/
     else if ((Type_Recipient == (VENDOR_REQUEST | ENDPOINT_RECIPIENT))
           && RequestNo == 0x09)
  {
    flag = 1;
                  CopyRoutine = set_banlv_Number;
         }
  }
/*********************************************************************************************************/
if (CopyRoutine == NULL)
  {
    return USB_UNSUPPORT;
  }

  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}
我在其中添加了一些自己的厂商请求,如上面程序里命令号为9的厂商请求。我发现当第一次退出USB中断时控制传输的数据还没有到达,我在主程序里有如下函数:
if(flag)
{
//delay(1000);
                                   USART1->DR=number[0];
                        while((USART1->SR&0X40)==0);
                                USART1->DR=number[1];
                        while((USART1->SR&0X40)==0);
for()
{
读SD卡,通过端点1块传输;
}
flag = 0;
}
数组number[]就是CopyRoutine = set_banlv_Number;所指向的地址。当我不加这个延时函数时我发现number[0],number[1]还是原来的值,当有这个延时函数后就变为上位机传过来的数据了。例如number[0],number[1]的初始值都是0,上位机传来的数据是0x01,0x02,如果没有延迟串口输出的就是 0、0有延迟输出的就是1,2.  那是不是说整个控制传输的3步在这里是分三次中断进行的,如果是这样我想添加一个标志(flag)在控制传输全部完成的地方改变应该如何操作呢?谢谢
另外我发现在读SD卡的操作里每次第1,2次读SD卡总会失败,会不会试端点0的中断造成的呢,因为其他的中断我都关闭了。

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

本版积分规则

1

主题

26

帖子

0

粉丝