阅读:3799回复:54
D12紧急求救
我的D12调试遇到如下问题:
1. 上电后INT0始终为低,导致程序总是进入中断服务; 2. 中断进入后进行跟踪,发现总是Control In中断; 3. 由于始终没有Control Out中断,导致TRANSMIT无法置位; 4. 由于不是Transmit状态,Control In中断一进入,经判断后马上 就得Return。 这是什么原因?大侠们请指教! |
|
沙发#
发布于:2004-03-07 23:59
//端点0OUT中断
void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); //清中断标志 if (ep_last & D12_SETUPPACKET) { //接收到SETUP包 ControlData.wLength = 0; ControlData.wCount = 0; if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { //SETUP包出错,返回 D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); bEPPflags.bits.control_state = USB_IDLE; return; } ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); //对控制端点的输入/输出进行应答 D12_AcknowledgeEndpoint(0); D12_AcknowledgeEndpoint(1); ControlData.wLength = ControlData.DeviceRequest.wLength; ControlData.wCount = 0; if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { //从主机传输数据 bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */ } else { if (ControlData.DeviceRequest.wLength == 0) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; /* set command */ } else { if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { //接收数据长度为0 bEPPflags.bits.control_state = USB_IDLE; D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); } else { bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态 } } // set command with data } // else set command } // if setup packet else if (bEPPflags.bits.control_state == USB_RECEIVE) { //接收数据 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE, ControlData.dataBuffer + ControlData.wCount); ControlData.wCount += i; if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { //数据接收完毕 bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; } } else { bEPPflags.bits.control_state = USB_IDLE;//进入等待状态 } } //端点0IN处理 void ep0_txdone(void) { short i = ControlData.wLength - ControlData.wCount; D12_ReadLastTransactionStatus(1); //清中断标志位 if (bEPPflags.bits.control_state != USB_TRANSMIT) return;//非发送状态,返回 if( i >= EP0_PACKET_SIZE) { //剩下数据大于16字节,发送16字节 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount); ControlData.wCount += EP0_PACKET_SIZE; bEPPflags.bits.control_state = USB_TRANSMIT; } else if( i != 0) { //发送剩下数据 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount); ControlData.wCount += i; bEPPflags.bits.control_state = USB_IDLE; } else if (i == 0){ D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节 bEPPflags.bits.control_state = USB_IDLE; } } |
|
|
板凳#
发布于:2004-03-08 00:34
多谢zmwk大侠!
我看了一下,我所用的代码与您贴出来的一模一样。问题是: 程序总能到这里: //端点0IN处理 void ep0_txdone(void) 却总也到不了这里: //端点0OUT中断 void ep0_rxdone(void) 这是什么原因?另外,请教一下,是否只有一个中断寄存器,两个字节? |
|
地板#
发布于:2004-03-08 08:42
void fn_usb_isr()
{ unsigned int i_st; bEPPflags.bits.in_isr = 1; i_st = D12_ReadInterruptRegister();//读取中断寄存器 if(i_st != 0) { if(i_st & D12_INT_BUSRESET) { bus_reset();//USB总线服务 bEPPflags.bits.bus_reset = 1; } if(i_st & D12_INT_EOT) dma_eot();//DMA传输结束 if(i_st & D12_INT_SUSPENDCHANGE) bEPPflags.bits.suspend = 1;//挂起改变 if(i_st & D12_INT_ENDP0IN) ep0_txdone();//端点0IN中断 if(i_st & D12_INT_ENDP0OUT) ep0_rxdone();//端点0OUT中断 if(i_st & D12_INT_ENDP1IN) ep1_txdone();//端点1IN中断 if(i_st & D12_INT_ENDP1OUT) ep1_rxdone();//端点1OUT中断 if(i_st & D12_INT_ENDP2IN) main_txdone();//端点2IN中断 if(i_st & D12_INT_ENDP2OUT) main_rxdone();//端点2OUT中断 } bEPPflags.bits.in_isr = 0; } 你看看是不是你把 if(i_st & D12_INT_ENDP0IN) ep0_txdone();//端点0IN中断 if(i_st & D12_INT_ENDP0OUT) ep0_rxdone();//端点0OUT中断 这两个响应弄拧了? |
|
|
地下室#
发布于:2004-03-08 09:52
我觉得你的固件程序应该没有问题,估计是你的硬件的缘故,你可以看看单片机和D12的复位电路(D12的复位电路最好用一个10K电阻和4.7UF电容构成,不要用电阻分压构成)是否正确,D12的输出时钟是否正确,还有D12的中断数据位是否正确等等
|
|
5楼#
发布于:2004-04-08 09:51
请问中断数据位是哪个口阿
D12的复位电路到底是怎样的阿 我接一个1u电容接地,10k电阻接vcc 这样可以吗 直接接地行吗 |
|
6楼#
发布于:2004-04-08 11:26
dysjd ,我两个月碰到同样的问题,当时苦恼不已。
首先要保证硬件没有问题,检验的方法如下: 1.D12的复位,这一点很重要!它是低电瓶复位,复位时间理论上是至少3毫秒,但我建议用10K+10UF的电阻+电容,这样t近似等于100ms,反正时间长一点无所谓,我的就是用这个值。 2.检验D12是否正常的方法:上电后,看CLK脚是否有你程序所设定的频率输出,默认是4M,但是PHILPS的摸板程序中是将其设定为12M的,这个相信你自己会改,如果正确,在可表明D12工作正常。 3.或者如果你能看到GOODLINK led灯闪烁的话,表明D12也应该是好的,因为即使你的枚举不成功,它也会闪三次。 然后再查软件: 如果INT脚还一直为低,那表明程序一定是没有正确读D12的中断寄存器,你就老老实实仔细检查程序吧。 这是我做D12的心得,当时也痛苦了一个多月,希望以上的一点建议能助你早日成功! [编辑 - 4/8/04 by lg970331] |
|
7楼#
发布于:2004-04-08 11:47
非常感谢您。
可是我用的是周立功的pdiusbd12 smart开发板的原程序,是没问题的。电路图我也是按照他的原理图作的。 现在我的问题是: 1、INT_N一直是低电平,单片机一直在响应中断程序 2、clkout输出4M,不是12M。可能是没有执行到setmode语句,因为一直在响应中断嘛 3、goodlink 灯不亮,不知道是不是也是因为一直在响应中断阿 希望您该我点建议 再次感谢 |
|
8楼#
发布于:2004-04-13 21:14
只要dl12接对了
不用单片机 led也会闪的 |
|
9楼#
发布于:2004-04-13 21:36
只要dl12接对了 不接单片机也会闪烁? |
|
|
10楼#
发布于:2004-04-14 09:48
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2004-04-14 10:18
把connecter的 d+ 加个1。5k的上拉就可以了
不用软件上拉 一样的 我现在也碰到int 一直为低的情况 [编辑 - 4/14/04 by ppcust] |
|
12楼#
发布于:2004-04-14 10:19
不会闪!!! 请教一下,在固件中,执行了如下指令之后 set_command( 0xd8);set_data( 0x01);//这条指令之后,GOODLINK指示灯就亮了(还没有联接USB连接线),一旦插入USB连接线到电脑,马上熄灭,这是否正常?需要使能这个管道么?为什么飞利浦提供的代码没有对D12初始化的代码?只有重新连接的指令呢?难道不需要使能任何寄存器么? |
|
|
13楼#
发布于:2004-04-14 10:33
用户被禁言,该主题自动屏蔽! |
|
14楼#
发布于:2004-04-14 10:36
用户被禁言,该主题自动屏蔽! |
|
15楼#
发布于:2004-04-14 10:50
谢谢关心,继续帮忙,即决问题我另外开贴给分 刚才我说的问题是我的固件中的代码,如果不打开管道,GOODLINK指示灯没有状态输出。 我的硬件是可以得到芯片的 ID以及可以修改输出频率,说明硬件连接应该没问题,没用DMA,这几个脚分别4.7K电阻上拉到VCC了,RESET脚直接挂到VCC上,其他和单片机引脚连。不知道这样的硬件连接是否正确? 现在问题是,我的单片机进入中断之后,直接读中断寄存器(这里是否有问题,下面是代码) if(!D12_int_n) { outs(\"int-n is coming data1 = \"); D12_cs_n = 0; set_command(0xf4);// 读中断寄存器 XmtBuff.b[0] = get_data(); XmtBuff.b[1] = get_data(); =========================================================== 这里读出来的数据直接送串口显示发现,我每次分别接受到 80 c0 40 40 80 然后就没有了。 由于我使用查询方式接受数据的,不知道是不是这个毛病?看了很多代码都是中断方式接受数据的。 |
|
|
16楼#
发布于:2004-04-14 10:56
用户被禁言,该主题自动屏蔽! |
|
17楼#
发布于:2004-04-14 10:59
用户被禁言,该主题自动屏蔽! |
|
18楼#
发布于:2004-04-14 11:53
[quote][quote] 中断那么方便,为什么要查询? [/quote] 呵呵,考虑到应用传输不是很快,用查询方式了,马上修改为中断方式试试看了,呵呵,不过理论上来说,和这个有关么? |
|
|
19楼#
发布于:2004-04-14 11:54
注意:reset不能直接挂到Vcc,要接一个1u的电容到地,在接一个10k的电阻到Vcc. 难道,d12的数据手册有问题?不是说内部有菲同步复位逻辑么? 这么说我上飞利浦的当了? |
|
|
上一页
下一页