阅读:2165回复:12
SL811HS枚举设备的超时问题?
各位大侠,我使用SL811HS做主机,在运行编写的驱动程序时,老是出现总线超时的错误。具体是这样的:我对设备枚举时先由主机发送setup包,包的内容是80,06,0100,0000,0012,发送之后EP0Status(0x03)的值就变为0x04,即发生了time-out,我这时读了一下EP0Counter(0x04)的值是0x08,也就是说要发送的8个字节一个都没有发出!是不是我的硬件有问题呢?但对SL811HS的读写都是正常的呀。十分焦急,希望各位大侠赐教,多谢了!
|
|
沙发#
发布于:2004-10-27 15:18
你在SL811外部用的晶振是有源的还是无源的?改成有源的试试,我以前碰到过
|
|
|
板凳#
发布于:2004-10-27 16:33
我开始用的是12M的,后来改用了48M的有源晶振,还是一样的结果。发送时我对EPOControl(0x00)写的命令字是0x03,有没有写错呢?还有就是我的48M的晶振是正弦波,波峰是2.2V,波谷是1.4V,跟我以前用过的晶振相比似乎振幅太小了,是不是这里有问题呢?请大侠多多指教,多谢!
|
|
地板#
发布于:2004-10-27 21:37
请问hongshanger,能不能测一下你的48M的晶振的波峰、波谷值给我做个参照呀,十分感谢了!
|
|
地下室#
发布于:2004-10-28 11:03
EPOControL状态字应该写27H的吧,你试试看,还有,SETUP包的最后一个应该是1200的吧,不过这个根据你的程序看了,你先试试好了。
|
|
|
5楼#
发布于:2004-10-28 13:24
EP0Status的D2位(Direction)置1时不是数据从设备到主机吗?我现在是发送SETUP应该是从主机到设备吧,怎么会写成0x27呢?我先试试吧,多谢了!
|
|
6楼#
发布于:2004-10-28 14:07
不行呀,改成0x27之后一样超时,真是郁闷死了!
|
|
7楼#
发布于:2004-10-28 14:59
//------------------------------------------------
// Arming of USB data transfer for the first pkt //------------------------------------------------ // PID + EP address SL811Write(EP0Status, ((endpoint&0x0F)|pid)); // USB address SL811Write(EP0Counter, usbaddr); // buffer address, start with "data0" SL811Write(EP0Address, data0); // data transfer length SL811Write(EP0XferLen, xferLen); // clear interrupt status SL811Write(IntStatus, INT_CLEAR); // Enable ARM and USB transfer start here SL811Write(EP0Control, cmd); //cmd = 0x27 |
|
8楼#
发布于:2004-10-28 15:50
为什么大家都说CMD要写成0x27呢?难道芯片文档上说EP0Control的D2位置‘1’代表transmit to host是错误的?
|
|
9楼#
发布于:2004-10-28 16:00
终于读到设备描述符了,命令果然应该写为0x27!!感谢hongshanger
和frank666的指点。开始时我的U盘不行,用0x27也总是超时,后来换了个才好的。 |
|
10楼#
发布于:2005-08-03 12:52
那为什么用0x27呢?我也不懂啊,
希望以后大家将解决后的方法也说出来或者对一个问题的正确理解!这样别人遇到此问题了,也知道什么原因了!:) |
|
11楼#
发布于:2007-01-22 17:16
在linux的sl811-hcd.c文件中的setup:
static void setup_packet( struct sl811 *sl811, struct sl811h_ep *ep, struct urb *urb, u8 bank, u8 control ) { u8 addr; u8 len; void __iomem *data_reg; addr = SL811HS_PACKET_BUF(bank == 0); len = sizeof(struct usb_ctrlrequest); data_reg = sl811->data_reg; sl811_write_buf(sl811, addr, urb->setup_packet, len); /* autoincrementing */ sl811_write(sl811, bank + SL11H_BUFADDRREG, addr); writeb(len, data_reg); writeb(SL_SETUP /* | ep->epnum */, data_reg); writeb(usb_pipedevice(urb->pipe), data_reg); /* always OUT/data0 */ ; sl811_write(sl811, bank + SL11H_HOSTCTLREG, control | SL11H_HCTLMASK_OUT); ep->length = 0; PACKET("SETUP qh%p\n", ep); } 其中SL11H_HCTLMASK_OUT = 0x04; 猜测是只的数据阶段的传输方向. |
|
12楼#
发布于:2008-02-27 08:31
setup包的最后部分一定要0012吗?LINUX里面应该是0x40啊!这个很重要吗?
我也碰到了TIMEOUT的问题,是在SETUP后紧接着的IN PACKET后出现的。请大侠给小弟共享一下经验吧!!! |
|