阅读:1323回复:0
帮帮小妹!对EZ-USB的IN2BC和inPacketSize不懂!
功能:接收计算机发送的数据,然后接收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就可以了,那样是不是速度快些? 这些东西到底如何定啊? ![]() |
|