📄 cpld_dmadlg.cpp
字号:
'功能: 设置DMA传输模式?
'入口参数:
'IntIFCLK True表示使用模块内部的同步时钟;False表示使用外部逻辑的同步时钟。
'IntClk48MHz True表示模块内部的同步时钟为48MHz;False表示模块内部的同步时钟30MHz。
'IntClkOutEn True表示可以输出模块内部的同步时钟;False表示不输出。
'IFCLKInvert True表示翻转模块内部的同步时钟;False表示不翻转。
'AsyncFIFO True表示使用同步DMA传输模式,False表示使用异步DMA传输模式。
'OnePulsEarly True表示同步DMA传输时,FIFO标志提前一个时钟周期指示,以配合外部逻辑工作。
DoEvents
/*/
}
else
{
MessageBox("设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
//while (bl_Step)
//{
if (bl_ChangeIFC)
{
USB20C_EndDMA();
if (USB20C_SetIFCFG(IFCNumberType.bl_Local,IFCNumberType.bl_48HMz,IFCNumberType.bl_Out,IFCNumberType.bl_FanXiang,IFCNumberType.bl_FIFO,IFCNumberType.bl_One)==false)
{
MessageBox("设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
USB20C_StartDMARead();
USB20C_EndDMA();
USB20C_Output(0, 0);
USB20C_Output(2, 3);
USB20C_Output(1, 0);
bl_ChangeIFC=false;
}
if (USB20C_StartDMARead()==false)
{
MessageBox("读DMA时出错(USB20C_StartDMARead)", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
if (USB20C_DMARead(&Buf[0], dataSize,&DataRead[0], 4000))
{
//int im;
//for(im=0;im<100;im++)
//{
// itoa(Buf[im],a,10);
// m_List.AddString(a);
//}
//MessageBox("Error DMARead", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
}
else
{
MessageBox("读DMA时出错(USB20C_DMARead)", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
//bl_Step=false;
}
if (dataSize == DataRead[0])
{
sumCount += DataRead[0];
}
/*/ gcvt(sumCount,a,10);
m_Edit1.SetSel(0,-1);
m_Edit1.ReplaceSel(a);/*/
}
void CCPLD_DMADlg::OnCmdStep()
{
/*/ 停止 DMA 读写
------------------------/*/
bl_Step=false;
sumCount=0;
KillTimer(1);
but_Enable(true);
int ip;
for (ip=0;ip<41;ip++)
{
showSize[ip]=0;
}
}
void CCPLD_DMADlg::OnCmdReadDMA()
{
/*/ 开始读取DMA
-----------------------/*/
bl_Step=true;
bl_ChangeIFC=true;
iNext=0;
/*/------------------------
启动读线程
------------------------/*/
ClearText();
HWND hWnd=GetSafeHwnd();
AfxBeginThread(Run_ReadThread,hWnd,THREAD_PRIORITY_NORMAL);
SetTimer(1,100,NULL);
but_Enable(false);
}
UINT Run_ReadThread(LPVOID param)
{
/*/----------------------------------
这是读 (CPLD) DMA 的线程涵数
----------------------------------/*/
int dataSize;
int DataRead[1];
byte Buf[65536];
dataSize = 65536;
if (USB20C_EndDMA()==false)
{
::MessageBox(NULL,"结束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))
{
/* 这里是SetIFCFG的函数定义,可以参照改动参数
----------------------------------------------
'function USB20C_SetIFCFG(IntIFCLK, IntClk48MHz, IntClkOutEn, IFCLKInvert, AsyncFIFO, OnePulseEarly :Boolean): Boolean; StdCall;
'功能: 设置DMA传输模式?
'入口参数:
'IntIFCLK True表示使用模块内部的同步时钟;False表示使用外部逻辑的同步时钟。
'IntClk48MHz True表示模块内部的同步时钟为48MHz;False表示模块内部的同步时钟30MHz。
'IntClkOutEn True表示可以输出模块内部的同步时钟;False表示不输出。
'IFCLKInvert True表示翻转模块内部的同步时钟;False表示不翻转。
'AsyncFIFO True表示使用同步DMA传输模式,False表示使用异步DMA传输模式。 'OnePulsEarly True表示同步DMA传输时,FIFO标志提前一个时钟周期指示,以配合外部逻辑工作。
/*/
}
else
{
::MessageBox(NULL,"设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
while (bl_Step)
{
if (bl_ChangeIFC)
{
USB20C_EndDMA();
if (USB20C_SetIFCFG(IFCNumberType.bl_Local,IFCNumberType.bl_48HMz,IFCNumberType.bl_Out,IFCNumberType.bl_FanXiang,IFCNumberType.bl_FIFO,IFCNumberType.bl_One)==false)
{
::MessageBox(NULL,"设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
USB20C_StartDMARead();
USB20C_EndDMA();
USB20C_StartDMARead();
USB20C_Output(0, 0);
USB20C_Output(2, 3);
USB20C_Output(1, 0);
bl_ChangeIFC=false;
}
if (USB20C_StartDMARead()==false)
{
::MessageBox(NULL,"读DMA时出错(USB20C_StartDMARead)", "USB20C_读DMA",MB_ICONINFORMATION|MB_OK);
bl_Step=false;
}
if (USB20C_DMARead(&Buf[1], dataSize,&DataRead[1], 2000))
{
/*/在这里测试输出100个Buf[....]返回值
全部输出Buf[...]的值需要很长的时间
-----------------------------------
int im;
for(im=0;im<100;im++)
{
itoa(Buf[im],a,10);
m_List.AddString(a);
}
/*/
}
else
{
::MessageBox(NULL,"读DMA时出错(USB20C_DMARead)", "USB20C_读DMA",MB_ICONINFORMATION|MB_OK);
bl_Step=false;
}
if (dataSize == DataRead[1])
{
sumCount += DataRead[1];
}
}
/*/------------------------------
如果用户停止读写则结束当前线程
------------------------------/*/
USB20C_EndDMA();
AfxEndThread(1);
return 0;
}
void CCPLD_DMADlg::OnTimer(UINT nIDEvent)
{
/*/---------------------------------
从Timer事件中接收读写CPLD DMA中的数据
---------------------------------/*/
CString str[50];
temp="已传输字节 ";
strcpy(strChar,temp);
_i64toa(sumCount,convent,10);
strcat(strChar,convent);
m_Edit2.SetSel(0,-1);
m_Edit2.ReplaceSel(strChar);
//-----------------------------------
int i_Arr;
int intSecond;
int intLv;
for(i_Arr=0;i_Arr<vToCount;i_Arr++)
{
showSize[i_Arr]=showSize[i_Arr+1];
}
showSize[vToCount-1]=sumCount;
iNext=iNext+1;
intSecond=((iNext*100)/1000);
intLv=(showSize[vToCount-1]-showSize[0])/(((vToCount-1)*100)/1000);
temp="已传输(秒) ";
strcpy(strChar,temp);
itoa(intSecond,convent,10);
strcat(strChar,convent);
m_Edit1.SetSel(0,-1);
m_Edit1.ReplaceSel(strChar);
temp="传输速率(秒/字节) ";
strcpy(strChar,temp);
itoa(intLv,convent,10);
strcat(strChar,convent);
m_Edit3.SetSel(0,-1);
m_Edit3.ReplaceSel(strChar);
CDialog::OnTimer(nIDEvent);
}
UINT Run_WriteThread(LPVOID param)
{
/*/----------------------------------
这是读 (CPLD) DMA 的线程涵数
----------------------------------/*/
int dataSize;
int DataRead[1];
//byte Buf[65536];
byte Buf[47];
dataSize = 65536;
//BYTE ArrChar[100]
if (USB20C_EndDMA()==false)
{
::MessageBox(NULL,"结束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))
{
/* 这里是SetIFCFG的函数定义,可以参照改动参数
----------------------------------------------
'function USB20C_SetIFCFG(IntIFCLK, IntClk48MHz, IntClkOutEn, IFCLKInvert, AsyncFIFO, OnePulseEarly :Boolean): Boolean; StdCall;
'功能: 设置DMA传输模式?
'入口参数:
'IntIFCLK True表示使用模块内部的同步时钟;False表示使用外部逻辑的同步时钟。
'IntClk48MHz True表示模块内部的同步时钟为48MHz;False表示模块内部的同步时钟30MHz。
'IntClkOutEn True表示可以输出模块内部的同步时钟;False表示不输出。
'IFCLKInvert True表示翻转模块内部的同步时钟;False表示不翻转。
'AsyncFIFO True表示使用同步DMA传输模式,False表示使用异步DMA传输模式。
'OnePulsEarly True表示同步DMA传输时,FIFO标志提前一个时钟周期指示,以配合外部逻辑工作。
/*/
}
else
{
::MessageBox(NULL,"设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
while (bl_Step)
{
if (bl_ChangeIFC)
{
USB20C_EndDMA();
if (USB20C_SetIFCFG(IFCNumberType.bl_Local,IFCNumberType.bl_48HMz,IFCNumberType.bl_Out,IFCNumberType.bl_FanXiang,IFCNumberType.bl_FIFO,IFCNumberType.bl_One)==false)
{
::MessageBox(NULL,"设置IFC时出错。", "USB20C_读DMA",MB_ICONINFORMATION+MB_OK);
bl_Step=false;
}
USB20C_StartDMAWrite();
bl_ChangeIFC=false;
}
if (USB20C_StartDMAWrite()==false)
{
::MessageBox(NULL,"读DMA时出错(USB20C_StartDMARead)", "USB20C_读DMA",MB_ICONINFORMATION|MB_OK);
bl_Step=false;
}
int ip;
for(ip=0;ip>48;ip++)
{
Buf[ip]=0x2;
}
if (USB20C_DMAWrite(&Buf[0], dataSize,&DataRead[0], 2000))
{
/*/在这里测试输出100个Buf[....]返回值
//全部输出Buf[...]的值需要很长的时间
-----------------------------------
int im;
for(im=0;im<100;im++)
{
itoa(Buf[im],a,10);
m_List.AddString(a);
}-----------------------------------
/*/
}
else
{
::MessageBox(NULL,"读DMA时出错(USB20C_DMARead)", "USB20C_读DMA",MB_ICONINFORMATION|MB_OK);
bl_Step=false;
}
if (dataSize == DataRead[1])
{
sumCount += DataRead[1];
}
}
USB20C_EndDMA();
AfxEndThread(1);
return 1;
}
void CCPLD_DMADlg::OnCmdWriteDMA()
{
/*/ 开始写DMA
-----------------------/*/
bl_Step=true;
bl_ChangeIFC=true;
iNext=0;
/*/------------------------
启动写线程
------------------------/*/
ClearText();
HWND hWnd=GetSafeHwnd();
AfxBeginThread(Run_WriteThread,hWnd,THREAD_PRIORITY_NORMAL);
SetTimer(1,100,NULL);
but_Enable(false);
}
void CCPLD_DMADlg::OnClose()
{
OncmdExit();
CDialog::OnClose();
}
void CCPLD_DMADlg::ClearText()
{
m_Edit1.SetSel(0,-1);
m_Edit1.ReplaceSel("");
m_Edit2.SetSel(0,-1);
m_Edit2.ReplaceSel("");
m_Edit3.SetSel(0,-1);
m_Edit3.ReplaceSel("");
}
void CCPLD_DMADlg::OnNEW_ReadDMA()
{
// TODO: Add your control notification handler code here
long dataSize;
long DataRead;
BYTE buf[1024];
sumCount = 0;
dataSize = 1024;
USB20C_EndDMA();
USB20C_SetIFCFG(true,false,true,false,true,false);
USB20C_EndDMA();
USB20C_SetIFCFG(true,false,true,false,true,false);
USB20C_StartDMARead();
USB20C_EndDMA();
USB20C_StartDMARead();
USB20C_EndDMA();
USB20C_StartDMARead();
USB20C_DMARead(&buf[1], dataSize, &DataRead, 2000);
}
void CCPLD_DMADlg::OnnewWrite_DMA()
{
// TODO: Add your control notification handler code here
int i;
int dataSize;
int DataRead;
BYTE Buf[47];
int iu=0;
sumCount = 0;
dataSize = 48;
USB20C_EndDMA();
USB20C_SetIFCFG(true,false,true,false,true,false);
USB20C_StartDMAWrite();
USB20C_EndDMA();
USB20C_SetIFCFG(true,false,true,false,true,false);
USB20C_StartDMAWrite();
USB20C_StartDMAWrite();
for (int ip=48;ip<96;ip++)
{
iu=iu+1;
Buf[iu] =ip;
}
USB20C_DMAWrite(&Buf[1], dataSize, &DataRead, 2000);
// For i = 1 To 100
// Debug.Print Buf(i)
// Next i
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -