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

📄 cpld_dmadlg.cpp

📁 开发USB2.0接口产品的程序设计例程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
           '功能:           设置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 + -