首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

[]请问C8051F340 USB 工作在 低速 时的有关问题(多谢)

2012-03-13 
[求助]请教C8051F340 USB 工作在 低速 时的问题(谢谢)?我的C8051F340USB 配置为低速状态调试中发现 连接US

[求助]请教C8051F340 USB 工作在 低速 时的问题(谢谢)?
我的C8051F340 USB 配置为低速状态

调试中发现 连接USB后 第一次获取 设备描述符 可以过去 ,之后 SetAddress也可以过去 ,之后再次获取设备描述符 就过不去了,又会恢复初始状态,几次之后,WindowsXP 就报 “未知设备”

低速 模式 EP0 只能每次只能传送 8个字节 ,那么 当传送 像 设备描述符(18个字节) 时 ,应该 如何 传送 ?

 

我是这么写的 对吗?

  Write_FIFO(FIFO_EP0,8,(uchr *)&DeviceDesc);
  Write_USFR(E0CSR,E0_INPRDY1);

  {
  uchr tmpRe;
  do
  {
  delay_5uS();
  Read_USFR(E0CSR,tmpRe);
  }while((tmpRe&E0_INPRDY1)==E0_INPRDY1);
  }
  Write_FIFO(FIFO_EP0,8,(uchr *)(((ulng)(&DeviceDesc))+8) );
  Write_USFR(E0CSR,E0_INPRDY1);
  {
  uchr tmpRe;
  do
  {
  delay_5uS();
  Read_USFR(E0CSR,tmpRe);
  }while((tmpRe&E0_INPRDY1)==E0_INPRDY1);
  }
  Write_FIFO(FIFO_EP0,2,(uchr *)(((ulng)(&DeviceDesc))+16) );
  Write_USFR(E0CSR,E0_INPRDY1|E0_DATAEND1);

 

麻烦各位高人指教,万分感谢!


[解决办法]
我对你的运行环境不了解,不过站在协议的角度看,你等待的时间太短了.
要知道,usb2.0的高速模式下,使用更高速的同步传输,传输率480M Hz,传输一帧24K需要125微秒.而全速模式,一帧是1毫秒.数据传输率12M Hz.低速更慢, 1.5M Hz.按比例来说,要接受一个描述符(18字节至少),你必须等待几十微秒.所以我建议你先试试看把delay_5uS()改成毫秒级别,而不是微妙级别.等个几十毫秒先看看情况再说.

[解决办法]

C/C++ code
 do  { Read_USFR(E0CSR,tmpRe);  delay_5uS();   }while((tmpRe&E0_INPRDY1)==E0_INPRDY1);  }
[解决办法]
协议里限制的是frame 里的wMaxPacketSize
其他的长度限制都比较宽松,主要是Buffer的限制,一般不会对编程产生影响!

如果以前从来没有写过USB协议,那还是先看下范例吧.
对如何编写USB协议,USB的流程 有好处.
C8051F的USB范例,虽然写得不怎么样(感觉有 硬件工程师编写的气息).
但是对理解USB协议还是有很好处的.

这只能传输 不长于wMaxPacketSize长度的数据.
典型是由于没有按照协议规范些.
记得是分段处理,没有处理好.
这芯片,我玩过.

还有个建议.
USB收发处理,最好是中断处理.
USB数据收发还是比较频繁的.查询的方式非常耗CPU资源.

热点排行