?? operationio.cpp
字號(hào):
// 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了
// 設(shè)置GPB的控制寄存器為全部Output
// v_pIOPRegs->rGPBCON=0x155555;
// 設(shè)置GPB的數(shù)據(jù)寄存器輸出高電平
// v_pIOPRegs->rGPBDAT=0x3FF;
// int a|=(1<<x) //X就是某位需要置1的數(shù)字,如第四位置1為: a|=(1<<4)
// int b&=~(1<<x) //把某位置0
v_pIOPRegs->rGPFCON &=0xFFFFFF00; //把GPF1,3,5,7的設(shè)置位清0,則將它們做為輸入腳
v_pIOPRegs->rGPFUP = 0xff;
v_pIOPRegs->rGPGCON &=0xFFFFFCF0;//把GPF3,7 設(shè)為輸入,4設(shè)為輸出
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);//線收一次數(shù)據(jù)
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -