关于d12的某些基础问题??

tigeracl   2009-8-25 09:20 楼主
这几天想学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();

  }

}

回复评论 (2)

没人知道吗????
点赞  2009-8-25 12:30
1.检测中断的问题
是主机usb控制器根据端口电压的变化来产生中断的,高速的和快速的好像极性相反,比如插上usb设备电压由高到底或者是由低到高
2.setup 的问题
其实当usb设备插上主机时,物理上的通讯就已经建立了,当然能通过nazi编码进行传送数据了。
3.ack
  应该是自动发的吧
4.应该是先清除再应答,把缓冲区清楚准备好进行下一次数据传输

点赞  2009-9-4 10:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复