阅读:2133回复:15
51读写U盘中关于SL811HST初始化的问题
我的毕业设计是做51读写U盘,接口芯片采用sl811hst,但初始化后,
系统插入U盘后,能检测到中断,但读取到的中断状态寄存器的值为 0xE0,指示usb设备没有准备好,不知什么原因! U盘拔出时,也能检测到中断这时读取到的中断状态寄存器的值为0x60,好像是正确的。 下面是的SL811HST的初始化代码: HostWrite(IntEna, 0x20); HostWrite(cSOFcnt, 0xAE); HostWrite(CtrlReg, 0x08); HostWrite(CtrlReg, 0x00); HostWrite(cSOFcnt, 0xAE); HostWrite(CtrlReg, 0x08); DelayMs(10); HostWrite(CtrlReg,0x00); DelayMs(1); HostWrite(IntStatus, 0xFF); 不知有什么问题。 望高手指教!不胜感谢! |
|
沙发#
发布于:2004-07-27 18:39
我也在考虑这个问题
高手请指点。 |
|
|
板凳#
发布于:2004-07-28 13:42
你读到的值完全正确,状态寄存器的值不清除是不会清零的所以detect/resume那一位始终为一。你可以清除后再读就变成0x80了,这就正常了
|
|
地板#
发布于:2004-07-28 14:56
你读到的值完全正确,状态寄存器的值不清除是不会清零的所以detect/resume那一位始终为一。你可以清除后再读就变成0x80了,这就正常了 说明书不是说:中断状态寄存器,通过将特定的位置1就可以清除相应的中断,你所说的不是有些矛盾吗????? HostWrite(IntStatus, 0xFF);//不是将状态寄存器 清除了吗? PS:状态寄存器 是不是当设备插入或者拔除时,都将bit5置0? 还是插入是0,拔除时1呢? [编辑 - 7/28/04 by snoopy_dl] |
|
|
地下室#
发布于:2004-07-28 16:10
是啊,刚开始时没有设备,读到0x60,插入设备后,那两位置1,不久变成0xe0了吗,你检测到中断后,就清除中断寄存器,如果为0x80就肯定对了
|
|
5楼#
发布于:2004-07-28 16:16
上面些错了,没有设备时清除中断寄存器后,读到应该为0x40,插入设备后,这一位仍然为1,再清中断就能清掉这一位
|
|
6楼#
发布于:2004-07-29 07:28
谢谢stonehillzou, 我试一下。
|
|
7楼#
发布于:2004-07-29 07:45
楼上兄弟, 麻烦我再问一下清状态寄存器的 detect/resume们必须在
USB把D+、 D-都置低的后面(也就是的USB复位), 如果在它的前面 就会反复的触发中断, 不断得发出E0, 80。 这是为什么? |
|
8楼#
发布于:2004-07-29 09:25
那是当然,只有将D+ D-置低后才能检测到设备拔插,因为全速设备是在D+上有沿出发就表明设备有拔插,而低速设备在D-上有沿出发就表明设备有拔插,所以必须在前面将其置低
|
|
9楼#
发布于:2004-07-29 11:31
HostWrite(IntStatus, 0xFF);//不是将状态寄存器清除了吗?
问一个初级的问题,怎么将D+,D-置0????? HostWrite(CtrlReg, 0x08);//是不是这一局??? 谢谢 [编辑 - 7/29/04 by snoopy_dl] |
|
|
10楼#
发布于:2004-07-29 11:39
下面是的SL811HST的初始化代码:
HostWrite(IntEna, 0x20); HostWrite(cSOFcnt, 0xAE); HostWrite(CtrlReg, 0x08); HostWrite(CtrlReg, 0x00); HostWrite(cSOFcnt, 0xAE); ************************************************************ HostWrite(CtrlReg, 0x08); //usb复位 DelayMs(10); HostWrite(CtrlReg,0x00); // DelayMs(1); HostWrite(IntStatus, 0xFF);//状态寄存器清楚 ************************************************************ 按照书上的解释,只要这段程序是不是就是你的意思? |
|
|
11楼#
发布于:2004-07-29 12:22
HostWrite(cSOFcnt, 0xAE);
该语句没用,是在设置产生sof时的计数值, 写HostWrite(CtrlReg, 0x08); //usb总线复位 DelayMs(10); HostWrite(CtrlReg,0x00); //usb总线恢复正常 在插入设备之后还需要这几个语句,让设备进入default态,才能对811进行一些配置 下面是的SL811HST的初始化代码: |
|
12楼#
发布于:2004-07-29 20:14
谢谢你, stonehillzou!
|
|
13楼#
发布于:2004-07-29 23:25
U盘是高速设备,如果是鼠标等低速设备呢?
怎么初始化比较好? :) |
|
14楼#
发布于:2004-07-30 10:21
HostWrite(cSOFcnt, 0xAE);[/quote] 按App Notes,好像硬件复位之后至少应该向cSOFcnt写bit 7吧? 把SL811HS设成主方式才是。 它写0xAE是设成主方式后并设了1-ms SOF时间。 (当然还得往0EH写入E0H来配合才能设位1-ms的SOF) |
|
15楼#
发布于:2009-09-09 19:55
小弟也正做了,还望高手指点
|
|
|