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

📄 spi.cpp

📁 NI公司的PCI-6120四通道电压测量卡控制程序。该程序主要用VC实现对PCI-6120测量卡控制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "SPI.h"
//#include "Dlportio.h"


//UCHAR	 DlPortReadPortUchar(IN ULONG Port);
//VOID	 DlPortWritePortUchar(IN ULONG Port, IN UCHAR Value);
//#define		SET_PORT_BIT(TMP, BIT)	{(TMP) |= (BIT);	DlPortWritePortUchar(PORT_ADDR, TMP);}
//#define		CLR_PORT_BIT(TMP, BIT)	{(TMP) &= (~BIT);	DlPortWritePortUchar(PORT_ADDR, TMP);}
#define		SET_DATA_BIT(TMP, BIT)	{(TMP) |= (BIT);}
#define		CLR_DATA_BIT(TMP, BIT)	{(TMP) &= (~BIT);}

//short	_stdcall Inp32(short PortAddress);
//void	_stdcall Out32(short PortAddress, short data);

//#define		SET_PORT_BIT(TMP, BIT)	{(TMP)= (BYTE)Inp32(PORT_ADDR);  (TMP) |= (BIT);	Out32(PORT_ADDR, TMP);}
//#define		CLR_PORT_BIT(TMP, BIT)	{(TMP)= (BYTE)Inp32(PORT_ADDR);  (TMP) &= (~BIT);	Out32(PORT_ADDR, TMP);}

#define		SET_PORT_BIT(TMP, BIT)	{(TMP) |= (BIT);	Out32(PORT_ADDR, TMP);}
#define		CLR_PORT_BIT(TMP, BIT)	{(TMP) &= (~BIT);	Out32(PORT_ADDR, TMP);}

BYTE byteBIT[8]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

inline   unsigned   __int64   GetCycleCount()   
{   
    __asm   _emit   0x0F   
    __asm   _emit   0x31   
} 

LONGLONG wait_ns2(int ns, LONGLONG freq)
{
	LONGLONG start= (LONGLONG)GetCycleCount(), end;
	do{
		end= (LONGLONG)GetCycleCount();
	}while((end-start)*NSECOND/(freq*1.0)<ns);

	return end-start;
}

LONGLONG wait_ns(int ns)
{
	LARGE_INTEGER	lpFrequency;			lpFrequency.QuadPart= 0;
	LARGE_INTEGER	lpPerformanceCount;		lpPerformanceCount.QuadPart= 0;

	LONGLONG	NSstartTime=0;
	LONGLONG	useTime= 0;
	if(!QueryPerformanceFrequency( &lpFrequency))	// address of current frequency
	{
		AfxMessageBox("Can't use QueryperformanceFrequency"); 
		return -1;
	};   

	QueryPerformanceCounter( &lpPerformanceCount);   // pointer to counter value
	NSstartTime= lpPerformanceCount.QuadPart;
	while(useTime<ns)
	{
		QueryPerformanceCounter( &lpPerformanceCount);   // pointer to counter value
		useTime=(NSECOND)*(lpPerformanceCount.QuadPart - NSstartTime)/(lpFrequency.QuadPart*1.0);
	}
	return useTime;
}

LONGLONG wait_us(int us)
{
	LARGE_INTEGER	lpFrequency;			//lpFrequency.QuadPart= 0;
	LARGE_INTEGER	lpPerformanceCount;		//lpPerformanceCount.QuadPart= 0;

//	LONGLONG	NSstartTime=0;
	if(!QueryPerformanceFrequency( &lpFrequency))	// address of current frequency
	{
		AfxMessageBox("Can't use QueryperformanceFrequency"); 
		return -1;
	};   
	//LONGLONG	useTime= 0;
	LONGLONG	waitCount= lpFrequency.QuadPart * us/USECOND;
	QueryPerformanceCounter( &lpPerformanceCount);   // pointer to counter value
	LONGLONG  NSstartTime= lpPerformanceCount.QuadPart;
	//while(useTime<us)
	do
	{
		QueryPerformanceCounter( &lpPerformanceCount);   // pointer to counter value
		//useTime=(USECOND)*(lpPerformanceCount.QuadPart - NSstartTime)/(lpFrequency.QuadPart*1.0);
		//if((USECOND)*(lpPerformanceCount.QuadPart - NSstartTime)/(lpFrequency.QuadPart*1.0)>us)
	}while((waitCount+NSstartTime) > lpPerformanceCount.QuadPart);
//	return useTime;
//	return lpPerformanceCount.QuadPart;
	return 0;
}

LONGLONG cpuFrequent()
{
  __int64   sc0   =   GetCycleCount();   
  Sleep(1000);   
  __int64   sc1   =   GetCycleCount();   
  __int64  freq   =   (sc1-sc0);   

//  printf("cpu: %u MHz\n", freq/1000000);
//  printf("1/freq: %0.12lf \n", 1/(freq*1.0));
  return freq;
  //printf("26Mhz mean : %.10lf ns\n", 1/26000000.0*1000000000);
}

unsigned long cpuFre()
{
	unsigned long   tick1,tick2;   
	_asm   rdtsc   
	_asm   mov   tick1,eax   
	Sleep(1000);   
	_asm   rdtsc   
	_asm   mov   tick2,eax   
	//int   freq=(tick2-tick1)/1000000;
	//return freq;
	return (tick2-tick1);
}

///////////////////////////////////// SPI_A:  PIN2~PIN5////////////////////////
void spi_Read(BYTE* data)
{	
	BYTE tmp= 0x00, ret= 0x00;
	
	//CS
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);				//WAIT 20ns	
	//CLK
	SET_PORT_BIT(tmp, SPI_CLK);		//SPI_CLK= 1;

	//RECEIVE FROM MISO
	for(BYTE i=0; i<8; i++)
	{
		CLR_PORT_BIT(tmp, SPI_CLK);		//SPI_CLK= 0;
		ret	= (BYTE)Inp32(PORT_ADDR);	
		if((ret&SPI_MISO)!=0x00)	SET_DATA_BIT(*data, byteBIT[7-i])	//first MBS, end LBS
		else	CLR_DATA_BIT(*data, byteBIT[7-i])
		wait_ns(15);				//WAIT 15ns
		SET_PORT_BIT(ret, SPI_CLK);	//SPI_CLK= 1;
	}
}

void spi_Write(BYTE data)
{
	//CString msg; msg.Format("0x%x", data);	AfxMessageBox(msg);
	BYTE tmp= 0x00, ret= 0x00;
	
	//CS
//	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
//	wait_ns(20);				//WAIT 20ns	

	//CLK
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CLK);			//SPI_CLK= 0;

	//WRITE MOSI
	for(BYTE i=0; i<8; i++)
	{
		//ret	= DlPortReadPortUchar(PORT_ADDR);	
		if((data&(byteBIT[7-i]))!=0x00)		SET_PORT_BIT(tmp, SPI_MOSI)
		else	CLR_PORT_BIT(tmp, SPI_MOSI)

		SET_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 1;

		wait_ns(15);				//WAIT 15ns
		CLR_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 0;
	}
	
}

void spi_ReadWrite(BYTE writeByte, BYTE* readByte)
{
	BYTE tmp= 0x00, ret= 0x00;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);				//WAIT 20ns	
	//CLK
	CLR_PORT_BIT(tmp, SPI_CLK);			//SPI_CLK= 0;
	//WRITE MOSI
	for(BYTE i=0; i<8; i++)
	{
		SET_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 1;
		//ret	= DlPortReadPortUchar(PORT_ADDR);	
		//WRITE
		if((writeByte&(byteBIT[7-i]))!=0x00)	SET_PORT_BIT(tmp, SPI_MOSI);
		wait_ns(15);				//WAIT 15ns
		CLR_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 0;
		//READ
		ret	= (BYTE)Inp32(PORT_ADDR);
		if((ret&SPI_MISO)!=0x00)				SET_DATA_BIT(*readByte, byteBIT[7-i]);	//first MBS, end LBS
		wait_ns(15);				//WAIT 15ns
	}
}

void spi_CLR_CE()
{
	BYTE tmp= 0x00;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);
}

void spi_SET_CE()
{
	BYTE tmp= 0x00;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 1;
	wait_ns(20);
}

void CLR_RES()
{
	BYTE tmp= 0x00;
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, RES);		//RESET= 0;
}

void SET_RES()
{
	BYTE tmp= 0x00;
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, RES);		//RESET= 1;
}

int SPI_Write32(DWORD writeData)
{
	//CString msg; msg.Format("0x%x", writeData);	AfxMessageBox(msg);
	BYTE temp_byte[4]={0};

	temp_byte[0] = (BYTE)(writeData & 0x000000ff);
	temp_byte[1] = (BYTE)((writeData >> 8) & 0x000000ff);
	temp_byte[2] = (BYTE)((writeData >> 16) & 0x000000ff);
	temp_byte[3] = (BYTE)((writeData >> 24) & 0x000000ff);
	
	BYTE tmp= 0x00, ret= 0x00;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);

	//write data 32bits
	for(int i= 3; i>=0; i--)
	{
		//CString msg; msg.Format("0x%x", temp_byte[i]);	AfxMessageBox(msg);
		spi_Write(temp_byte[i]);
	}

	wait_ns(20);
	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 1;

	return 0;
}

int SPI_Write32_New(DWORD writeData)
{
	//CString msg; msg.Format("0x%x", writeData);	AfxMessageBox(msg);
	BYTE temp_byte[4]={0};

	temp_byte[0] = (BYTE)(writeData & 0x000000ff);
	temp_byte[1] = (BYTE)((writeData >> 8) & 0x000000ff);
	temp_byte[2] = (BYTE)((writeData >> 16) & 0x000000ff);
	temp_byte[3] = (BYTE)((writeData >> 24) & 0x000000ff);
	
	BYTE tmp= 0x00, ret= 0x00;

	//CS
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);

	//write data 32bits
	//CLK
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CLK);			//SPI_CLK= 0;
	for(int byte= 3; byte>=0; byte--)
	{
		//CString msg; msg.Format("0x%x", temp_byte[i]);	AfxMessageBox(msg);
		//spi_Write(temp_byte[i]);

		//WRITE MOSI
		for(BYTE i=0; i<8; i++)
		{
			//ret	= DlPortReadPortUchar(PORT_ADDR);	
			if((temp_byte[byte]&(byteBIT[7-i]))!=0x00)		SET_PORT_BIT(tmp, SPI_MOSI)
			else	CLR_PORT_BIT(tmp, SPI_MOSI)
	
			tmp= (BYTE)Inp32(PORT_ADDR);
			SET_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 1;

			wait_ns(15);				//WAIT 15ns

			tmp= (BYTE)Inp32(PORT_ADDR);
			CLR_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 0;
		}

	}

	//CS
	wait_ns(20);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 1;

	return 0;
}

int SPI_Read32(DWORD* readData)
{
	BYTE temp_byte[4]={0};
	BYTE tmp= 0x00, ret= 0x00;	

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);		
	//read data 32bits
	for(BYTE i= 0; i<4; i++)
	{
		spi_Read(&temp_byte[i]);
	}

	wait_ns(20);
	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 1;

	(*readData) = 0x00000000;
	(*readData) |= (DWORD)temp_byte[0];
	(*readData) |= ((DWORD)temp_byte[1])<<8;						
	(*readData) |= ((DWORD)temp_byte[2])<<16;	
	(*readData) |= ((DWORD)temp_byte[3])<<24;	

	return 0;
}

DWORD SPI_Read32_New()		//read MISO modify to 0x379
{
	BYTE temp_byte[4]={0};
	BYTE tmp= 0x00, ret= 0x00;	

	//CS
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 0;
	wait_ns(20);		
	//read data 32bits
	//CLK	
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CLK);		//SPI_CLK= 1;
	for(BYTE byte= 0; byte<4; byte++)
	{
		//spi_Read(&temp_byte[i]);

		//RECEIVE FROM MISO
		for(BYTE i=0; i<8; i++)
		{
			CLR_PORT_BIT(tmp, SPI_CLK);		//SPI_CLK= 0;
			ret	= (BYTE)Inp32(PORT_ADDR+1);			//MISO, at 0x379
			if((ret&SPI_MISO)!=0x00)	SET_DATA_BIT(temp_byte[byte], byteBIT[7-i])	//first MBS, end LBS
			else	CLR_DATA_BIT(temp_byte[byte], byteBIT[7-i])
			//wait_ns(15);				//WAIT 15ns
			tmp= (BYTE)Inp32(PORT_ADDR);
			SET_PORT_BIT(tmp, SPI_CLK);	//SPI_CLK= 1;
		}
	}

	//CS
	wait_ns(20);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, SPI_CE);		//SPI_CE= 1;

	DWORD readData = 0;
	readData |= (DWORD)temp_byte[0];
	readData |= ((DWORD)temp_byte[1])<<8;						
	readData |= ((DWORD)temp_byte[2])<<16;	
	readData |= ((DWORD)temp_byte[3])<<24;	

	return (readData);
}
///////////////////////////////////// SPI_B:  PIN6~PIN9////////////////////////
void B_SPI_CLR_CE()
{
	BYTE tmp= 0x0;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	CLR_PORT_BIT(tmp, B_SPI_CE);		//SPI_CE= 0;
	wait_ns(20);
}

void B_SPI_SET_CE()
{
	BYTE tmp= 0x00;

	//CS
	//tmp= DlPortReadPortUchar(PORT_ADDR);
	tmp= (BYTE)Inp32(PORT_ADDR);
	SET_PORT_BIT(tmp, B_SPI_CE);		//SPI_CE= 1;
	wait_ns(20);
}

void B_CLR_RES()
{
	BYTE tmp= 0x00;
	//tmp= DlPortReadPortUchar(PORT_ADDR);

⌨️ 快捷键说明

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