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

大家来帮我看看,数据采集程序和通过D12的端点2发送数据的程序是否正确?程序如下:

楼主#
更多 发布于:2003-07-13 16:43
相关参数:
ADC = 0x7ff8 ;     //定义A/D的端口地址
          ADCdata = 0x1000;  //定义数据缓冲器地址
i = 8;

数据采集中断程序
adc_das() interrupt 0
{
         bEPPflags.bits.das_flag = 1;
        
tmp = *ADC;    //读取A/D转换结果
*ADCdata = tmp;//结果值存储到数据缓存区
ADCdata++;     //数据缓存区指针地址加1
i--;
  *ADC = i;      //启动下一个模拟输入通道A/D转换
        
  }

发送程序:
if (bEPPflags.bits.setup_packet)
   {
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
D12SUSPD = 1;     //释放D12的挂起状态

    } // if setup_packet
else
  {  
 
  IT0  = 1;          //设置IN0为边沿触发  
              EX0  = 1;          //允许外部中断0中断
              PX0  = 0;          //设置为低优先级
  *ADC = i ;         //启动ADC0809  
          // while(i);       //等待8个通道A/D转换完毕
    //if(bEPPflags.bits.das_flag == 1)
         // DISABLE;
// bEPPflags.bits.das_flag = 0;
  //  ENABLE;
           // EX0  = 0;   //禁止外部中断INT0*/
  main_txdone();  
}

主端点发送:
void main_txdone(void)reentrant
{
unsigned char len,epstatus;

D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
    
    epstatus = D12_ReadEndpointStatus(5);//读取缓存区状buffer1_full|buffer0_full    
epstatus &=0x60;
 len = D12_WriteBuffer(5,ADCdata,64);
if(epstatus == 0x60)
    {
        len = D12_WriteBuffer(5,ADCdata,64);//写入双缓存数据
     }
}

最新喜欢:

crazyqpcrazyq...
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-14 14:16
怎么没人回答啊,兄弟们,帮帮我吧
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-14 16:25
我简单的看了一下,好象有两点问题:1、len = D12_WriteBuffer(5,ADCdata,64);中D12_WriteBuffer函数是你自己写的吗?是不是对的?不妨贴出来看看,我用的是D12_WriteEndpoint(5, 64, EpBuf);是没问题的。

2、不要用双缓冲区,你的用法不对!我用过双缓冲区,数据能发送,但是很慢,没有实际意义,但也或许是我用的不对,不知道其他大虾是怎么做的。
duanjong
驱动中牛
驱动中牛
  • 注册日期2003-03-10
  • 最后登录2006-01-18
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-14 16:37
应该是对的,否则我得枚举就不会成功了(不加ADC时)
函数定义如下:
unsigned char D12_WriteBuffer(unsigned char endp ,unsigned char *buf,unsigned char len)reentrant
{

unsigned char i;

 if(bEPPflags.bits.in_isr == 0)
          {
    DISABLE;
          }
 outportb(D12_COMMAND,endp); //选择端点

 inportb(D12_DATA);    //读入满/空状态

 //**********************************************
 outportb(D12_COMMAND,0xF0);   //写缓冲区命令

 outportb(D12_DATA,0);

 outportb(D12_DATA,len);

     for(i=0; i<len; i++)
{
  outportb(D12_DATA, *(buf+i));
}

  outportb(D12_COMMAND,0xFA);  //VALIDATE BUFFER


 if(bEPPflags.bits.in_isr == 0)

  {
     ENABLE;
            }
return len;
}
游客

返回顶部