打印
[圈圈教你玩USB]

关于d12的某些基础问题??大侠救命..

[复制链接]
2062|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 thecrypig 于 2009-8-24 22:54 编辑

这几天想学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();

  }

}


相关帖子

沙发
thecrypig|  楼主 | 2009-8-25 09:12 | 只看该作者
顶~~

使用特权

评论回复
板凳
thecrypig|  楼主 | 2009-8-25 12:29 | 只看该作者
没人知道吗~~

使用特权

评论回复
地板
computer00| | 2009-8-27 01:29 | 只看该作者
1、D12何时产生中断在数据手册里写得很清楚。它有不同的模式,调试模式和正常模式。在正常模式下,端点发送完数据(被主机取走并返回ACK)就会产生中断,端点接收完数据(数据校验正确)也会发生中断。另外,还有总线复位,总线挂起等都会产生中断。

2、setup包中的数据就是8字节的数据,可以直接从端点0中读到。至于PID、地址、端点地址等,属于setup令牌包的内容,在D12里面是看不到的,只能通过一个是否是setup包的标志来判断。我们只能读到8字节的数据包。

3、ACK是D12自动发的。

4、D12的建立应答命令是发送给端点的,与USB协议里面的ACK是不同的意义。USB协议里面的ACK,是由D12自动完成的。而D12的ACK命令是重新使能端点0的,否则操作端点0的使端点缓冲有效、清除端点缓冲等命令都无效了。这个机制是为了保证收到setup包后,里面保存的数据始终都是最后一个有效的setup包,而不会被用户的程序冲掉。所以,在收到setup包之后(这时D12已经自动给D12发送了ACK了,否则在正常模式下不会产生中断),我们要先把数据拿出来,再用ACK命令重新使能端点0,才能清除端点缓冲区以及重新写数据到端点0。

使用特权

评论回复
5
thecrypig|  楼主 | 2009-9-13 21:52 | 只看该作者
谢谢了 圈圈,看了你的书了..

使用特权

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

本版积分规则

11

主题

23

帖子

0

粉丝