微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > 基于Spartan-6的高速数据采集、处理和实时传输研究

基于Spartan-6的高速数据采集、处理和实时传输研究

时间:12-06 来源:互联网 点击:

FO中,特别是自动传输(CY7C68013A单片机不干预数据传输),固件程序主要完成各个端口的初始化。因此我们要修改两个地方:(1)USB设备描述符列表Dscr.a51,根据实际情况修改里面的端口数和传输方式等;(2)初始化函数void TD_Init(void)。在SLAVE FIFO这种方式下,设置EP2为4缓冲的输出端口,EP6为4缓冲的输入端口。

  5. 上位机软件设计

  上位机应用程序是系统与用户之间交流的接口,它通过通用驱动程序完成对外设的控制和通信。主机端应用程序负责向FX2的FIFO发送或者接收数据。本报告中采用的固件架构是EZ-USB FX2/FX2LP(CY7C68013, 驱动程序是Cyusb.sys。用Visual Studio2008软件进行上位机开发,利用C++/MFC来开发基于对话框的应用程序,系统的主要功能模块有:打开USB设备、复位USB设备、系统数据测试与显示等。

  在VS2008中建立一个MFC 单文档/对话框应用程序后,在路径项目中包含头文件cyapi.h和cyapi.lib所在的路径。然后手动导入cyapi.lib,注意是CV6_7的lib,不要导入BCB的。

  开发USB应用程序的一般工作流程如下。

  1)首先要创建一个USB设备对象

  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 DeviceCount(); i++) //枚举所有USB设备

  {

  USBDevice->Open(i);//打开第i号USB设备

  m_DeviceListComBox.AddString(USBDevice->DeviceName);//所选择的当前设备名}

  }

  3)端点枚举

  在cybulk的例子中介绍了如何枚举固件中使用的所有端点,也就是使用多个端点的情况,其枚举步骤主要包括一下几个端点:

  (1)创建USB设备并打开该设备

  CCyUSBDevice *USBDevice=new CCyUSBDevice(m_hWnd);//USB设备USBDevice->Open(0);//打开0号USB设备。

  (2)获取所用的端点数目

  intepts = USBDevice->EndPointCount();

  EndPointCount();函数返回当前所用的端点数+1,也就是包含了控制端点。例如在固件接口描述符Interface Descriptor中设置Number of end points项(第5项)的值为4,则epts的值为4+1=5。

  (3)定义端点指针

  CCyUSBEndPoint *endpt;CCyUSBEndPoint建立一个端点对象,可建立所有的端点类型,控制端点,bulk端点,ISO端点等;

  (4)枚举端点,并获得其属性:端点号,传输方向

  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其他属性,这里列出经常使用的几个:(1)USBDevice->DeviceCount()//返回连接到电脑的USB设备个数,从0,1,2.开始命名(2)USBDevice->DeviceName()//返回USB设备名称,也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB设备VIDUSBDevice->CCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端点2,in传输可以看到,上面的只需要3行代码,比枚举简洁方便多了。至于获取USB其他属性,这里列出经常使用的几个:(1)USBDevice->DeviceCount()//返回连接到电脑的USB设备个数,从0,1,2.开始命名(2)USBDevice->DeviceName()//返回USB设备名称,也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB设备VIDUSBDev

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top