jiangliq_2000
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1413回复:0

D12数据采集差最后一步了,大家都来帮分析一下啊!解决了把本人的可用分全部相送

楼主#
更多 发布于:2005-03-09 15:56
各位好,我买了周立功的USB D12 SMART套件,根据其现在开发一个USB的数据采集系统,采用的单片机ADUC812+D12+外部RAM,主要思路是:ADUC812是自带12位A/D的单片机,我使用DMA方式的数据采集,先直接把采到的数据存储在外部RAM,然后通过D12把数据传输到PC机上,根据USB D12 SMART套件的原理图,我做了类似的一块板子,然后固件上也做了相应的改动,这个块板子枚举也成功了,没加上A/D采集的程序时,USB通信也能正常工作,但是一加上A/D采集的程序时,USB通信就出现问题,主要表现在:端点2读数据失败,而端点1和端点2的写数据都能成功,就是读出了问题。端点的读写我是用了周立功EasyD12.dll动态连接库中的4个函数,即ReadPort1(),WritePort1(),ReadPort2(),WritePort2()。
下面是我用到的A/D中断处理函数
// A/D中断处理函数,主要是关定时器2和A/D中断,A/D的触发信号是由定时器2 的益出位来提供的
adc_isr() interrupt 6
{
    DISABLE;
    TR2 = 0;
    EADC = 0;
    bEPPflags.bits.ep2_txdone = 1;
    ENABLE;      
}

//端点1 out 处理
void ep1_rxdone(void)
{
   unsigned char len;
   D12_ReadLastTransactionStatus(2); //清中断标志位
   len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
   if(len != 0)
bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
}

//主端点IN控制  端点号5
void main_txdone(void)
{
    D12_ReadLastTransactionStatus(5); //清中断标志
    bEPPflags.bits.ep2_txdone = 1;
}

下面是在MAINLOOP.C主循环while(){  }中自己添加的部分,其他与周立公一样
// 在mainloop.c主循环中增加了端点5的处理,当MCU收到主端点OUT时,通过标志位bEPPflags.bits.ep2_txdone 是否等于 1来判断是否要向端点号5的缓冲区写64B的数据,这64B的数据是存在外部RAM的,所以要先读到内部的BUFFER,

  if(bEPPflags.bits.ep2_txdone == 1)
   {  
     DISABLE;
     MCU_D12CS = 0x1;  
     MCU_RAMCS = 0x0;   // 外部RAM的片选信号有效
     if(RamCount == 33)  // RamCount是一个全局变量
        RamCount = 0; // 用来实现对外部RAM
                         0 到2112 地址范围寻址
     RamCount++;
     for(j=0; j<64; j++)    // 从外部RAM读数据到内部BUFFER
        EpBuf[j] = XBYTE[RamCount*64+j] ;
     MCU_RAMCS = 0x1;
     MCU_D12CS = 0x0;  // D12的片选信号有效    
     D12_WriteEndpoint(5, 64, EpBuf);
     bEPPflags.bits.ep2_txdone = 0 ;
    ENABLE;  
 }

// 在mainloop.c主循环中增加了端点1 OUT(端点号为2)的处理,  用来控制A/D采集的开始。MCU收到端点1 OUT的中断时,会置标志位bEPPflags.bits.ep1_rxdone。

  if(bEPPflags.bits.ep1_rxdone == 1)
  {
     DISABLE;
     bEPPflags.bits.ep1_rxdone = 0 ;
     MCU_D12CS = 0x1;  
     MCU_RAMCS = 0x0;
  //  以下都是A/D转换前对MCU的SFR进行初始化。
     T2CON = 0x00;
     DMAL = 0;
     DMAH = 0;
     DMAP = 0;
     RCAP2L = 0x0E0;           //触发后重新载入Timer2 的值
     RCAP2H = 0x0FF;
     TL2 = 0x0E0;              //预置 Timer2 的值
     TH2 = 0x0FF;
     ADCCON1 = 0x62;
     ADCCON2 = 0x41;
     EADC = 1;    // 开A/D中断
     TR2 = 1;     // 开定时器2
     ENABLE;          
  }    

另外,我还实验了没用DMA方式时的A/D采集,那样的话USB通信能成功,但是还是偶尔有几次出现读端点2失败。难道是DMA方式有问题?

现在最不明白的就是端点2读经常出现失败,这是什么原因呢?
望各位大侠指点迷津!
游客

返回顶部