Cyapi使用心得
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EZ-USB FX2(68013)Cyapi使用心得(1)--USB连接
2009-11-07 19:23
用Cyapi也有一阵了,这个确实比EZusb的api好用,简单说下Cyapi的使用心得,在编程中应该注意的一些问题,毕竟,说起来,那个CYapi 的说明文档讲的实在太简单了点,好多东西都讲得不明白,只能
在使用中自己慢慢积累了。
首先说下前提,固件架构是EZ-USB FX2/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 = new CCyUSBDev(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; i < USBDevice->DeviceCount(); i++) //枚举所有USB设备
{
USBDevice->Open(i); / /打开第i号USB设备
m_DeviceListComBox.AddString(USBDevice->DeviceName); //所选择的当前设备名
}
}
好了,今天说到这里,有空接着写~
◆在cybulk的例子中介绍了如何枚举固件中使用的所有端点,也就是使用多个端点的情况:
CCyUSBDevice *USBDevice =new CCyUSBDevice(m_hWnd); //USB设备
USBDevice->Open(0); //打开0号USB设备
【1】首先获取所用的端点数目
int epts = USBDevice->EndPointCount();
EndPointCount();函数返回当前所用的端点数+1,也就是包含了控制端点。例如在固件接口描述符Interface Descriptor中设置Number of end points项(第5项)的值为4,则epts 的值为4+1=5
【2】定义端点指针
CCyUSBEndPoint *endpt;
CCyUSBEndPoint建立一个端点对象,可建立所有的端点类型,控制端点,bulk端点,ISO 端点等;
【3】开始枚举端点,并获得其属性:端点号,传输方向
for (i=1; i { endpt = USBDevice->EndPoints[i]; //EndPoints-端点列表,最大 16.EndPoints[0]指向控制端点(CCyControlEndPoint) //未使用的端点设置为NULL if (endpt->Attributes == 2) // Bulk Attributes--判断传输类型bulk,control,等 { sprintf(s, "0x%02X", endpt->Address); if (endpt->Address & 0x80) //Address--判断传输方向in or out 0x8_-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 =new CCyUSBDevice(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.。开始命名