duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1521回复:14

令人郁闷的一个问题:d12枚举成功,单独进行数据采集测试时,采集到的数据也是对的,但当把数据采集和D12枚举放在一起时,用USB调试助手得到的结果大都是00和08,在这个问题上已经郁闷了好几天了,兄弟

楼主#
更多 发布于:2003-07-16 05:40
令人郁闷的一个问题:d12枚举成功,单独进行数据采集测试时,采集到的数据也是对的,但当把数据采集和D12枚举放在一起时,用USB调试助手得到的结果都是零,在这个问题上已经郁闷了好几天了,兄弟们帮帮忙吧!!!(我的D12占中断1,设置为高优先级,数据采集占中断0,设置为低优先级,并把数据采集中断的相关初始化放在主程序的
if (bEPPflags.bits.setup_packet)  
    。。。。
else  
         IT0  = 1;          //设置IN0为边沿触发  
           EX0  = 1;          //允许外部中断0中断
           PX0  = 0;          //设置为低优先级    
          *ADC = i ;         //启动ADC0809
          //for(k=0;k<25;k++);
        
          main_txdone();

并把数据采集到的数据放在主端点的缓存中,这些有错误吗?

[编辑 -  7/18/03 by  duanjong]

最新喜欢:

crazyqpcrazyq...
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-16 10:05
你的数据线上有信号吗?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-16 10:29
你枚举中是不是有一段程序在主程序里完成的?
如果你用的是philips的代码,那么应该是的,这是他们的一贯作风,如果你没有做大的改动,那么应该是发送描述符那一段程序吧,你把这段程序也挪到中断里去试试,不要等到跳出usb中断再处理。

如果成功了我再告诉你我认为的原因所在!
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-16 15:27
又发现了新的问题?我在单独进行数据采集测试时,为什么必须掉电一次才能采集到正确地信号??
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-16 17:25
应该放在中断程序中的那个位置?ep0_rxdone()后面吗?
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-16 19:04
jinghuiren 兄你好:我按照你的办法试了,枚举也可以成功,我在主程序里仅仅完成初始化操作和调用主端点main_txdone()发送采集到的数据;但用USB调试助手接受数据失败,不知这是为什么?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-17 09:15
应该放在中断程序中接收完setup包后面,你可以里一下传输的思路吗,首先是收到setup包,然后分析包的内容,然后进入chap9的标准请求过程,这些你都放在中断程序中处理吧,philips的例子代码最后一步是放在主程序中处理的。
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-17 13:15
现在我把和枚举相关的程序都放在USB中断服务子程序中,在主程序中仅完成初始化部分和启动ADC,在ADC中断程序中把采集到的数据放在EPBUF缓存中,并调用主端点发送main_txdone();,此时好像数据根本没有传递给EPBUF,输出还是零。而且我在测试时在数据采集中断中为buf赋值0x1F,按道理来说,界面输出应该时0X1F,但实际输出却是00,真是郁闷!!!!(USB占中断1,优先级为高,ADC占中断0,优先级为低)

adc_das() interrupt 0
{
     bEPPflags.bits.das_flag = 1;
        
     tmp = *ADC;    //读取A/D转换结果
     *ADCdata = tmp;//结果值存储到数据缓存区
     //*ADCdata = 0x1F;
      buf=*ADCdata;//其中,buf是赋值给主端点的EPBUF数组的值

ADCdata++;     //数据缓存区指针地址加1
          main_txdone();
*ADC = i;      //重新启动模拟输入通道A/D转换

}
void main()
{   ......
    IT1  = 0;   //设置INT1为低电平中断触发
    EX1  = 1;   //允许外部中断1
    PX1  = 1;   //设置为高优先级
 
    IT0  = 1;          //设置IN0为边沿触发  
    EX0  = 1;          //允许外部中断0中断
    PX0  = 0;          //设置为低优先级
 
    MCU_D12CS = 0x1;
    MCU_D12CS = 0x0;

    
      bEPPflags.value = 0;//清除事件标志寄存器
      
      reconnect_USB();//重新链接USB
   
      *ADC = i ;         //启动ADC0809
}
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-17 14:21
adc_das() interrupt 0
{
bEPPflags.bits.das_flag = 1;

tmp = *ADC; //读取A/D转换结果
*ADCdata = tmp;//结果值存储到数据缓存区
//*ADCdata = 0x1F;
buf=*ADCdata;//其中,buf是赋值给主端点的EPBUF数组的值

ADCdata++; //数据缓存区指针地址加1
main_txdone();
*ADC = i; //重新启动模拟输入通道A/D转换

}

你上面这段程序很奇怪,首先,你进中断的时候,你的*ADC = i,因为你每次出中断的时候都给*ADC赋了值,而且你的ADC是个全局指针变量,因此每次进中断的时候你的tmp也是i,然后你又把tmp赋给*ADCdata,在把它赋给buf,你觉不觉得很混乱呀!

你如果用示波器看ad采出的数据不是全为0,那么说明你这段程序有问题,你先不要管ad的数据,现在这里发送一批固定的数,比如aa什么的,看主机收到的是不是还是0,如果不是0,说明你这几次赋值过程出了问题,再好好想想它们间的关系。
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-17 15:19
jinghuiren 兄你好:
                  首先非常感谢您,给你20分以致鼓励。
                  其次,向您澄清一个我和其他人意见不同的问题:我觉得一旦USB枚举成功,可以在任何地方调用main_txdone(),但其他人认为必须在USB中断程序中调用main_txdone(),其他地方不可以调用,您的看法呢?
                  另外,就是关于上面的程序问题,我试验过,当我单独给EPBUF赋一组值时,用USB调试助手得到的数据是正确地,但当我同样不用数据采集时,利用指针赋值时
*ADCdata = 0x1F;
buf=(*ADCdata);
结果大都是零,
通过*ADCdata = 0x1F;buf=(*ADCdata);和buf = 0x1F 给buf赋值
,结果时不同的,这时为什么??????
                  


[编辑 -  7/17/03 by  duanjong]
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-17 19:53
其实你的想法也对,但是条件是你的中断不能太频繁,如果你的采集中断很频繁,那么主程序就没有时间运行了,也就是说刚跳出中断,理论上说应该运行主程序才对,但是这时候中断又来了,设备又必须再去处理中断,那么这样下去,你的那个函数是没有机会运行的,你明白了吗?

你那几个指针有可能是由于编译器的优化使得地址里的内容发生了变化(我的猜测),所以建议你不要用那么多次指针赋值,比如下面几行:
tmp = *ADC; //读取A/D转换结果
*ADCdata = tmp;//结果值存储到数据缓存区
//*ADCdata = 0x1F;
buf=*ADCdata;//

你的目的就是想把*ADC的值赋给buf,那你直接让 buf = *ADC,不就完了吗,为什么还要几次中间过程了,或者可以更简单,你把main_txdone()改为main_txdone(*ADC)更简单!你觉得呢?
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-17 21:32
是的,之所以这样,主要为的是测试,最后肯定要整理的
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-18 09:42
你看看你那几个片子的片选是不是有问题,现在是两边单独调都有数据,但是一连调就没有数据,我估计是不是冲突了。
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-18 10:01
我想可能也是,我的A/D转换是通过读写信号控制的,单片机的读写信号同时与A/D转换器的读写端和D12的读写端相连,数据线共用。可能是由于USB的中断优先级高,当A/D转换完成产生中断,就要输出数据时,D12又产生中断,这时读到的信号可能是D12发过来的数据,而不是/AD输出的数据,但想不到如何解决,ADC的电路图如附件,D12的接法基本按照标准的接法。现在得到的数据大都是00和08,可能这些数据正是D12发过来的数据。

[编辑 -  7/18/03 by  duanjong]
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-18 18:37
jinghuiren 兄看看上面的问题?
游客

返回顶部