qing_qing
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2047回复:15

51读写U盘中关于SL811HST初始化的问题

楼主#
更多 发布于:2004-07-27 16:36
我的毕业设计是做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);
不知有什么问题。
望高手指教!不胜感谢!
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-27 18:39
我也在考虑这个问题
高手请指点。
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
stonehillzou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-16
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-28 13:42
你读到的值完全正确,状态寄存器的值不清除是不会清零的所以detect/resume那一位始终为一。你可以清除后再读就变成0x80了,这就正常了
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-28 14:56
你读到的值完全正确,状态寄存器的值不清除是不会清零的所以detect/resume那一位始终为一。你可以清除后再读就变成0x80了,这就正常了


说明书不是说:中断状态寄存器,通过将特定的位置1就可以清除相应的中断,你所说的不是有些矛盾吗?????

HostWrite(IntStatus, 0xFF);//不是将状态寄存器 清除了吗?
PS:状态寄存器 是不是当设备插入或者拔除时,都将bit5置0?
    还是插入是0,拔除时1呢?
    

[编辑 -  7/28/04 by  snoopy_dl]
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
stonehillzou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-16
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-28 16:10
是啊,刚开始时没有设备,读到0x60,插入设备后,那两位置1,不久变成0xe0了吗,你检测到中断后,就清除中断寄存器,如果为0x80就肯定对了
stonehillzou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-16
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-28 16:16
上面些错了,没有设备时清除中断寄存器后,读到应该为0x40,插入设备后,这一位仍然为1,再清中断就能清掉这一位
qing_qing
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-29 07:28
谢谢stonehillzou, 我试一下。
qing_qing
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-29 07:45
楼上兄弟, 麻烦我再问一下清状态寄存器的 detect/resume们必须在
USB把D+、 D-都置低的后面(也就是的USB复位), 如果在它的前面
就会反复的触发中断, 不断得发出E0, 80。 这是为什么?
stonehillzou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-16
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-29 09:25
那是当然,只有将D+ D-置低后才能检测到设备拔插,因为全速设备是在D+上有沿出发就表明设备有拔插,而低速设备在D-上有沿出发就表明设备有拔插,所以必须在前面将其置低
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-29 11:31
HostWrite(IntStatus, 0xFF);//不是将状态寄存器清除了吗?
问一个初级的问题,怎么将D+,D-置0?????
HostWrite(CtrlReg, 0x08);//是不是这一局???
谢谢

[编辑 -  7/29/04 by  snoopy_dl]
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);//状态寄存器清楚
************************************************************
按照书上的解释,只要这段程序是不是就是你的意思?
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
stonehillzou
驱动牛犊
驱动牛犊
  • 注册日期2004-07-16
  • 最后登录2004-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-29 12:22
HostWrite(cSOFcnt, 0xAE);
该语句没用,是在设置产生sof时的计数值,
写HostWrite(CtrlReg, 0x08); //usb总线复位
DelayMs(10);
HostWrite(CtrlReg,0x00);  //usb总线恢复正常

在插入设备之后还需要这几个语句,让设备进入default态,才能对811进行一些配置

下面是的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);//状态寄存器清楚
************************************************************
按照书上的解释,只要这段程序是不是就是你的意思?
 
qing_qing
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-29 20:14
谢谢你, stonehillzou!
OpenCore
驱动牛犊
驱动牛犊
  • 注册日期2003-03-31
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-29 23:25
U盘是高速设备,如果是鼠标等低速设备呢?
怎么初始化比较好?

:)
OpenCore
驱动牛犊
驱动牛犊
  • 注册日期2003-03-31
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-30 10:21
HostWrite(cSOFcnt, 0xAE);
该语句没用,是在设置产生sof时的计数值,
写HostWrite(CtrlReg, 0x08); //usb总线复位
DelayMs(10);
HostWrite(CtrlReg,0x00);  //usb总线恢复正常

在插入设备之后还需要这几个语句,让设备进入default态,才能对811进行一些配置

[quote]下面是的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);//状态寄存器清楚
************************************************************
按照书上的解释,只要这段程序是不是就是你的意思?
 
[/quote]

按App Notes,好像硬件复位之后至少应该向cSOFcnt写bit 7吧?
把SL811HS设成主方式才是。
它写0xAE是设成主方式后并设了1-ms SOF时间。
(当然还得往0EH写入E0H来配合才能设位1-ms的SOF)
guo136
驱动牛犊
驱动牛犊
  • 注册日期2009-09-09
  • 最后登录2009-09-11
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望141点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2009-09-09 19:55
小弟也正做了,还望高手指点
电子爱好者
游客

返回顶部