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的中断造成的呢,因为其他的中断我都关闭了。
} |