kuliuyisi
驱动牛犊
驱动牛犊
  • 注册日期2005-05-15
  • 最后登录2007-08-26
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1251回复:0

帮忙!使用AN2131QC接收数据出错

楼主#
更多 发布于:2007-05-04 12:34
  目的:向AN2131QC发送命令,执行相应的动作,然后取PA0引脚上的值(0或1)。发送数据没有问题,但是我单击“接收”按钮调用ReadDevice(handle)来接收数据的时候,第一次返回值正确,但是第二次点该按钮的时候,程序就死掉了,不知为何?是不是固件的IN2BC和主机的inPacketSize设置的问题,这两个参数到底如何来定?还是WriteDevice和ReadDevice函数的通道bulkControl.pipeNum设置的问题?给出部分代码如下。

//****************************************************************************************************8
主机代码:使用C++ Builder6.0
UCHAR outBuffer[64],inBuffer[64];//输入输出缓冲区
WORD outPacketSize,inPacketSize;//输入输出缓冲区的长度
//填充缓冲区
void TForm1::FillOutBuffer(PUCHAR outBuffer, UCHAR fillchar1, UCHAR fillchar2,UCHAR fillchar3)
{
  int i;
  outBuffer[0]=fillchar1;
  outBuffer[1]=fillchar2;
  for (i=2;i<64;i++)
  {
    outBuffer(i)=fillchar3;//为了防止网页中的斜体字,[]用()替代
  }
}

//写设备,发送数据
//---------------------------------------------------------------------------
bool TForm1::WriteDevice(HANDLE nhandle, UCHAR ndata1, UCHAR ndata2,UCHAR ndata3)
{
  FillOutBuffer(&outBuffer[0], ndata1, ndata2, ndata3);//data1给OUTBUF[0],data2给OUTBUF[1],ndata3给OUTBUF[2]
                                                      
  bulkControl.pipeNum=1; //该端口号码代表输出端口号码
  outPacketSize=64;             //发送的数据长度
  //outPacketSize=3;
  Writesuccess=DeviceIoControl(nhandle,
                               IOCTL_EZUSB_BULK_WRITE,
                               &bulkControl,
                               sizeof(BULK_TRANSFER_CONTROL),
                               &outBuffer[0],
                               outPacketSize,
                               &nBytes,
                               NULL);
  if (!Writesuccess)
  {
    Application->MessageBox("写设备错误,请重新打开设备","错误",MB_ICONERROR);
    CloseHandle(nhandle);
    return 0;
  }
  else
    return 1;
}
//读设备,接收数据
int TForm1::ReadDevice(HANDLE handle)
{
    bool ReadSuccess;
    bulkControl.pipeNum=0;   //端点2的IN ,npipenum应为?
    inPacketSize=1;
    //inPacketSize=64;                    //输入缓冲区的长度

    ReadSuccess=DeviceIoControl(handle,
                                IOCTL_EZUSB_BULK_READ,
                                &bulkControl,
                                sizeof(BULK_TRANSFER_CONTROL),
                                &inBuffer[0],
                                inPacketSize,
                                &nBytes,
                                NULL);

    if(!ReadSuccess)
    {
      Application->MessageBox("接收数据失败!","错误",MB_ICONERROR);
      CloseHandle(handle);
      return 0;
    }
    else
      return inBuffer[0];
}
//单击“接收”按钮
void __fastcall TForm1::Button19Click(TObject *Sender)
{
 ShowMessage(IntToStr(ReadDevice(handle)));
}



//*******************************************************************************************
//AN2131QC固件,据CYPRESS范例程序改编,使用uVision编写
void TD_Init(void)                 // Called once at startup
{
    //InPrepare0=FALSE;   //new
    //ByteCount0=0;        //new
    
    PORTACFG = 0x00;    //PA引脚作为I/O口
    OEA = 0x00;         //输入,读取比较器数据
    OUTA=0xFF;          //PA引脚初始化为高电平
    PORTBCFG = 0x00;    //PB引脚作为I/0口
    OEB = 0xFF;         //输出,发送模拟开关指令
    OUTB=0xFF;          //所有PB引脚为高电平
        
    IN07VAL |= bmEP2;   //使能所使用的输入端点2
    OUT07VAL |= bmEP2;  //使能所使用的输出端点2
    OUT07IEN |= bmEP2;  //使能端点2OUT中断
    
    suspCount = 1;

    Rwuen = TRUE;                // Enable remote-wakeup    
}

void ISR_Ep2out(void) interrupt 0
{      
     switch (OUT2BUF[0])//接收计算机发送的data1
     {
       //发送代码略
     }
     OUT2BC = 0;

     Delay(5);
    
    if(EPIO[IN2BUF_ID].cntrl & bmEPBUSY)  //判断IN端点是否忙,1=忙
    {
      TOGCTL = 0x08 | IN2BUF_ID;          //选择IN端点
      WRITEDELAY();
      if(TOGCTL & 0x80)                   //判断是否DATA1
        TOGCTL |= 0x20;                   //是DATA1,则轮换至DATA0
      else
        TOGCTL |= 0x40;                   //是DATA0,则轮换至DATA1
     }

      if(PINSA&0x01==0x01)
         IN2BUF[0]=1;
      else if(PINSA&0x01==0x00)
         IN2BUF[0]=0;

    IN2BC = 1;           //配置IN端点
    
    
     EZUSB_IRQ_CLEAR();
     OUT07IRQ = bmEP2;
}
游客

返回顶部