这几天想学usb,就看了些usb协议方面的东西,pdiusbd12芯片,现在也基本能看懂网上的一些程序,但是有几个问题还是搞不大懂,望各位在座高手指点一二,谢谢~~
1.D12到底何时产生中断
就是什么时候int_n会产生低电平呢?
2.Setup包中的数据在哪里?为什么可以直接读取数据包的8字节数据
setup 设置阶段
主机发送一个令牌包setup pid 和地址等信息到端点0的out,它的这些信息在哪里?不在缓冲区中吗?我看很多程序都是--得到中断--查出是setup包--去端点0的out缓冲区读数据--得到8字节数据(bmRequestType,brequest,wvalue,windex,wlength)收到的是第二个包的数据。
3.d12得到数据后返回的ack呢?它自动发的吗?
如上题,书上说设置阶段总共有三个包--主机发送令牌包,主机发送数据包(里面就是要求了),设备发送应答包,可是我从来没见到应答包,是不是设备自己发过去的?什么时候发的?
4. d12有个命令叫- 应答建立(f1),
void endp0_out(void) //终端点0输出中断处理
{
Last_Status.Register=read_last_status(0);
if(Last_Status.Status.setup_packet)
{
Control_Data.wLength=0;
Control_Data.wCount=0;
if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))//
read_endpoint_buff函数中当数据读完后执行了一个清除缓冲区操作,这个操作在‘应答建立’命令之前执行会有效吗?
{
set_endpoint_status(0,0);//初始化端点0,等待接收一个data0 pid
set_endpoint_status(1,0);
return;
}
Control_Data.DeviceRequest.wValue=SWAP(Control_Data.DeviceRequest.wValue);
Control_Data.DeviceRequest.wIndex=SWAP(Control_Data.DeviceRequest.wIndex);
Control_Data.DeviceRequest.wLength=SWAP(Control_Data.DeviceRequest.wLength);
ack_setup(0);
这两个就是应答建立
ack_setup(1);
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
usb_flags.flags.not_end=0;
usb_flags.flags.usb_endp0_in=1;
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.setup_packet_out=0;
if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
else {usb_flags.flags.setup_packet_out=1;return;}
}
else
{
select_endpoint(0);
clear_buffer();
}
}