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

📄 operationio.cpp

📁 用QQ2440板子的SPI功能实现了DA7631芯片功能的DA转换
💻 CPP
字号:
// OperationIo.cpp: implementation of the COperationIo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QQ2440DaExt.h"
#include "OperationIo.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


#define CLK400			    	1		// 1:400Mhz, 0:533MHz

#if CLK400
	#define HCLKDIV         	4
	#define PCLKDIV         	8
	#define PRESCALER			24
	#define S2440FCLK			(400000000)
#else		// CLK533
	#define HCLKDIV         	4
	#define PCLKDIV         	8						// P-clock (PCLK) divisor.
	#define S2440FCLK			(532800000)
	#define PRESCALER			32
#endif
						
#define S2440HCLK			(S2440FCLK / HCLKDIV)	// PCLK.=100000000 ,100M
#define S2440PCLK       	(S2440FCLK / PCLKDIV)	// PCLK.=50000000,50M
#define S2440UCLK       	S2440PCLK				//      =50M   
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COperationIo::COperationIo()
{
	InitGpioReg();
	SPI_InitAddrSPI();
}

COperationIo::~COperationIo()
{

}

BOOL COperationIo::InitGpioReg()
{
	v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pIOPRegs == NULL) 
	{
		DEBUGMSG (1,(TEXT("v_pIOPRegs is not allocated\n\r")));
		return FALSE;
	}
	if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE)) 
	{
		DEBUGMSG (1,(TEXT("v_pIOPRegs is not mapped\n\r")));
		return FALSE;
	}
	DEBUGMSG (1,(TEXT("v_pIOPRegs is mapped to %x\n\r"), v_pIOPRegs));
	//下面就可以使用v_pIOPRegs变量来操作GPIO了
	//		设置GPB的控制寄存器为全部Output
	//		v_pIOPRegs->rGPBCON=0x155555;
	//		设置GPB的数据寄存器输出高电平
	//		v_pIOPRegs->rGPBDAT=0x3FF;
	//		int a|=(1<<x) //X就是某位需要置1的数字,如第四位置1为: a|=(1<<4) 
	//		int b&=~(1<<x) //把某位置0 
	v_pIOPRegs->rGPFCON &=0xFFFFFF00;	//把GPF1,3,5,7的设置位清0,则将它们做为输入脚
	v_pIOPRegs->rGPFUP  = 0xff;     
	
	v_pIOPRegs->rGPGCON &=0xFFFFFCF0;//把GPF3,7 设为输入,4设为输出
	v_pIOPRegs->rGPGCON |=(1<<8);
	v_pIOPRegs->rGPGUP  = 0xffff;     // 

	return TRUE;
}

BOOL  COperationIo::InitSPI()
{
	if(!v_pIOPRegs || !v_pSSPregs)
	{
		return FALSE;
	}

	unsigned int pclk = S2440PCLK;  // s2440.h define
	// Set I/O is SPI interface
	// Config GPE12,13 is SPIMOSI0,SPICLK0
	v_pIOPRegs->rGPECON &= ~(0x0F << 24); 
	v_pIOPRegs->rGPECON |= (0x0A << 24);	
	// Config GPF1 is Master SPI CS       
		// Baudrate = PCLK/2/(Prescaler value + 1)
    // PCLK = 50Hz
    // Prescaler value = 0x18 = 24
    // Baudrate = 50000000/2/(24 + 1) = 1000000 = 1MHz
    // MCP41010 max clock frequency is 10MHz
	v_pSSPregs->rSPPRE0 = 0x18; //24
    v_pSSPregs->rSPCON0 = 0x1E;//

	v_pIOPRegs->rGPEUP &= ~(0x3<<12); //取消上拉	

	v_pIOPRegs->rGPFCON &= ~(0x03CC);                     
	v_pIOPRegs->rGPFCON |= 0x0144; //EINT1,EINT3,EINT4输出
	v_pIOPRegs->rGPFUP &= ~(0x1A); //取消上拉		

	SetDAC7631CS(1);// Initialize CS is high  
	
	v_pIOPRegs->rGPGCON &= ~(0x03<<6);   
	v_pIOPRegs->rGPGCON |= (0x01<<6);   
	v_pIOPRegs->rGPGUP &= ~(0x1<<3);

	SetDAC7631LOAD(1);
	SetDAC7631LDAC(0);	

	return TRUE;
}
BOOL COperationIo::SPI_InitAddrSPI(void)
{
	//////////////////////////////////////////////////////////////
	v_pSSPregs = (volatile SSPreg*)VirtualAlloc(0, sizeof(SSPreg), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pSSPregs == NULL) 
	{
		DEBUGMSG (1,(TEXT("v_pSSPregs is not allocated\n\r")));
		return FALSE;
	}
	if (!VirtualCopy((PVOID)v_pSSPregs, (PVOID)SSP_BASE, sizeof(SSPreg), PAGE_READWRITE|PAGE_NOCACHE)) 
	{
		DEBUGMSG (1,(TEXT("v_pSSPregs is not mapped\n\r")));
		return FALSE;
	}
	DEBUGMSG (1,(TEXT("v_pSSPregs is mapped to %x\n\r"), v_pSSPregs));
	return TRUE;
}
void COperationIo::SetDAC7631CS(unsigned char flag)
{
	if(flag==0)
	{
		v_pIOPRegs->rGPFDAT &= ~(0x1 << 1);	// Initialize CS is high  
	}
	else		
	{
		v_pIOPRegs->rGPFDAT |= (0x1 << 1);	// Initialize CS is high  
	}

}

void COperationIo::SetDAC7631LDAC(unsigned char flag)
{
	if(flag==0)
	{
		v_pIOPRegs->rGPGDAT &= ~(0x1 << 3);	
	}
	else		
	{
		v_pIOPRegs->rGPGDAT |= (0x1 << 3);	
	}
}

void COperationIo::SetDAC7631LOAD(unsigned char flag)
{
	if(flag==0)
	{
		v_pIOPRegs->rGPFDAT &= ~(0x1 << 4);	
	}
	else		
	{
		v_pIOPRegs->rGPFDAT |= (0x1 << 4);	
	}
}

void COperationIo::Delay(int loop)
{
	for(int i=0;i<loop;i++)
	{
		for(int j=0;j<10;j++);
	}
}

void COperationIo::SetDAC7631RST(unsigned char flag)
{
	if(flag==0)
		v_pIOPRegs->rGPFDAT &= ~(0x1 << 3);
	else
		v_pIOPRegs->rGPFDAT |= (0x1 << 3);
}

void COperationIo::InitDAC7631RST()
{
	v_pIOPRegs->rGPFDAT &= ~(0x1 << 3);	
	Delay(1);
	v_pIOPRegs->rGPFDAT |= (0x1 << 3);	
}	

void COperationIo::SetDAC7631SPI_MOSI(unsigned char flag)
{
	if(flag==0)
	{
		v_pIOPRegs->rGPEDAT &= ~(0x1<<12);
	}
	else
	{
		v_pIOPRegs->rGPEDAT |= (0x1<<12);
	}
}

void COperationIo::SetDAC7631SPI_CLK(unsigned char flag)
{
	if(flag==0)
	{
		v_pIOPRegs->rGPEDAT &= ~(0x1<<13);
	}
	else
	{
		v_pIOPRegs->rGPEDAT |= (0x1<<13);
	}
}

void COperationIo::SPI_Write(unsigned int ushortValue)
{	
	SetDAC7631SPI_CLK(1);
	SetDAC7631LDAC(0);
	SetDAC7631LOAD(1);//线收一次数据
	SetDAC7631CS(0);

	// Check the status of Transfer Ready flag(READY=1) ,and then write data to SPTDAT0
	unsigned char *ptrData = (unsigned char *)&ushortValue;
	while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
	v_pSSPregs->rSPTDAT0 = (ptrData[1]); // Write MCP41010 write command 
	// Wait to complete write data
    while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
	v_pSSPregs->rSPTDAT0 = (ptrData[0]); // Write MCP41010 write command 
    // Wait to complete write data
    while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );

	SetDAC7631CS(1);
	SetDAC7631LOAD(0);//
	SetDAC7631LOAD(1);//
	SetDAC7631LDAC(1);
}

⌨️ 快捷键说明

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