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

📄 spipseudo.cpp

📁 Anlog 公司的DSP,ADSP-BF531并口模拟spi引导程序,是采用BF531从引导模式。
💻 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 + -