[求助]请教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()改成毫秒级别,而不是微妙级别.等个几十毫秒先看看情况再说.
[解决办法]
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资源.