阅读:2844回复:22
ISP1581问题请教,CPU只产生一次复位中断
ISP1581工作在通用CPU模式,
8位地址,16位数据总线 寄存器读写正常, 设置软连接后, 产生一次复位中断, PC机上出现USB符号, 然后就没反应了, 用bushound观看, 应该是PC机发GET STATUS, 设备没有响应? 不知道问题出在哪? 请各位大侠指点 |
|
沙发#
发布于:2004-10-25 21:43
你好,我现在想用此芯片做毕业设计,接触硬件时间不长,越看越看越糊涂,能否看看你的电路图和固件啊,万分感谢!!!
E-Mail:general912@163.com |
|
板凳#
发布于:2005-03-31 01:00
hongjun
你好,请问你现在解决这个问题了吗?我遇到和你一样的现象,请多指教,我的邮箱是:dyingcells@yahoo.com.cn,qq:49162993,谢谢 |
|
地板#
发布于:2005-03-31 09:54
我用的是分离总线模式.你把你的BUSHOUND数据发上来看看.
|
|
|
地下室#
发布于:2005-04-13 09:33
楼主,我现在也在用isp1581作开发,遇到的情况和你的几乎一样,请问你是怎么解决的,多多交流,sdshmily@sina.com
|
|
5楼#
发布于:2005-04-13 15:11
GET STATUS好象不是发给设备的命令,而是发给HUB的标准命令.
|
|
|
6楼#
发布于:2005-04-14 09:36
我也有类似问题,下面的是我下位机控制器读取的中断控制器低16位的读取数据,按照高8位 低8位方式。可以看到接受到了总线复位,挂起,高速等,然后就不再接收了。上位机能看到设备,但是为未知设备,显然没有枚举成功。搂主能联系一下吗,共同探讨。我的电话是010-82895766-2046。邮件是ysdx@sohu.com.
00 08 00 01 00 20 00 18 00 08 00 01 00 20 00 18 00 08 00 01 00 20 00 18 00 08 00 10 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 谁能够分析一下吗? 还有大家是否串接了18欧姆电阻在USB线上? |
|
7楼#
发布于:2005-04-14 10:29
把挂起中断关了
那些没用的中断都关掉 比如sof等 只留下reset,hs,setup,ep0tx,ep1tx,ep0rx,ep1rx |
|
8楼#
发布于:2005-04-14 11:30
象楼上所说的把那些都关掉.
00 01:收到BUS RESET中断.当你的设备接入HOST,并将SOFTCONNECT置 位后,会收到这个中断.你应当初始化1581的内部寄存器,但注 意,有些积存器位不受BUS RESET的影响,不要动他,特别是 SOFTCONNECT位. 00 20:收到高速中断.表示HOST识别你的设备为高速.你应当设置你的 端点为高速. 从现象上分析,你可能是在收到BUS RESET中断后,对SOFTCONNECT置位 了,造成HOST认为你拔除设备,又重新插入.这样HOST就反复对你发送 BUS RESET中断. [编辑 - 4/14/05 by metalwing] |
|
|
9楼#
发布于:2005-04-14 12:13
还有一种可能,你的复位电路有问题,你可以查一下看reset引脚是否一直为低
|
|
10楼#
发布于:2005-04-14 17:09
下面是我的初始化程序,我已经能够收到SETUP命令,你可以参考一下。
void ISP1581_ResetDevice(void) { U_Mode &=0xfe; do { U_Mode |=0x10; U_Mode &=0xef; delayMs(10); if(U_ChipIDL==0x8151) break; }while(1); USB_HS_FS_State=FULL; USB_Init(); U_Mode |=0x01; } void USB_Init(void) { U_Mode |=0x8c; U_IntConf=0x54; U_IntEnH=0x00; U_IntEnL=0xfd39; if(USB_HS_FS_State==FULL) { U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptPSize = 0x40;// 64 U_EptIndex = 0x03;// ¶Ëµã1 IN U_EptPSize = 0x40;// 64 U_EptIndex = 0x04;// ¶Ëµã2 OUT U_EptPSize = 0x40;// 1024 U_EptIndex = 0x05;// ¶Ëµã2 IN U_EptPSize = 0x40;// 1024 //U_EptIndex = 0x06;// ¶Ëµã3 OUT //U_EptPSize = 0x40;// 64 //U_EptIndex = 0x07;// ¶Ëµã3 IN //U_EptPSize = 0x40;// 64 U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptType = 0x0a; U_EptIndex = 0x03;// ¶Ëµã1 OUT U_EptType = 0x0e; U_EptIndex = 0x04;// ¶Ëµã1 IN U_EptType = 0x0a; U_EptIndex = 0x05;// ¶Ëµã2 OUT U_EptType = 0x0e; /* U_EptIndex = 0x06;// ¶Ëµã2 IN U_EptType = 0x0015; U_EptIndex = 0x07;// ¶Ëµã2 IN U_EptType = 0x0015; */ U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptType |= 0x0800; U_EptIndex = 0x03;// ¶Ëµã1 OUT U_EptType |= 0x0800; U_EptIndex = 0x04;// ¶Ëµã1 IN U_EptType |= 0x0800; U_EptIndex = 0x05;// ¶Ëµã2 OUT U_EptType |= 0x0800; /* U_EptIndex = 0x06;// ¶Ëµã2 IN U_EptType |= 0x0800; U_EptIndex = 0x07;// ¶Ëµã2 IN U_EptType |= 0x0800; */ } else { U_TestMode = 0x00; U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptPSize = 0x40;// 64 U_EptIndex = 0x03;// ¶Ëµã1 IN U_EptPSize = 0x40;// 64 U_EptIndex = 0x04;// ¶Ëµã2 OUT U_EptPSize = 0x200;// 1024 U_EptIndex = 0x05;// ¶Ëµã2 IN U_EptPSize = 0x200;// 1024 /* U_EptIndex = 0x06;// ¶Ëµã3 OUT U_EptPSize = 0x40;// 64 U_EptIndex = 0x07;// ¶Ëµã3 IN U_EptPSize = 0x40;// 64 */ U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptType = 0x0a; U_EptIndex = 0x03;// ¶Ëµã1 OUT U_EptType = 0x0e; U_EptIndex = 0x04;// ¶Ëµã1 IN U_EptType = 0x0a; U_EptIndex = 0x05;// ¶Ëµã2 OUT U_EptType = 0x0e; /* U_EptIndex = 0x06;// ¶Ëµã2 IN U_EptType = 0x0015; U_EptIndex = 0x07;// ¶Ëµã2 IN U_EptType = 0x0015; */ U_EptIndex = 0x02;// ¶Ëµã1 OUT U_EptType |= 0x0800; U_EptIndex = 0x03;// ¶Ëµã1 OUT U_EptType |= 0x0800; U_EptIndex = 0x04;// ¶Ëµã1 IN U_EptType |= 0x0800; U_EptIndex = 0x05;// ¶Ëµã2 OUT U_EptType |= 0x0800; /* U_EptIndex = 0x06;// ¶Ëµã2 IN U_EptType |= 0x0800; U_EptIndex = 0x07;// ¶Ëµã2 IN U_EptType |= 0x0800; */ } U_Adrss = 0x80;//¼¤»î USB µØÖ?0 } |
|
11楼#
发布于:2005-04-14 17:57
tchtc2008,我原来和你情况差不多,后来在softconnect后加了个延时,现在我的情况是收到setup中断,但是从端点读出的数据好像不对:0x0680,0x0000,0x0000,0x0000,请各位dx指点一下,可能是因为什么。
|
|
12楼#
发布于:2005-04-15 09:20
你拿什么看的?用仿真器吗?
不要用仿真器直接看1581寄存器地址里的值 要把地址里的值读到一个数组里,然后看那个数组的值。 |
|
13楼#
发布于:2005-04-15 10:01
to jinghuiren:我是把ep0 setup缓冲区里面的数据读到一个数组里面的,是不是和时序有关系啊,但是我已经把1581的ready信号和dsp的ready信号连接了,应该不会出现读写时序的问题。还有我用的是查询终端寄存器的方式来得到setup中断标志的,这应该没有关系的吧,受到此标志后除设置端点索引寄存器外,还要不要设置其他寄存器?这问题又拖了几天了。!还有就是有什么方法能够验证是主机传送的数据不对还是我的读操作有问题!
[编辑 - 4/15/05 by lybshmily] |
|
14楼#
发布于:2005-04-15 10:32
应该没问题.
在收到中断后,设置索引寄存器为EP0 OUT,然后读取20H的数据,写入 数组,再读再写.直到写完. MOV R1, #0020H MOV R0, #70H ;数组头地址 MOVX A, @R1 MOV @R0, A INC R0 MOVX A, @R1 MOV @R0, A INC R0 ..... TO TCHTC2008: 从你的程序里我看不到你在设置SOFTCONNECT(U_Mode |=0x01)后干了什么. |
|
|
15楼#
发布于:2005-04-15 12:18
查询是没有问题的,我用的也是查询,读写Setup包数据如下:
*(REG_EPINDEX) = 0x20; for(i=0; i<4; i++)//读取8字节的Setup包 { SETUPDAT = *(REG_DPORT);//读数据 } REG_DPORT是数据端口寄存器 如果你检查程序没问题的话,那么我建议你查一下硬件,把D+和D-线上的电阻去掉,我调了很多块板子(不是同样的),只有一块有问题,有问题的那一块是因为D+和D-线上加了防静电电路,破坏了信号的完整性导致的。 也许理论上你在那上面串联一个小电阻是没问题,但实际怎么样就不好说了。 |
|
16楼#
发布于:2005-04-16 00:45
to jinghuiren:
在我接受到setup中断进入服务程序后设了一个断点,在ccs下0x20地址,其数据是0x0680,紧接着的地址后面的数据分别是0100, 0000,0040;当我将端点设在读取第一个数据之后,0x20的数据是0x0000,0x21的数据是0x0040;按说端点缓冲中的数据是看不到的,这中现象能说明什么问题呢? 今天又被老板骂了,郁闷! |
|
17楼#
发布于:2005-04-16 09:57
to lybshmily:
首先,你读数据时就只用读20端口(字是20\\21端口),反复的读,直到你 将数据读完.也就是说,当你读完一个字后,在20\\21端口是下一个字. |
|
|
18楼#
发布于:2005-04-16 18:01
多谢jinghuiren,metalwing两位的建议。
但现在我这种现象很奇怪,只是读对了第一个字,后面的就三个字读出来全是0; 现在我加了一段测试程序, *reqpt = (Uint16 *)0x400120;//端点索引寄存器 for(i=0; i<4; i++) { reqdat = *reqpt; } 得到的数据分别是0x0680, 0x0000,0x0000,0x0000 而如果将0x400120改为0x400121,按理说应该和前面的效果是一样的,但我读到的数据却是0x0100,0x0040,0x0000,0x0000。两位又没有遇到这种情况? to jinghuiren我的d+,d-上没有串电阻或加防静电电路,只是这两根线是分布在板子的上下层(我的板子是四层板),而不是在一层中并行的,这对信号有影响吗。当时你的信号完整性受到影响是出现什么现象? [编辑 - 4/16/05 by lybshmily] |
|
19楼#
发布于:2005-04-18 14:47
基本没有影响
你的这个问题我也遇到过 不过当初是因为直接看了寄存器的地址导致的 因为1581得20寄存器是个fifo,读完一个字节后地址自动后移 所以用仿真器看地址的时候仿真器会把数据提前读出来,结果就会导致数据跟你的一样 你用的是什么dsp? 每读一次加上一些延时试试 |
|
上一页
下一页