📄 simspi.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 + -