junj18
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1759回复:15

我想让设备知道我需要高速数据传输,首先应该是发中断让总线复位,然后我怎样才能影响设备的状态位啊?

楼主#
更多 发布于:2003-09-25 16:13
其实就是怎样让设备知道我现在需要置上高速标志了
努力。。努力。。一切都会好的,相信自己!
free_man_free
驱动小牛
驱动小牛
  • 注册日期2003-08-19
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-25 22:02
你可以GET PIPE看看!
如果最大的可传输包为0x40,表示现在是USB1.0状态,如果最大的可传输包是0x200,表示现在工作在2.0状态!
junj18
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-28 13:42
这个我知道啊,系统是默认1。1的,我要是切换到高速的话,要对芯片复位并且要使中断寄存器的状态在高速状态(HS_STATES),我在中断中才会检测到这个状态啊!也就是这个状态位我该怎样影响!
努力。。努力。。一切都会好的,相信自己!
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-09-28 15:42
在程序中让它变呀。 它变了不就去中断了 么??

free_man_free
驱动小牛
驱动小牛
  • 注册日期2003-08-19
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-09-30 01:01
我的系统默认都是USB2。0,怎么你的系统默认是1。0呢?
看看你的机器是否支持USB2.0??? :D
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-09-30 17:43
你们用什么片子?不能根据usb port的不同,自动切换配置么?
二姑家的猫想......
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-02 11:03
这个标志位你是不能影响的!
当设备复位时,设备会发送一个高速的脉冲检测主机控制器是否能工作于高速模式,如果能则设备方会收到高速检测中断,在这个中断你你需要设置一个全局变量来做标志位,例如,是1标志高速模式,然后固件里根据这个标志的情况重新配置端点。

也就是说这个高速检测中断你只能收到并处理,不能手动让它产生,我是这样理解的。
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-10-04 08:22
这个标志位你是不能影响的!
当设备复位时,设备会发送一个高速的脉冲检测主机控制器是否能工作于高速模式,如果能则设备方会收到高速检测中断,在这个中断你你需要设置一个全局变量来做标志位,例如,是1标志高速模式,然后固件里根据这个标志的情况重新配置端点。

也就是说这个高速检测中断你只能收到并处理,不能手动让它产生,我是这样理解的。

哦! 原来不能影响呀。 那其他的标志位呢? 端点1,端点0等等。是不是也不能影响呀。 还有如果给端点1发完第一次数据,想发第二次,主机怎么知道什么时候发?

junj18
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-10-08 08:08
jinghuiren兄,如果我的系统在初始复位的时候能检测的可以在高速运行,但是我现在没有数据要传输的,系统会进入全速模式(应该是默认的),当我需要传输数据的时候,系统应该是复位并且切换到高速模式,也就是你说的给一个全局变量赋值,我现在就是不明白该怎样让系统复位并且给让我DEVICE知道现在需要切换到高速了?
努力。。努力。。一切都会好的,相信自己!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-08 10:51
[quote哦! 原来不能影响呀。 那其他的标志位呢? 端点1,端点0等等。是不是也不能影响呀。 还有如果给端点1发完第一次数据,想发第二次,主机怎么知道什么时候发?

 [/quote]

设备并不能通知主机断点有数据,主机是通过查询获知端点是否有数据的,当你主机发送deviceiocontrol或者readfile读取数据时,驱动便不断的发送in token到设备查询设备是否有数据,如果有,则在下一个in token把数据读走。

你设备边只要发现端点为空就把数据写进去,等待主机取走即可。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-10-08 11:09
jinghuiren兄,如果我的系统在初始复位的时候能检测的可以在高速运行,但是我现在没有数据要传输的,系统会进入全速模式(应该是默认的),当我需要传输数据的时候,系统应该是复位并且切换到高速模式,也就是你说的给一个全局变量赋值,我现在就是不明白该怎样让系统复位并且给让我DEVICE知道现在需要切换到高速了?


不知道你用的是不是1581,下面是1581对于hs检测的情况。

7.3.3 HS 检测
在USB 规范下ISP1581 不单要处理一种电气状态FS/HS 当设备和主控制器已经在USB 电缆两
端连接好了ISP1581 器件就默认为全速FS 状态直至主控制器发出一个总线复位信号
在总线复位期间器件发送一个高速(HS)模式检测信号来判断主控制器支持的是高速USB 规范还是最
初USB 规范在对这个信号进行处理时必须连接一个上拉电阻同时内部的终止寄存器禁用如果信号
处理结束后得到的是一个HS 的握手信号表明有一个HS 主机与总线相连那么ISP1581 就转换到HS 状
在HS 状态下ISP1581 要定时地对总线状态进行检测如果总线未被使用的时间超过3ms 设备就返
回到FS 状态来检查USB 总线的SE0(单端0) 若检测到的SE0 达到了指定时间100us 到875us 见USB 2.0
的7.1.7.6 ISP 1581 转换到高速(HS)模式信号检测状态做一个HS 的握手检测否则ISP1581 为FS 状态
总线挂起

因此我认为,当你的设备从hs转换到fs时,你的设备已经进入了挂起状态,如果你禁止了设备的挂起,那么这个状况就不会发生了,如果你允许挂起,那么挂气后你如果想使用就必须唤醒,唤醒后你的设备会再收到一个hs检测中断,在这个中断里你要重新复位设备!才能将设备恢复到高速状态,也就是说从hs到fs不需要复位,但是从fs到hs需要重新复位,所以我建议如果你的设备不在乎功耗,那么你不要使能设备的挂起和唤醒功能!

以上是我的理解,作为你的参考
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-08 11:35
我觉得jinghuiren是对的
一个设备的属性应该是在它枚举时已经确定了它的性质,我觉得它的配置是不能动态改变的,要改变的化,我觉得只有重新枚举系统才能认可它。
驱网是你们的,也是我们的,归根结底还是大家的!
junj18
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-08 17:50
首先感谢jinghuiren的讲解,很详细的,我也是这样理解的。我还是有一些不明白的地方(是ISP1581),是不是我要是用2。0的主机接口的话,我上电的时候,默认是HS状态,而后要是3MS没有使用总线的话,系统进入默认的FS状态挂起,要是唤醒的话,由PC端复位就可以了,是不是这样理解啊!?我看到有的程序是这样的:

  int_low = ISP1581_ReadInterruptRegisterLow();
  int_high = ISP1581_ReadInterruptRegisterHigh();
  if(int_low != 0 || int_high != 0)
    {
     if(int_low & int_busreset)  
     {
ISP1581_IntClearl(int_busreset);
  if(int_low & int_hs_stat)      
    {
        bZBoardFlags.bits.ConnectSpeed = HighSpeed;
        bZBoardFlags.bits.bBus_Reset = 1;
        int_low &= ~int_hs_stat;
        ISP1581_IntClearl(int_hs_stat);
    }
  else
    {
     bZBoardFlags.bits.ConnectSpeed = FullSpeed;
     bZBoardFlags.bits.bBus_Reset = 1;
    }
   }
 if(int_low & int_hs_stat)               //.5
   {
    ISP1581_IntClearl(int_hs_stat);
    if(bZBoardFlags.bits.ConnectSpeed == FullSpeed)
     {
       bZBoardFlags.bits.ConnectSpeed = HighSpeed;
       bZBoardFlags.bits.bBus_Reset = 1;
       MCU_LED1 = 0;
     }
  }
这是中断中的一段,其中第一个IF语句是检测的复位和高速状态,第二个IF语句仅仅检测了一个高速状态标志。
努力。。努力。。一切都会好的,相信自己!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-10-08 19:13
如果你别的地方有查询bZBoardFlags.bits.bBus_Reset标志,并且当标志为1时对设备重新设置复位的话那就没有问题。
不过我还是建议你如果不考虑功耗的话,把挂起和唤醒功能关掉。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-10-08 19:19
我的代码:
if(int_low & int_busreset)
{  

pRegAddress = (unsigned short *)rega_interrupt_low;
*pRegAddress = int_busreset;
if(int_low & int_hs_stat)
{
Isp1581Flag.ConnectSpeed = HighSpeed;
ISP1581_Initiate();
int_low &= ~int_hs_stat;
pRegAddress = (unsigned short *)rega_interrupt_low;
*pRegAddress = int_hs_stat;
}
else
{
Isp1581Flag.ConnectSpeed = FullSpeed;
ISP1581_Initiate();
}
}

if(int_low & int_hs_stat)
{
pRegAddress = (unsigned short *)rega_interrupt_low;
*pRegAddress = int_hs_stat;
if(Isp1581Flag.ConnectSpeed == FullSpeed)
{
Isp1581Flag.ConnectSpeed = HighSpeed;
ISP1581_Initiate();
}
}
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2003-10-09 07:59
好帖。
 :D

欢迎大虾们回来!
游客

返回顶部