搜索
bottom↓
回复: 4

FPGA+cy7c68013A数据采集 上位机问题

[复制链接]

出0入0汤圆

发表于 2012-4-22 11:20:31 | 显示全部楼层 |阅读模式
  学习了20天的USB协议和上位机,现在都很模糊,快要交毕业设计了,现在的问题是我用SLAVE FIFO模式从上位机采集512个字节数据。然后PC机再从端点中读取。用cypress的固件可以读出FPGA发出的数据,但是用上位MFC程序读取老是存在问题。调试的时候是这个:USB unhandled exception in .exe 0xc0000005:access violation。每次都停在那个对端点的操作语句上。程序贴下子(也是从那个书上找的也是基于cypress提供的那个cybulk吧):
// SJCJVCDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SJCJVC.h"
#include "SJCJVCDlg.h"

#include "CyAPI.h"
#include "cyioctl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CCyControlEndPoint  *ept;                //¶¨Òå¿ØÖƶ˵ã

CFile mFile;                                        //Îļþ

UINT ReadThreadLoop( LPVOID params ) {        //Ï̴߳¦Àí
        bool okin;
   CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
        OVERLAPPED inOvLap;
        PUCHAR inData = new UCHAR[512];                //Êý¾Ý»º³åÇø
        ZeroMemory(inData,1024);
        inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN");
        dlg->InEndpt->TimeOut = 0;

        for (;dlg->ReadThreadLooping ;)                //Ñ­»·
        {
                LONG inlen=512;
                //Òì²½¶ÁÊý¾Ý
                UCHAR  *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
                dlg->InEndpt->WaitForXfer(&inOvLap,200);
                okin = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
                if (okin)                                                //Èç¹û¶ÁÈ¡³É¹¦£¬Ôò±£´æÊý¾Ý
                {
                        mFile.SeekToEnd();
                        mFile.Write(inData,inlen);
                }
        }
        //½áÊøStart
        ept->Target    = TGT_DEVICE;
        ept->ReqType   = REQ_VENDOR;
        ept->Direction = DIR_TO_DEVICE;  
        ept->ReqCode   = 0xAB;                                //ÇëÇóÂë
        ept->Value     = 0;  
        ept->Index     = 0;

        PUCHAR buf=new UCHAR[2];
        ZeroMemory(buf, 2);
        LONG buflen =  2;
        buf[0]=0xAB;
        buf[1]=0x00;                                                //½áÊøStart       
        ept->XferData(buf,buflen);

    CloseHandle(inOvLap.hEvent);

        delete [] inData;
        dlg->ReadThread = NULL;                                //Ï߳̽áÊø

    dlg->USBDevice->Close();                        //¹Ø±ÕUSBÉ豸

        mFile.Flush();                                                //¹Ø±ÕÎļþ
        mFile.Close();

        return true;
}



/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
        CAboutDlg();

// Dialog Data
        //{{AFX_DATA(CAboutDlg)
        enum { IDD = IDD_ABOUTBOX };
        //}}AFX_DATA

        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CAboutDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        //}}AFX_VIRTUAL

// Implementation
protected:
        //{{AFX_MSG(CAboutDlg)
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
        //{{AFX_DATA_INIT(CAboutDlg)
        //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CAboutDlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
        //{{AFX_MSG_MAP(CAboutDlg)
                // No message handlers
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSJCJVCDlg dialog

CSJCJVCDlg::CSJCJVCDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CSJCJVCDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CSJCJVCDlg)
                // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSJCJVCDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CSJCJVCDlg)
                // NOTE: the ClassWizard will add DDX and DDV calls here
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSJCJVCDlg, CDialog)
        //{{AFX_MSG_MAP(CSJCJVCDlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
        ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
        ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSJCJVCDlg message handlers

BOOL CSJCJVCDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Add "About..." menu item to system menu.

        // IDM_ABOUTBOX must be in the system command range.
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);

        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
                CString strAboutMenu;
                strAboutMenu.LoadString(IDS_ABOUTBOX);
                if (!strAboutMenu.IsEmpty())
                {
                        pSysMenu->AppendMenu(MF_SEPARATOR);
                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                }
        }

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        // TODO: Add extra initialization here
        ReadThread=NULL;
        USBDevice = new CCyUSBDevice(m_hWnd);        //USBÉ豸
        ept = USBDevice->ControlEndPt;                        //USB¿ØÖƶ˵ã
       
        return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSJCJVCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
                CAboutDlg dlgAbout;
                dlgAbout.DoModal();
        }
        else
        {
                CDialog::OnSysCommand(nID, lParam);
        }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSJCJVCDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // device context for painting

                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                // Center icon in client rectangle
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // Draw the icon
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CDialog::OnPaint();
        }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSJCJVCDlg::OnQueryDragIcon()
{
        return (HCURSOR) m_hIcon;
}

void CSJCJVCDlg::OnButton3()
{
        // TODO: Add your control notification handler code here
        if(USBDevice->IsOpen())                        //USBÊÇ·ñ´ò¿ª
                SetDlgItemText(IDC_STATIC,"USBÉ豸ÒѾ­Á¬½Ó!");
        else
                SetDlgItemText(IDC_STATIC,"δÁ¬½ÓUSBÉ豸!");

        int vID,pID;
        CString str;
        vID=USBDevice->VendorID;                //¶ÁÈ¡VID
        pID=USBDevice->ProductID;                //¶ÁÈ¡PID
        str.Format("VendorID=0x%x",vID);
        SetDlgItemText(IDC_STATIC1,str);
        str.Format("ProductID=0x%x",pID);
        SetDlgItemText(IDC_STATIC2,str);

        PCHAR dn=new CHAR[256];
        dn=USBDevice->DeviceName;                //¶ÁÈ¡É豸Ãû³Æ
        str.Format("É豸Ãû³Æ£º%s",dn);
        SetDlgItemText(IDC_STATIC3,str);
}

void CSJCJVCDlg::OnOK()
{
        // TODO: Add extra validation here
        USBDevice->Close();                //¹Ø±ÕUSBÉ豸
        CDialog::OnOK();
}

void CSJCJVCDlg::OnCancel()
{
        // TODO: Add extra cleanup here
        USBDevice->Close();                //¹Ø±ÕUSBÉ豸
        CDialog::OnCancel();
}

void CSJCJVCDlg::OnButton1()
{
        // TODO: Add your control notification handler code here
        ept->Target    = TGT_DEVICE;
    ept->ReqType   = REQ_VENDOR;
    ept->Direction = DIR_TO_DEVICE;  
    ept->ReqCode   = 0xAB;                //ÇëÇóÂë
    ept->Value     = 0;  
    ept->Index     = 0;

        PUCHAR buf=new UCHAR[2];
    ZeroMemory(buf, 2);
    LONG buflen =  2;
        buf[0]=0xAB;
        buf[1]=0x01;                                //Æô¶¯Start

    ept->XferData(buf,buflen);  //×Ô¶¨ÒåÊý¾Ý´«Êä

        mFile.Open("FileRecevieTest.txt",CFile::modeWrite|CFile::modeCreate);
                                                                //´ò¿ªÎļþ
        mFile.SetLength(0);                        //ÎļþÇå¿Õ
}

void CSJCJVCDlg::OnButton2()
{
        // TODO: Add your control notification handler code here
        if (ReadThread)
        {
                ReadThreadLooping = false;
                ReadThread=NULL;                                        //Ï߳̽áÊø
                SetDlgItemText(IDC_EDIT1,"´«ÊäÍê±Ï£¡");
        }
        else
        {
                if (USBDevice->IsOpen()) {                        //¼ì²âUSBÊÇ·ñ´ò¿ª
                        ReadThreadLooping = true;
                        ReadThread = AfxBeginThread(ReadThreadLoop, this);        //¿ªÆôÏß³Ì
                        SetDlgItemText(IDC_EDIT1,"ÕýÔÚ´«Ê䣡");
                }
        }
}
比较急哦,希望高手们帮帮我,谢谢了。

出0入442汤圆

发表于 2012-4-22 12:47:21 | 显示全部楼层
没见过0xc0000005吗?空指针。自己调试找空指针。这段时间怎么那么多FX2收数据的,真是怪了。

出0入0汤圆

 楼主| 发表于 2012-4-22 22:18:30 | 显示全部楼层
wye11083 发表于 2012-4-22 12:47
没见过0xc0000005吗?空指针。自己调试找空指针。这段时间怎么那么多FX2收数据的,真是怪了。 ...

嘿嘿,可能好多都是做毕设吧

出0入0汤圆

发表于 2012-4-22 22:32:46 | 显示全部楼层
真是奇怪了,USB2.0的方案现在总是用68013,台湾的好多USB-IDE就是不见资料,IDE也是并口。

出0入0汤圆

发表于 2018-3-22 16:01:40 | 显示全部楼层
楼主这个是调用的哪个库文件
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 17:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表