阅读:1759回复:15
我想让设备知道我需要高速数据传输,首先应该是发中断让总线复位,然后我怎样才能影响设备的状态位啊?
其实就是怎样让设备知道我现在需要置上高速标志了
|
|
|
沙发#
发布于:2003-09-25 22:02
你可以GET PIPE看看!
如果最大的可传输包为0x40,表示现在是USB1.0状态,如果最大的可传输包是0x200,表示现在工作在2.0状态! |
|
板凳#
发布于:2003-09-28 13:42
这个我知道啊,系统是默认1。1的,我要是切换到高速的话,要对芯片复位并且要使中断寄存器的状态在高速状态(HS_STATES),我在中断中才会检测到这个状态啊!也就是这个状态位我该怎样影响!
|
|
|
地板#
发布于:2003-09-28 15:42
在程序中让它变呀。 它变了不就去中断了 么??
|
|
地下室#
发布于:2003-09-30 01:01
我的系统默认都是USB2。0,怎么你的系统默认是1。0呢?
看看你的机器是否支持USB2.0??? :D |
|
5楼#
发布于:2003-09-30 17:43
你们用什么片子?不能根据usb port的不同,自动切换配置么?
|
|
|
6楼#
发布于:2003-10-02 11:03
这个标志位你是不能影响的!
当设备复位时,设备会发送一个高速的脉冲检测主机控制器是否能工作于高速模式,如果能则设备方会收到高速检测中断,在这个中断你你需要设置一个全局变量来做标志位,例如,是1标志高速模式,然后固件里根据这个标志的情况重新配置端点。 也就是说这个高速检测中断你只能收到并处理,不能手动让它产生,我是这样理解的。 |
|
7楼#
发布于:2003-10-04 08:22
这个标志位你是不能影响的! 哦! 原来不能影响呀。 那其他的标志位呢? 端点1,端点0等等。是不是也不能影响呀。 还有如果给端点1发完第一次数据,想发第二次,主机怎么知道什么时候发? |
|
8楼#
发布于:2003-10-08 08:08
jinghuiren兄,如果我的系统在初始复位的时候能检测的可以在高速运行,但是我现在没有数据要传输的,系统会进入全速模式(应该是默认的),当我需要传输数据的时候,系统应该是复位并且切换到高速模式,也就是你说的给一个全局变量赋值,我现在就是不明白该怎样让系统复位并且给让我DEVICE知道现在需要切换到高速了?
|
|
|
9楼#
发布于:2003-10-08 10:51
[quote哦! 原来不能影响呀。 那其他的标志位呢? 端点1,端点0等等。是不是也不能影响呀。 还有如果给端点1发完第一次数据,想发第二次,主机怎么知道什么时候发?
[/quote] 设备并不能通知主机断点有数据,主机是通过查询获知端点是否有数据的,当你主机发送deviceiocontrol或者readfile读取数据时,驱动便不断的发送in token到设备查询设备是否有数据,如果有,则在下一个in token把数据读走。 你设备边只要发现端点为空就把数据写进去,等待主机取走即可。 |
|
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需要重新复位,所以我建议如果你的设备不在乎功耗,那么你不要使能设备的挂起和唤醒功能! 以上是我的理解,作为你的参考 |
|
11楼#
发布于:2003-10-08 11:35
我觉得jinghuiren是对的
一个设备的属性应该是在它枚举时已经确定了它的性质,我觉得它的配置是不能动态改变的,要改变的化,我觉得只有重新枚举系统才能认可它。 |
|
|
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语句仅仅检测了一个高速状态标志。 |
|
|
13楼#
发布于:2003-10-08 19:13
如果你别的地方有查询bZBoardFlags.bits.bBus_Reset标志,并且当标志为1时对设备重新设置复位的话那就没有问题。
不过我还是建议你如果不考虑功耗的话,把挂起和唤醒功能关掉。 |
|
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(); } } |
|
15楼#
发布于:2003-10-09 07:59
好帖。
:D 欢迎大虾们回来! |
|