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

帮帮小妹!对EZ-USB的IN2BC和inPacketSize不懂!

楼主#
更多 发布于:2007-05-04 00:14
功能:接收计算机发送的数据,然后接收PA0引脚数据,看是什么电平。
主机:
void TForm1::FillOutBuffer(PUCHAR outBuffer, UCHAR fillchar1, UCHAR fillchar2,UCHAR fillchar3)
{
  int i;
  outBuffer[0]=fillchar1;
  outBuffer[1]=fillchar2;
  //outBuffer[2]=fillchar3;//后加
  for (i=2;i<64;i++)
  {
    outBuffer(i)=fillchar3;//为了避免斜体,[]用()替代
  }
}

//---------------------------------------------------------------------------
bool TForm1::WriteDevice(HANDLE nhandle, int npipenum,UCHAR ndata1, UCHAR ndata2,UCHAR ndata3)
{
  FillOutBuffer(&outBuffer[0], ndata1, ndata2, ndata3);//data1给OUTBUF[0],data2给OUTBUF[1],ndata3给OUTBUF[2]
                                                       //&outBuffer[0],数组首地址,指向整个outBuffer[64]数组
  bulkControl.pipeNum=npipenum; //该端口号码代表输出端口号码
  outPacketSize=64;
  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;
}

//------------------------接收数据函数----------------------------------------
UCHAR TForm1::ReadDevice(HANDLE handle, int npipenum)
{
    UCHAR ndata1;
    bulkControl.pipeNum=npipenum;   //输出通道0,端点2的IN
    inPacketSize=64;

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

    ShowMessage(inBuffer[0]);//这就是要的结果
    if(!ReadSuccess)
    {
      Application->MessageBox("接收数据失败!","错误",MB_ICONERROR);
      CloseHandle(handle);
      return 0;
    }
    else
      return StrToInt(ndata1);
}

固件部分:
void TD_Init(void)                 // Called once at startup
{
    //InPrepare0=FALSE;   //new
    //ByteCount0=0;        //new
    
    PORTACFG = 0x00;    //PA引脚作为I/O口
    OEA = 0x00;         //输入,读取比较器数据
    PORTBCFG = 0x00;    //PB引脚作为I/0口
    OEB = 0xFF;         //输出,发送模拟开关指令
    OUTB=0xFF;          //所有PB引脚为高电平
    //PORTCCFG = 0x04;    //PC2用作INT0中断,其它设置为I/O口
    //OEC = 0xFF;         //输出,发送A/D及模拟开关控制位,0x0
    //OUTC = 0xF7;        //PC3(STANDBY)=0;PC2(EOC/INT0)=1;
                      //PC1(CONVST)=1;PC0(CPLD)=1;    
    
    IN07VAL |= bmEP2;   //使能所使用的输入端点2
    OUT07VAL |= bmEP2;  //使能所使用的输出端点2
    OUT07IEN |= bmEP2;  //使能端点2OUT中断
    //IN07IEN |= bmEP2;   //使能端点2IN中断
    
    suspCount = 1;

    Rwuen = TRUE;                // Enable remote-wakeup    
}

void ISR_Ep2out(void) interrupt 0
{      
     switch (OUT2BUF[0])//接收计算机发送的data1
     {
      //具体代码略
      }
    OUT2BC = 0;
    //==============接收比较器数据=================
    NOP();
    IN2BUF[0]=PINSA&0x01;
    IN2BC = 1;           //配置IN端点
       //=======================================
    // clear the IRQ
    EZUSB_IRQ_CLEAR();
    OUT07IRQ = bmEP2;
}
这个程序在连续读数据(6次左右)时会出错,前几次还正确

我对IN2BC,和主机的inPacketSize的值如何定不是很清楚,固件中IN2BUF[0]是64位的数据吗?是不是IN2BC应=64?或者直接令IN2BUF[0]=0或1,然后IN2BC = 1?
inPacketSize的值如何定,是不是必须和outPacketSize相等?
其实在WriteDevice的时候,我只是写outBuffer[0],outBuffer[1],outBuffer[2],outPacketSize是不是=3就可以了?我令outPacketSize=64岂不是速度更慢?
我只是要接收inBuffer[0]的数据,是不是inPacketSize=1就可以了,那样是不是速度快些?
这些东西到底如何定啊?
游客

返回顶部