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

📄 simspi.c

📁 功能:在AT91SAM7-EK 板上实现用串口(DBGU)操作mmc /sd 上的ucfs文件系统
💻 C
字号:
//-----------------------------------------------------
//--函数名:SimSpi.c
//--功  能:使用目标板SPI的功能
//--公  司:深圳市百特电子
//--设  计:陈斌
//--时  间:2005.11.11
//-----------------------------------------------------
//=================================================================
//=================================================================
#define  ext extern
#include "Board.h"
//#include "../user/data.h"
//#include "Simspi.h"


AT91_DF DATAFLASH;
AT91_DF* pDF;

char Dfdata[528];
volatile char READSTA;
volatile char DFSTA[8];//把DGSTA加到watch中看结果
void test(void);
AT91S_SPI* pSPI;
char waitready(void);
void SPI_init(void);
AT91S_PIO* PIO;
//============================================================
//--Simulator()
//============================================================
static void SPI_delay(void);
static void SPI_init_Sim(void);
static void SimDisSpi(unsigned int cs);
static void SimEnaSpi(unsigned int cs);
static void SimSpiOut(char* pCha);
static void SimSpiIn(char* pCha);
static void spi_PDC_oper(char* addout,int outcou,
			  	char* addin,int incou,
			  	char *addoutnext,int outcounext,
			  	char *addinnext,int incounext);
//=============================================================

//--等待就绪------------------------------------------------------
char waitready(void)
{
	int i;
	char j = 0;
	READSTA = IDLE;
	do
	{
		if(READSTA == IDLE)
		{
			READSTA = BUSY;
			pDF->oper[0] = DF_READ_STATUS;//0xF0;
			spi_PDC_oper(&(pDF->oper[0]),2,(char*)DFSTA,1,0,0,0,0);
		}
		
		if((DFSTA[0]&0x80) == 0)
		{
			READSTA = IDLE;
		}
		else
		{
			READSTA = READY;
		}

		for(i=0; i<0x1000; i++){};
		j++;
	}while((READSTA != READY) && (j < 200));
	return j;
}

//-------------------------------------------
//--连续读
//-------------------------------------------
void DFread(int page,		//页地址
			int offsadd,	//页内偏移
			char* add,		//读入数据以后保存的起始地址
			int cou,		//所读入的数据个数
			char oper)		//读数据的操作代码
{
	if(waitready() == 200)
	{
		return;
	}
	pDF->oper[0] = oper;
	pDF->oper[1] = (char)(page>>6);
	pDF->oper[2] = ((char)page)<<2 | offsadd>>8;
	pDF->oper[3] = (char)offsadd;
	spi_PDC_oper(&(pDF->oper[0]),8,Dfdata,cou,0,0,0,0);
}

//-----------------------------------------------------
//--页写入
//-----------------------------------------------------

void DFwrite(int page,		//页地址
			int offsadd,	//页内偏移地址
			char* add,		//写入数据的起始地址
			int cou,		//写入数据的数目
			char oper)		//写操作代码
{
	if(waitready() == 200)
	{
		return;
	}
	pDF->oper[0] = oper;
	pDF->oper[1] = (char)(page>>6);
	pDF->oper[2] = (((char)page)<<2) | offsadd>>8;
	pDF->oper[3] = (char)offsadd;
	spi_PDC_oper(&(pDF->oper[0]),4,0,0,Dfdata,cou,0,0);
}
void test()
{
	int i;
	for(i=0; i<528; i++){Dfdata[i]='0';}
	DFread(0,0,Dfdata,528,DF_READ_MEM_ARRAY);//第0页0地址开始读入Dfdata数组
	
	for(i=0; i<528; i++){Dfdata[i]=i;}
	DFwrite(0,0,Dfdata,528,DF_PGM_BUFA_TO_PAGE);//第0页0地址开始写入Dfdata数组
	
	for(i=0; i<528; i++){Dfdata[i]='0';}
	DFread(0,0,Dfdata,528,DF_READ_MEM_ARRAY);//第0页0地址开始读入Dfdata数组
	
	//-------------------------------------------
	for(i=0; i<528; i++){Dfdata[i]='0';}
	DFread(1,0,Dfdata,528,DF_READ_MEM_ARRAY);//第1页0地址开始读入Dfdata数组
	
	for(i=0; i<528; i++){Dfdata[i]=528-i;}
	DFwrite(1,0,Dfdata,528,DF_PGM_BUFA_TO_PAGE);//第1页0地址开始写入Dfdata数组
	
	for(i=0; i<528; i++){Dfdata[i]='0';}
	DFread(1,0,Dfdata,528,DF_READ_MEM_ARRAY);//第1页0地址开始读入Dfdata数组
	SPI_delay();
}

//===============================================
//--软件 模拟SPI---------------------------------
//-----------------------------------------------
// AT91S_PIO, *AT91PS_PIO;
#define Miso	((unsigned int)AT91C_PA16_SPI0_MISO)
#define Mosi	((unsigned int)AT91C_PA17_SPI0_MOSI)
#define Spck	((unsigned int)AT91C_PA18_SPI0_SPCK)
#define DFcs	((unsigned int)AT91C_PA12_SPI0_NPCS0)

#define pioin() (AT91C_BASE_PIOA->PIO_PDSR)
#define set(i)	(AT91C_BASE_PIOA->PIO_SODR = i)
#define clr(i)	(AT91C_BASE_PIOA->PIO_CODR = i)
//-----------------------------------
void Simulator(){}
//-----------------------------------
void SPI_delay()
{
	volatile char i;
	for(i=0;i<100;i++){};
}
//----------------------------------
void SPI_init_Sim()
{
	PIO=AT91C_BASE_PIOA;
	AT91C_BASE_PIOA->PIO_PER = (DFcs|Mosi|Spck|Miso);
	AT91C_BASE_PIOA->PIO_OER  = DFcs|Mosi|Spck;
	AT91C_BASE_PIOA->PIO_ODR  = Miso;
    AT91C_BASE_PIOA->PIO_IFER  = Miso;
	AT91C_BASE_PIOA->PIO_PPUER = (DFcs|Mosi|Spck|Miso); 	// Pull-up Enable Register
	AT91F_PIOA_CfgPMC ();
}

//----------------------------------
//--无效为高电平
//----------------------------------
void SimDisSpi(unsigned int cs)
{
	set(cs);
}

//----------------------------------
void SimEnaSpi(unsigned int cs)
{
	clr(cs);
}

//----------------------------------
void SimSpiOut(char* pCha)
{
	char i=0,j=0;
	clr(Spck|Mosi);
	j = *pCha;
	for(i=0;i<8;i++)
	{
		clr(Spck);
		if((j&0x80) !=0)
		{
			set(Mosi);
		}
		else
		{
			clr(Mosi);
		}
		j = j<<1;
		SPI_delay();
		set(Spck);
		SPI_delay();
	}
}

//-----------------------------------
void SimSpiIn(char* pCha)
{
	char i=0,j=0;
	for(i=0;i<8;i++)
	{
		j<<=1;
		clr(Spck);
		SPI_delay();
		set(Spck);
		if(pioin() & Miso)
		{
			j++;
		}
		SPI_delay();
	}
	*pCha = j;
}
//-------------------------------------------------------
//--Sim PDC使能	进行发送和接收(半双工)
//-------------------------------------------------------
//void spi_PDC_oper_smi(
void spi_PDC_oper(
		char* addout,int outcou,
		char* addin,int incou,
		char *addoutnext,int outcounext,
		char *addinnext,int incounext)
{
	SimEnaSpi(DFcs);
	for(;outcou>0;outcou--)
	{
		SimSpiOut(addout);
		addout++;
	}
	for(;outcounext>0;outcounext--)
	{
		SimSpiOut(addoutnext);
		addoutnext++;
	}
	//-----------------------------------
	for(;incou>0;incou--)
	{
		SimSpiIn(addin);
		addin++;
	}
	for(;incounext>0;incounext--)
	{
		SimSpiIn(addinnext);
		addinnext++;
	}
	SimDisSpi(DFcs);
}

//-------------------
void SPI_init()
{
	char i;
	pSPI = AT91C_BASE_SPI0;
	pDF = &DATAFLASH;		//初使化发送命令数据指针
	SPI_init_Sim();
	//SPI_init__hardware();

	//--以下进行测试
	for(i=0; i<8; i++)
	{
		DFSTA[i]=0;
	}
	while(1)
	{
		test();
		for(i=0;i<20;i++)
		{
			SPI_delay();
		}
	}
}





⌨️ 快捷键说明

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