wyzjjyx 发表于 2012-4-22 11:20:31

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

学习了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;                //Êý¾Ý»º³åÇø
        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;
        ZeroMemory(buf, 2);
        LONG buflen =2;
        buf=0xAB;
        buf=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 TRUEunless 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;
        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;
    ZeroMemory(buf, 2);
    LONG buflen =2;
        buf=0xAB;
        buf=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,"ÕýÔÚ´«Ê䣡");
                }
        }
}
比较急哦,希望高手们帮帮我,谢谢了。

wye11083 发表于 2012-4-22 12:47:21

没见过0xc0000005吗?空指针。自己调试找空指针。这段时间怎么那么多FX2收数据的,真是怪了。

wyzjjyx 发表于 2012-4-22 22:18:30

wye11083 发表于 2012-4-22 12:47 static/image/common/back.gif
没见过0xc0000005吗?空指针。自己调试找空指针。这段时间怎么那么多FX2收数据的,真是怪了。 ...

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

NJ8888 发表于 2012-4-22 22:32:46

真是奇怪了,USB2.0的方案现在总是用68013,台湾的好多USB-IDE就是不见资料,IDE也是并口。

guo407214944 发表于 2018-3-22 16:01:40

楼主这个是调用的哪个库文件
页: [1]
查看完整版本: FPGA+cy7c68013A数据采集 上位机问题