holyrock
驱动牛犊
驱动牛犊
  • 注册日期2003-12-27
  • 最后登录2005-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1491回复:11

D12固件中的一些疑问

楼主#
更多 发布于:2004-02-25 17:58
1.在D12ci.c的D12_ReadEndpoin函数中这么一段:
outportb(D12_COMMAND,0xF0);
j=inportb(D12_DATA);          //1st Byte is empty
j=inportb(D12_DATA);          //2nd BYte is the length of data
if(j>len)
    j=len;
for(i=0;i<j;i++)
    *(buf+i)=inportb(D12_DATA); //read data
outportb(D12_COMMAND,0xF2); //clear buf
最后一句outportb(D12_COMMAND,0xF2)的作用是清buffer吧,那么如果一次读没有将buffer里的数都读完,这么一来不是把余下未读的数都清空了吗?

2.在Isr.c的ep0_rxdone函数中:
if(ControlData.DeviceRequest.wLength==0) //No data
{
bEPPflags.bits.setup_packet=1; bEPPflags.bits.control_state=USB_IDLE;
}
else //Have data
{
//If length>Max leng of endp0,stall,MAX_CONTROLDATA_SIZE= 8
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state=USB_IDLE; D12_SetEndpointStatus(0,1); D12_SetEndpointStatus(1,1);
}
else
{//Why here hasn't set the setup-package flag?????
bEPPflags.bits.control_state=USB_RECEIVE;
}
}
为什么没有数据的时候,确建立setup包标志,而接收正确后确不建立setup包标志?

3.在Mainloop.c中的main函数里对处理完setup包后要将D12suspd置1?这样除了重新启动,不就永远挂起了?

请高手指点。3x a lot
holyrock
驱动牛犊
驱动牛犊
  • 注册日期2003-12-27
  • 最后登录2005-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-27 10:56
To bjdxwz:有点或然开朗的意思,不过susp管脚什么时候是输出,什么时候是输入?是自动的,还是人为规定的?
holyrock
驱动牛犊
驱动牛犊
  • 注册日期2003-12-27
  • 最后登录2005-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-27 10:47
To zhangzhuoliang:第一个问题我是这么认为的,对于控制传输,有三个阶段:建立阶段(格式:[Token Packet][Data Package][Ack]),数据阶段(可有可无,格式同上),状态阶段。在建立阶段d12根据令牌包判断,如果是setup包,那么它的Data package就不能超过8B,否则出错;如果收到的包不是setup包,那么就应该是数据阶段,这个时候Data package就不一定是8B了,此处是16B;最后的建立阶段是d12自动完成的。第二个问题我也很不解,我想也许是要我们根据不同的需要自己来完成的。
bjdxwz
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-27 09:58
对于suspend脚,作为输入时,在挂起模式下,将其置低,可以访问d12内部寄存器。置高时,无法访问。作为输出脚时,在总线处于空闲状态下,输出高电平。你可以通过判断这个脚是否为高电平来判断d12是否进入挂起状态。如果你的设备不会进入挂起状态,你将这个脚接地都可以。在非挂起状态下,suspend应当一直为低,即使你将他置高,你用万用表量一下看看,我记不清了。

[编辑 -  2/27/04 by  bjdxwz]
zhangzhuoliang
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望42点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-27 09:46
呵呵我也是新手,咱们讨论一下下面的问题!自己在想总是有点不明白!这是我看别人问的!我也不会!
1)在端点0的OUT中断程序里有这么一句:
....
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state=USB_IDEL;
D12_SetEndpointStatus(0,1);
D12_SetEndpointStatus(1,0);
}
else
{
bEPPflags.bits.contorl_state=USB_RECEIVE;
}
....
其中MAX_CONTROLDATA_SIZE=8;程序表明,当要传输的数据大于8时就会停掉端点(属于出错情况);这是当收到的是setup包的时候,但是再看看端点0的另外一种情况当收到的不是setup包的时候:
if(bEPPflags.bit.control_state==USB_RECEIVE)
{
i=D12_ReadEndpoint(0,EP0_PACKET_SIZE, ControlData.dataBuffer+controldata.wCount);
contorlData.wCount+=i;
}
在这里,一次却可以收到大于8的数,EP0_PACKET_SIZE等于16!即一次可以从端点0的缓冲区里读到16个字节的数据,这是不是程序有矛盾呀???

2)在D12_SmartBoard里,为什么它的固件里的端点1IN的程序里没有做数据的处理,只是清理了标志位?还有主端点in的程序里也没有数据的处理,难道smart――board里没用到这两个端点吗?
holyrock
驱动牛犊
驱动牛犊
  • 注册日期2003-12-27
  • 最后登录2005-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-27 09:21
   讨论一下就是不一样,对于1、2我搞懂了!谢谢各位。我把wlength的意义理解错了。
   问题3还是有点不解,如果总线传输就唤醒,那么d12的suspend管脚不是还是高吗?也没见哪里把它该回来啊
whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-27 09:09
想了想,还是zhangzhuoliang说得有道理哦!
zhoucs
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-26 21:43
我是一个新手,正在做基于USB的数据采集和传输系统,用的是AD1674,89C52和D12,一直在看周立功的那本书,实在很难看懂啊,哪位大虾能给我传一份相关资料啊,电路图,源程序啊。。。。万分感激,急盼回音  鄙人EMAIL: iamzcs@163.com  
zhangzhuoliang
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望42点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-26 19:14
1:端点写多少是你控制的读多少当然也是你控制了!所以只要一致就好了!
2:if(ControlData.DeviceRequest.wLength==0) //No data
{
bEPPflags.bits.setup_packet=1; bEPPflags.bits.control_state=USB_IDLE;
}
else //Have data 这里表示你的setup包是一个没有数据传输的保所以没有传数的操作!且置位!
{
//If length>Max leng of endp0,stall,MAX_CONTROLDATA_SIZE= 8
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state=USB_IDLE; D12_SetEndpointStatus(0,1); D12_SetEndpointStatus(1,1);
}
else
{//Why here hasn't set the setup-package flag?????
bEPPflags.bits.control_state=USB_RECEIVE;
}这里没setupflag因为这个请求是带out的请求setup包!必须你接受完所有的数据后才能置位!所以在接下来的程序中才把它置位!因为你不把数据接收完相当于你的这次setup(带out的)中断处理没有完成当然不能置位了

}
3:好像是只要总线有传输请求就可以唤醒了!
whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-02-26 18:27
对于第二个问题,我想了一下,应该加上,这是逻辑上的,但是想象一下传输的过程,加不加都一样,没有影响。
当d12接受到setup包后,进入end0out中断程序,运行到了have data的判断后,(没有setup-packet=1)返回了主程序。因为刚刚的中断程序中将bEPPflags.bits.control_state=USB_RECEIVE;所以下一个包应该是一个out包,数据传输到end0out中,然后还是由end0out中断处理程序读出数据,并没有什么功能上的影响!
本人也是初学,不对之处请指教!
whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-02-26 18:17
问题1:其实应该这样想,读数据的长度是由你自己控制的,即len参数,看看调用D12_readpoint的时候,len参数一般都会等于要读的端点缓存的大小,所以不会出这个问题。
2:开始没有注意这个问题,看来还是大家讨论有收获,我觉得这是软件编写的问题,应该加入setuppacket=1;
3:第三个问题也不明白,建议到这个网址问问,如果有正确答案,请告诉我,谢谢!
http://www.driverdevelop.com/forum/post.php?action=reply&fid=9&tid=61303
holyrock
驱动牛犊
驱动牛犊
  • 注册日期2003-12-27
  • 最后登录2005-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-02-26 09:33
  为什么没人回答呢?是不是给分太少了,这已经是我的全部了,哪位大侠救救我吧
游客

返回顶部