xingsha
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2008-01-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3799回复:54

D12紧急求救

楼主#
更多 发布于:2004-03-07 23:16
我的D12调试遇到如下问题:
1. 上电后INT0始终为低,导致程序总是进入中断服务;
2. 中断进入后进行跟踪,发现总是Control In中断;
3. 由于始终没有Control Out中断,导致TRANSMIT无法置位;
4. 由于不是Transmit状态,Control In中断一进入,经判断后马上
   就得Return。
这是什么原因?大侠们请指教!

最新喜欢:

lhaihlhaih wangminwangmi...
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
}
}
A strong man can save himself. A great man can save another.
xingsha
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2008-01-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-08 00:34
多谢zmwk大侠!
我看了一下,我所用的代码与您贴出来的一模一样。问题是:

程序总能到这里:
   //端点0IN处理
   void ep0_txdone(void)
却总也到不了这里:
   //端点0OUT中断
void ep0_rxdone(void)

 这是什么原因?另外,请教一下,是否只有一个中断寄存器,两个字节?

zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于: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中断

这两个响应弄拧了?
A strong man can save himself. A great man can save another.
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-08 09:52
我觉得你的固件程序应该没有问题,估计是你的硬件的缘故,你可以看看单片机和D12的复位电路(D12的复位电路最好用一个10K电阻和4.7UF电容构成,不要用电阻分压构成)是否正确,D12的输出时钟是否正确,还有D12的中断数据位是否正确等等
dysjd
驱动牛犊
驱动牛犊
  • 注册日期2004-03-01
  • 最后登录2004-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-08 09:51
请问中断数据位是哪个口阿
D12的复位电路到底是怎样的阿
我接一个1u电容接地,10k电阻接vcc
这样可以吗
直接接地行吗
lg970331
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2007-04-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
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]
dysjd
驱动牛犊
驱动牛犊
  • 注册日期2004-03-01
  • 最后登录2004-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-08 11:47
非常感谢您。
可是我用的是周立功的pdiusbd12 smart开发板的原程序,是没问题的。电路图我也是按照他的原理图作的。
现在我的问题是:
1、INT_N一直是低电平,单片机一直在响应中断程序
2、clkout输出4M,不是12M。可能是没有执行到setmode语句,因为一直在响应中断嘛
3、goodlink 灯不亮,不知道是不是也是因为一直在响应中断阿
希望您该我点建议
再次感谢
ppcust
驱动牛犊
驱动牛犊
  • 注册日期2003-12-17
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-13 21:14
只要dl12接对了
不用单片机 led也会闪的
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-13 21:36
只要dl12接对了
不用单片机 led也会闪的
 


不接单片机也会闪烁?
恒坚电器([url]http://www.hejoin.com[/url])
tyant
禁止发言
禁止发言
  • 注册日期2004-03-17
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分74652分
  • 威望373563点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-14 09:48
用户被禁言,该主题自动屏蔽!
ppcust
驱动牛犊
驱动牛犊
  • 注册日期2003-12-17
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-14 10:18
把connecter的 d+  加个1。5k的上拉就可以了

不用软件上拉

一样的

我现在也碰到int 一直为低的情况



[编辑 -  4/14/04 by  ppcust]
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-14 10:19
不会闪!!!

set_mode()之前关闭中断!!
 


请教一下,在固件中,执行了如下指令之后
set_command( 0xd8);set_data( 0x01);//这条指令之后,GOODLINK指示灯就亮了(还没有联接USB连接线),一旦插入USB连接线到电脑,马上熄灭,这是否正常?需要使能这个管道么?为什么飞利浦提供的代码没有对D12初始化的代码?只有重新连接的指令呢?难道不需要使能任何寄存器么?
恒坚电器([url]http://www.hejoin.com[/url])
tyant
禁止发言
禁止发言
  • 注册日期2004-03-17
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分74652分
  • 威望373563点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-14 10:33
用户被禁言,该主题自动屏蔽!
tyant
禁止发言
禁止发言
  • 注册日期2004-03-17
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分74652分
  • 威望373563点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-14 10:36
用户被禁言,该主题自动屏蔽!
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-04-14 10:50


那是后话了,不知道你现在在什么阶段。set_EPEnable()是由?host
的set_config标准请求发起的。d12的寄存器在上电复位后就可以用了。不要操心d12的寄存器,只要在它提供的命令界面上操作就行


谢谢关心,继续帮忙,即决问题我另外开贴给分
刚才我说的问题是我的固件中的代码,如果不打开管道,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
然后就没有了。

由于我使用查询方式接受数据的,不知道是不是这个毛病?看了很多代码都是中断方式接受数据的。
恒坚电器([url]http://www.hejoin.com[/url])
tyant
禁止发言
禁止发言
  • 注册日期2004-03-17
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分74652分
  • 威望373563点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-04-14 10:56
用户被禁言,该主题自动屏蔽!
tyant
禁止发言
禁止发言
  • 注册日期2004-03-17
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分74652分
  • 威望373563点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-14 10:59
用户被禁言,该主题自动屏蔽!
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-04-14 11:53
[quote][quote]
由于我使用查询方式接受数据的,。。。。。


中断那么方便,为什么要查询?
 [/quote]

呵呵,考虑到应用传输不是很快,用查询方式了,马上修改为中断方式试试看了,呵呵,不过理论上来说,和这个有关么?
恒坚电器([url]http://www.hejoin.com[/url])
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-14 11:54
注意:reset不能直接挂到Vcc,要接一个1u的电容到地,在接一个10k的电阻到Vcc.
d12上电需要复位!


难道,d12的数据手册有问题?不是说内部有菲同步复位逻辑么?
这么说我上飞利浦的当了?
恒坚电器([url]http://www.hejoin.com[/url])
上一页
游客

返回顶部