📄 spipseudo.cpp
字号:
// SPIPseudo.cpp : implementation file
//
#include "stdafx.h"
#include "SPIPseudo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// SPIPseudo
SPIPseudo::SPIPseudo()
{
SPI_data = ADSP_CS_PIN | SCK_PIN | BMODE0_PIN | MR_RST_PIN;
SPI_status = 0;
Opendriver();
Out32(DATA_REG, SPI_data);
}
SPIPseudo::~SPIPseudo()
{
SPI_data = 0xFF;
Out32(DATA_REG, SPI_data);
Closedriver();
}
#if 0
BEGIN_MESSAGE_MAP(SPIPseudo, CProgressCtrl)
//{{AFX_MSG_MAP(SPIPseudo)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif
/////////////////////////////////////////////////////////////////////////////
// SPIPseudo message handlers
void SPIPseudo::SPI_Reset()
{
SPI_data &= (~MR_RST_PIN);
Out32(DATA_REG, SPI_data);
delaySec(0.2);
SPI_data |= (MR_RST_PIN);
Out32(DATA_REG, SPI_data);
}
const unsigned char bitmsk[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
short SPIPseudo::SPI_ByteWrite(unsigned char ch)
{
short bytetmp = 0;
int timeOut = 1000;//(timeOut * 0.00001)s
for (int i = 0; i < 8; i++) {
while((SPI_StatusSence() & (PFX_FLAG_PIN))) {
delaySec(0.00001);
if (timeOut-- < 0)
return -1;
}
if (ch & bitmsk[i]) {
SPI_data |= (MOSI_PIN);
} else {
SPI_data &= (~MOSI_PIN);
}
Out32(DATA_REG, SPI_data);
delaySec(0.000002);
SPI_data |= (SCK_PIN);
Out32(DATA_REG, SPI_data);
delaySec(0.000002);
SPI_data &= (~SCK_PIN);
Out32(DATA_REG, SPI_data);
if (SPI_StatusSence() & (MISO_PIN)) {
bytetmp |= bitmsk[i];
}
delaySec(0.000002);
}
SPI_data |= (SCK_PIN);
Out32(DATA_REG, SPI_data);
return bytetmp;
}
void SPIPseudo::SPI_ChipCS(short state)
{
if (state)
SPI_data |= (ADSP_CS_PIN);
else
SPI_data &= (~ADSP_CS_PIN);
Out32(DATA_REG, SPI_data);
}
void SPIPseudo::SPI_BMode(short state)
{
if (state)
SPI_data |= (BMODE0_PIN);
else
SPI_data &= (~BMODE0_PIN);
Out32(DATA_REG, SPI_data);
}
short SPIPseudo::SPI_StatusSence()
{
return Inp32(STATUS_REG);
}
void SPIPseudo::delaySec(double sec)
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
do
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;
}while(dfTim < sec);
}
int SPIPseudo::Opendriver()
{
hdriver = CreateFile("\\\\.\\hwinterface",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hdriver == INVALID_HANDLE_VALUE) {
return 1;
}
return 0;
}
void SPIPseudo::Closedriver()
{
CloseHandle(hdriver);
}
void SPIPseudo::Out32(short PortAddress, short data)
{
unsigned int error;
DWORD BytesReturned;
BYTE Buffer[3];
unsigned short * pBuffer;
pBuffer = (unsigned short *)&Buffer[0];
*pBuffer = LOWORD(PortAddress);
Buffer[2] = LOBYTE(data);
error = DeviceIoControl(hdriver,
IOCTL_WRITE_PORT_UCHAR,
&Buffer,
3,
NULL,
0,
&BytesReturned,
NULL);
}
short SPIPseudo::Inp32(short PortAddress)
{
unsigned int error;
DWORD BytesReturned;
unsigned char Buffer[3];
unsigned short * pBuffer;
pBuffer = (unsigned short *)&Buffer;
*pBuffer = LOWORD(PortAddress);
Buffer[2] = 0;
error = DeviceIoControl(hdriver,
IOCTL_READ_PORT_UCHAR,
&Buffer,
2,
&Buffer,
1,
&BytesReturned,
NULL);
return((int)Buffer[0]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -