📄 cpld_dmadlg.cpp
字号:
// 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 + -