阅读:1252回复:0
帮忙!使用AN2131QC接收数据出错
目的:向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; } |
|