⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpld_dmadlg.cpp

📁 开发USB2.0接口产品的程序设计例程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// CPLD_DMADlg.cpp : implementation file
//

#include "stdafx.h"
#include "CPLD_DMA.h"
#include "CPLD_DMADlg.h"
#include "USB20C.H"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

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

//------------------------------------
//本模块所用的公用变量
//------------------------------------
int      gApi;
char     *temp;
char     str[10];
int      DriverCount;
char     a[5];
char     convent[50];
char     strChar[100];
CString  strText;
BOOL     bl_Init=false;

BOOL     bl_ChangeIFC=false;
BOOL     bl_Step=false;
long     showSize[40];
int      vToCount=41;
int      iNext;
//-------------------------------------
__int64    sumCount;
//-------------------------------------
//读写线程
UINT Run_ReadThread(LPVOID param);
UINT Run_WriteThread(LPVOID param);
//-------------------------------------
//SetIFCFG(参数1..6)
struct IFCNumber
{
   BOOL     bl_Local;         // 1 使用内部同步时钟=True
   BOOL     bl_48HMz;         // 2 使用内部30HMz
   BOOL     bl_Out;           // 3 输出
   BOOL     bl_FanXiang;      // 4 不翻转   
   BOOL     bl_FIFO;          // 5 同步DMA  
   BOOL     bl_One;           // 6 FIFO提前一个周期
}IFCNumberType;

//-------------------------------------
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()

/////////////////////////////////////////////////////////////////////////////
// CCPLD_DMADlg dialog

CCPLD_DMADlg::CCPLD_DMADlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCPLD_DMADlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCPLD_DMADlg)
		// 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(IDI_ICON1);
}

void CCPLD_DMADlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCPLD_DMADlg)
	DDX_Control(pDX, IDC_LIST1, m_List);
	DDX_Control(pDX, IDC_CHECK3, cheFIFO);
	DDX_Control(pDX, IDC_CHECK2, cheFanXiang);
	DDX_Control(pDX, IDC_CHECK1, che48HMz);
	DDX_Control(pDX, IDC_EDIT3, m_Edit3);
	DDX_Control(pDX, IDC_EDIT2, m_Edit2);
	DDX_Control(pDX, IDC_EDIT1, m_Edit1);
	DDX_Control(pDX, IDC_BUTTON1, cmdReadDMA);
	DDX_Control(pDX, IDC_BUTTON2, cmdWriteDMA);
	DDX_Control(pDX, IDC_BUTTON3, cmdStep);
	DDX_Control(pDX, IDC_BUTTON4, cmdExit);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCPLD_DMADlg, CDialog)
	//{{AFX_MSG_MAP(CCPLD_DMADlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON4, OncmdExit)
	ON_BN_CLICKED(IDC_CHECK1, Onche48HMz)
	ON_BN_CLICKED(IDC_CHECK2, OncheFanXiang)
	ON_BN_CLICKED(IDC_CHECK3, OncheFIFO)
	ON_BN_CLICKED(IDC_BUTTON3, OnCmdStep)
	ON_BN_CLICKED(IDC_BUTTON1, OnCmdReadDMA)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON2, OnCmdWriteDMA)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BUTTON5, OnNEW_ReadDMA)
	ON_BN_CLICKED(IDC_BUTTON6, OnnewWrite_DMA)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCPLD_DMADlg message handlers

BOOL CCPLD_DMADlg::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

	/*/------------------------------------
	USB20C 演示 读写CPLD DMA 从这里开始....
	首先加载 USB20C.DLL 动态库 到当前缓冲.
	------------------------------------/*/
	
	  USB20C_DLLInit();
	  gApi=USB20C_EnumDeviceCount();

      itoa(gApi,a,10);
	  strcat(strChar,"函数: USB20C_EnumDeviceCount  返回值: ");
	  strcat(strChar,a);
	  
	  if (gApi>=1)
	  {
		  temp=" 枚举设备成功。";
		  strcat(strChar,temp);
		  m_List.AddString(strChar);
	  }
	  else
	  {
		  temp=" 枚举设备失败。";
		  strcat(strChar,temp);
		  m_List.AddString(strChar);
		 
		  //当没有设备连接时使读写DMA功能不可操作
		  Enable_But(false);
	  }

	  gApi=USB20C_Init(0, 1);
	  itoa(gApi,a,10);
	  strcpy(strChar,"函数: USB20C_Init  返回值: ");
	  strcat(strChar,a);

	  switch (gApi)
	  {
	  case 0:
		  temp=" 不能初始化设备。";
		  strcat(strChar,temp);
		  m_List.AddString(strChar);

		  //当没有设备连接时使读写DMA功能不可操作
		  Enable_But(false);
		  break;
      case 1:
		  temp=" 模块工作在全速模式(USB1.1)。";
		  strcat(strChar,temp);
		  m_List.AddString(strChar);
		  break;
	  case 2:
		  temp=" 模块工作在高速模式(USB2.0)。";
		  strcat(strChar,temp);
		  m_List.AddString(strChar);
         break;
	  }
      
	  //------------------------------------
	  /*/ 初始化设置m_Edit1
	  --------------------------/*/
	  m_Edit1.SetSel(0,-1);
	  strText="已传输(秒)";
      m_Edit1.ReplaceSel(strText);

      /*/初始化设置m_Edit2
	  -------------------------/*/
	  m_Edit2.SetSel(0,-1);
	  strText="传输(字节)";
      m_Edit2.ReplaceSel(strText);

      /*/ 初始化设置m_Edit3
      -------------------------/*/
	  m_Edit3.SetSel(0,-1);
	  strText="传输速率(秒/字节)";
      m_Edit3.ReplaceSel(strText);
    
	  /*/--------------------------
	  初始化SetIFCFG函数参数 ---/*/

	  Init_SetIFCFG();
	  //--------------------------

	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CCPLD_DMADlg::Init_SetIFCFG()
{
	/*/初始化SetIFCFG函数参数
	----------------------------/*/
	
	IFCNumberType.bl_Local =true;    //用内部的同步时钟(true 内部同步时钟;false外部同步时钟)
    IFCNumberType.bl_48HMz=false;     //使用内部时钟(true 同步时钟48HMz;false 同步时钟30HMz)
	IFCNumberType.bl_Out=true;       //允许输出(true输出;false不输出)
	IFCNumberType.bl_FanXiang=false; //不翻转(true翻转;false不翻转)
	IFCNumberType.bl_FIFO=false;     //使用DMA传输(true异步;false同步)
	IFCNumberType.bl_One=false;      //同步DMA传输时,FIFO标志提前一个时钟周期

}
void CCPLD_DMADlg::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 CCPLD_DMADlg::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 CCPLD_DMADlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CCPLD_DMADlg::OncmdExit() 
{
	//终止当前读写 DMA 线程
   try
   {
	bl_Step=false;
	KillTimer(1);
    USB20C_EndDMA();
    //关闭窗口时断开与设备的连接
    USB20C_Done();
    
	//关闭窗口时释放USB20C.DLL动态连接库
    USB20C_DLLDone();

	//OnCancel();
	CDialog::OnCancel();
   }
   catch (...)
	{
    MessageBox(" Close Error!!!!!!","UUUUUUUU");
	}
}
void CCPLD_DMADlg::Enable_But(BOOL blTrue)
{
	/*/------------------------------
	如果系统初始化失败,禁用读写键
	-------------------------------/*/
    cmdReadDMA.EnableWindow(blTrue);
	cmdWriteDMA.EnableWindow(blTrue);
	cmdStep.EnableWindow(blTrue);
}
void CCPLD_DMADlg::but_Enable(BOOL blTrue)
{
    /*/------------------------------
	开始读时禁用写键,反之禁用读键
	-------------------------------/*/
	cmdReadDMA.EnableWindow(blTrue);
	cmdWriteDMA.EnableWindow(blTrue);
}

void CCPLD_DMADlg::Onche48HMz() 
{
	/*/---------------------------------------
	选择使用48HMz内部时钟时改变bl_48HMz标识
    ---------------------------------------/*/

	CButton *p;
	p=(CButton*) GetDlgItem(IDC_CHECK1);

	if(p->GetCheck())
	{
		
		IFCNumberType.bl_48HMz=true;
		bl_ChangeIFC=true;
	}
	else
	{
		
		IFCNumberType.bl_48HMz=false;
		bl_ChangeIFC=true;
	}
}

void CCPLD_DMADlg::OncheFanXiang() 
{
	/*/-----------------------------------------
	选择使用同步时钟反向时设置bl_FanXing标示
    -----------------------------------------/*/
	CButton *p;
	p=(CButton*) GetDlgItem(IDC_CHECK2);

	if(p->GetCheck())
	{
		
		IFCNumberType.bl_FanXiang=true;
		bl_ChangeIFC=true;
	}
	else
	{
		IFCNumberType.bl_FanXiang=false;
		bl_ChangeIFC=true;
	}
}

void CCPLD_DMADlg::OncheFIFO() 
{
    /*/---------------------------------------------
	选择使用FIFOFlag提前一个周期时改变bl_FIFO标示
    --------------------------------------------/*/
	CButton *p;
	p=(CButton *) GetDlgItem(IDC_CHECK3);
	if(p->GetCheck())
	{
        IFCNumberType.bl_FIFO=true;
		bl_ChangeIFC=true;
	}
	else
	{
    	IFCNumberType.bl_FIFO=false;
		bl_ChangeIFC=true;
	}
}

CString CCPLD_DMADlg::ShowMsg(CString cText)
{
    m_Edit1.SetSel(0,-1);
   	m_Edit1.ReplaceSel(cText);
	return " ";
}
void CCPLD_DMADlg::CreateTimer()
{
	/*/---------------------------------
	设置计时器1,100ms
	---------------------------------/*/
	SetTimer(1,100,NULL);

} 
void CCPLD_DMADlg::DMARead()
{
    /*/----------------------------------
	这是读 DMA 的测试涵数属于临时
	----------------------------------/*/
	 int dataSize;
	 int DataRead[1];

     byte Buf[65536];
     dataSize = 65536;
    
     if (USB20C_EndDMA()==false)
	 {
        MessageBox("结束DMA出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
		bl_Step=false;
	 }
     
     if (USB20C_SetIFCFG(IFCNumberType.bl_Local,IFCNumberType.bl_48HMz,IFCNumberType.bl_Out,IFCNumberType.bl_FanXiang,IFCNumberType.bl_FIFO,IFCNumberType.bl_One))
	 {
		 /*
           'function USB20C_SetIFCFG(IntIFCLK, IntClk48MHz, IntClkOutEn, IFCLKInvert, AsyncFIFO, OnePulseEarly :Boolean): Boolean; StdCall;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -