您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Cyapi使用心得3
Cyapi使用心得(1)--USB连接2009-11-0719:23用Cyapi也有一阵了,这个确实比EZusb的api好用,简单说下Cyapi的使用心得,在编程中应该注意的一些问题,毕竟,说起来,那个CYapi的说明文档讲的实在太简单了点,好多东西都讲得不明白,只能在使用中自己慢慢积累了。首先说下前提,固件架构是EZ-USBFX2/FX2LP(CY7C68013),编译环境VC++6.0,驱动是Cyusb.sys。上位机简单说下,建立一个MFC单文档/对话框应用程序;在路径项目中包含头文件cyapi.h和cyapi.lib所在的路径,最好移到最上面。然后手动导入cyapi.lib,注意是CV6_7的lib,不要导入BCB的。下面讲得是按照USB一般工作流程来讲得。(1)USB连接1.首先要建立一个USB设备对象文档里有说的了,copy一下CCyUSBDevice*USBDevice=newCCyUSBDev(Handle);括号中的Handle是USB所关联对象的句柄,一般在MFC中直接就是m_hwnd。2.然后就该是打开USB设备了可以用到两个函数open();isopen()这两个都可以用来打开USB设备,isopen()还可以判断能否获得USB设备句柄一般来说,如果只有一个USB设备连接,可以这样打开:USBDevice-open(0)//打开0号USB设备如果要判断,可以:if(!USBDevice-open(0))//打开失败{messagebox(USB未连接);}或者if(!USBDevice-Isopen())..........如果连接有多个USB设备,那么可以枚举所有的USB,用到DeviceCount()函数;具体的可以参考cybulk的例子,执行USBDevice-DeviceCount()后,返回所连接的USB设备个数:if(USBDevice-DeviceCount())//保证至少有一个USB设备连接{for(i=0;iUSBDevice-DeviceCount();i++)//枚举所有USB设备{USBDevice-Open(i);//打开第i号USB设备m_DeviceListComBox.AddString(USBDevice-DeviceName);//所选择的当前设备名}}好了,今天说到这里,有空接着写~Cyapi使用心得(2)--端点使用及其他USB属性获取2009-11-1322:52◆在cybulk的例子中介绍了如何枚举固件中使用的所有端点,也就是使用多个端点的情况:CCyUSBDevice*USBDevice=newCCyUSBDevice(m_hWnd);//USB设备USBDevice-Open(0);//打开0号USB设备【1】首先获取所用的端点数目intepts=USBDevice-EndPointCount();EndPointCount();函数返回当前所用的端点数+1,也就是包含了控制端点。例如在固件接口描述符InterfaceDescriptor中设置Numberofendpoints项(第5项)的值为4,则epts的值为4+1=5【2】定义端点指针CCyUSBEndPoint*endpt;CCyUSBEndPoint建立一个端点对象,可建立所有的端点类型,控制端点,bulk端点,ISO端点等;【3】开始枚举端点,并获得其属性:端点号,传输方向for(i=1;iepts;i++){endpt=USBDevice-EndPoints[i];//EndPoints-端点列表,最大16.EndPoints[0]指向控制端点(CCyControlEndPoint)//未使用的端点设置为NULLif(endpt-Attributes==2)//BulkAttributes--判断传输类型bulk,control,等{sprintf(s,0x%02X,endpt-Address);if(endpt-Address&0x80)//Address--判断传输方向inorout0x8_-in;0x0_-out{m_InEndptComBox.AddString(s);//最高位为8,in端点,添加到in组合框m_InEndptComBox.SetItemData(m_InEndptComBox.GetCount()-1,i);}else{m_OutEndptComBox.AddString(s);//否则,最高位为0,out端点,添加到out组合框m_OutEndptComBox.SetItemData(m_OutEndptComBox.GetCount()-1,i);}}}◆这样,就完成了某个具体端点的选择。从上面的代码来看,非常烦琐,如果只需要使用一个端点的画,那上面的代码无疑就显得冗长不够简洁了。仅使用一个端点,可以使用EndPointOf()函数,该函数直接使用指定的端点,返回其指针;例如,要使用端点2,in传输,那么,可以这样:CCyUSBDevice*USBDevice=newCCyUSBDevice(m_hWnd);//USB设备USBDevice-Open(0);//打开0号设备,CCyUSBEndPoint*endpt=USBDevice-EndPointOf(0X82);//使用端点2,in传输可以看到,上面的只需要3行代码,比枚举简洁方便多了。◆至于获取USB其他属性,这里列出经常使用的几个,具体的可参考cyapi的文档,在CCyUSBDevice和CCyUSBEndPoint这两个类里可查询到。USBDevice-DeviceCount()//返回连接到电脑的USB设备个数,从0,1,2.。开始命名USBDevice-DeviceName()//返回USB设备名称,也就是固件中StringDscr2:字段字符串USBDevice-VendorID//返回USB设备VIDUSBDevice-ProductID//返回USB设备PIDCyapi使用心得(3)--控制传输2009-11-1721:04刚喝酒回来,头很晕!今天写写控制传输吧--可以说,写USB上位机,控制传输肯定第一个要做的例子和试验了;因为固件不用很多代码,VC也不用很多代码就测试你写的USB上位机的正确与否,这里简单介绍下cyapi写控制传输的一些方法。基本上,要对固件进行自定义命令(vendor)传输,通常都是用控制传输进行的。使用控制传输in或者out方式都可以实现对固件的自定义命令。【1】out控制传输发送vendor命令我想采用out方式应该比较符合大家的思维,因为是从上位机发命令到下位机,怎么看都应该是out而不是in。例如你在固件里设置了out的接收buf:BOOLDR_VendorCmnd(void){switch(SETUPDAT[1]){case0xDD:{temp=EP0BUF[0];EP0BCH=0;EP0BCL=1;EP0CS|=bmHSNAK;break;}default:return(TRUE);}return(FALSE);}VC中:CCyControlEndPoint*CtlEndpoint;//定义一个控制端点CtlEndpoint-Target=TGT_DEVICE;//不必关注,固定CtlEndpoint-ReqType=REQ_VENDOR;//请求类型:自定义请求(标准请求等)CtlEndpoint-Direction=DIR_TO_DEVICE;//传输方向:主机-usb设备(out)CtlEndpoint-ReqCode=0XDD;//自定义请求码CtlEndpoint-Value=0;//这里的设定值将传给setupdat的【2:3】位CtlEndpoint-Index=0;//这里的设定值将传给setupdat的【4:5】位PUCHARbuf=newUCHAR[1];ZeroMemory(buf,1);//用0填充buf区,填充大小(1字节)longbuflen=1;//传输的其他字节数:cy控制台console中length的值CtlEndpoint-XferData(buf,buflen);当然,没有规定说一定必须传给下位机至少一个字节的数据;你也可以不传;不过最好下位机同样设置接收字节为0,否则小心有莫名奇妙的错误(XX内存不能为只读等等)。将temp=EP0BUF[0];去掉,上位机:PUCHARbuf=newUCHAR;//用0填充buf区,填充大小(1字节)longbuflen=0;CtlEndpoint-XferData(buf,buflen);也是可以的,友情提示:控制传输请尽量用同步的xferdata()而不是异步的begindataxfer()。【2】in控制传输发送vendor命令基本上,跟out区别不大。固件中:BOOLDR_VendorCmnd(void){switch(SETUPDAT[1]){case0xDD:{*EP0BUF=0XDD;EP0BCH=0;EP0BCL=1;EP0CS|=bmHSNAK;break;}default:return(TRUE);}return(FALSE);}VC中:CCyControlEndPoint*CtlEndpoint;//定义一个控制端点CtlEndpoint-Target=TGT_DEVICE;//不必关注,固定CtlEndpoint-ReqType=REQ_VENDOR;//请求类型:自定义请求(标准请求等)CtlEndpoint-Direction=DIR_FROM_DEVICE;//传输方向:usb设备-主机(in)CtlEndpoint-ReqCode=0XDD;//自定义请求码CtlEndpoint-Value=0;//这里的设定值将传给setupdat的【2:3】位CtlEndpoint-Index=0;//这里的设定值将传给setupdat的【4:5】位PUCHARbuf=newUCHAR[1];ZeroMemory(buf,1);//用0填充buf区,填充大小(1字节)longbuflen=1;//传输的其他字节数:cy控制台console中length的值CtlEndpoint-XferData(buf,buflen);这里的话,推荐尽量设置接收缓冲,不要将buflen设置为0.同样,友情提示:控制传输请尽量用同步的xferdata()而不是异步的begindataxfer()。【3】另外,还有两个简化版本的函数Write(out传输)和Read(in传输)也可以进行控制传输,作用同XferData()是一样的,因为已经明确表示了是in还是out,所以Direction项的值就省略了。只是看起来代码更加简洁,输入效率更高而已。基本上,大多数时候,我都是使用Write和Read。CCyControlEndPoint*CtlEndpoint;//定义一个控制端点CtlEndpoint-Target=TGT_DEVICE;//不必关注,固定CtlEndpoint-ReqType=REQ_VENDOR;//请求类型:自定义请求(标准请求等)CtlEndpoint-ReqCode=0XDD;//自定义请求码CtlEndpoint-Value=0;//这里的设定值将传给setupdat的【2:3】位CtlEndpoint-Index=0;//这里的设定值将传给setupdat的【4:5】位PUCHARbuf=newUCHAR[1];ZeroMemory(buf,1);//用0填充buf区,填充大小(1字节)longbuflen=1;//传输的其他字节数:cy控制台console中length的值CtlEndpoint-Write(buf,buflen);Read的话同理。Cyapi使用心得(4)--bulk传输2009-12-0119:50今天有空写以下bulk
本文标题:Cyapi使用心得3
链接地址:https://www.777doc.com/doc-5555403 .html