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

📄 spi.c

📁 此代码应用与f2812的通讯程序!!方便用户编程!
💻 C
字号:
/******************************************************************************
when reading 5323,just use the only function :
 ReadEEp5323(int * Data,int Add,int Len);
when writing 5323,just use the function:
   PreWritEEp(int * Data,int Add,int Len);
********************************************************************************/ 
#include "Device.h"

void ReadEEp5323(far int * Data,int Add,int Len)
{
	int i,temp;
	ClearSpiBuf();
	
	cs5323Low;
	SpiRegs.SPITXBUF=0x0300;//function
	SpiRegs.SPITXBUF=(Add)&0xFF00;//address
	SpiRegs.SPITXBUF=(Add<<8)&0xFF00;
	while(SpiRegs.SPIFFRX.bit.RXFFST<3);
	while (SpiRegs.SPIFFRX.bit.RXFFST > 0) //clear the receive buffer
		temp=SpiRegs.SPIRXBUF;

	for(i=0;i<Len;i++)//send unavailable data	
	{
		SpiRegs.SPITXBUF=0x5500&0xff00;	
		SpiRegs.SPITXBUF=0x5500&0xff00;	
		while(SpiRegs.SPIFFRX.bit.RXFFST<2);//wait for recieve data
		temp=SpiRegs.SPIRXBUF & 0xFF;//low byte
		*Data=temp;
		temp=SpiRegs.SPIRXBUF & 0xFF;//high byte
		*Data += temp<<8;	
		Data +=1 ;		
	}

	cs5323Hig;
}

void PreWritEEp(far int * Data,int Add,int Len)
{
	far_memcpy(SpiData.DatBuf, Data, Len);
	SpiData.Add=Add;
	SpiData.Len=Len;
	SpiData.pos=0;
	SpiData.doWriteEEp5323=1;
}

void WriteEEp5323()
{
	if(SpiData.Add & 1) return;//ensure the address of bytes is even.
	ClearSpiBuf();
	cs5323Low;

	//write enable
	if(SpiData.writeEna==0)
	{
		SpiData.writeEna = 1;
		SpiRegs.SPITXBUF = 0x0600;
		while(SpiRegs.SPIFFRX.bit.RXFFST==0);//wait for recieve data
		SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF & 0xFF;//clear buffer
		SpiData.Busy10ms=2;
		cs5323Hig;
		return;
	}

	//write to eeprom
	SpiRegs.SPITXBUF=0x0200;            //function
	SpiRegs.SPITXBUF=SpiData.Add&0xFF00;        //address
	SpiRegs.SPITXBUF=(SpiData.Add<<8)&0xFF00;
	while(SpiRegs.SPIFFRX.bit.RXFFST < 3);
	while(SpiRegs.SPIFFRX.bit.RXFFST > 0) //clear the receive buffer
		SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF;

	do//can be stop by two reasons:1)all datas have been written,2)wait for the next page
	{
		SpiRegs.SPITXBUF=((SpiData.DatBuf[SpiData.pos])<<8)&0xFF00;//send data, low byte first
		SpiRegs.SPITXBUF= (SpiData.DatBuf[SpiData.pos])&0xFF00;
		SpiData.Add += 2;
		SpiData.pos += 1;
		while (SpiRegs.SPIFFRX.bit.RXFFST < 2);//wait
		while (SpiRegs.SPIFFRX.bit.RXFFST > 0) //clear the receive buffer
			SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF & 0xFF;
	}while((SpiData.pos<SpiData.Len)&&(SpiData.Add&31));

	SpiData.writeEna = 0;
	SpiData.Busy10ms=2;
	cs5323Hig;

	//all datas have been written
	if(SpiData.pos>=SpiData.Len)
	{
		SpiData.doWriteEEp5323=0;
		SpiData.pos=0;
		SpiData.writBusy=0;
	}
}

void ClearWatDog()
{
	cs5323Low;
	NOP;
	cs5323Hig;
}

void Init1306(void)
{
	//----------enable clock 1306----------------
	Send1306byte(0x8F00,0x0500);//control register :enable cloclk and interupt0
	Send1306byte(0x9000,0x0000);//status register is cleared	
	Send1306byte(0x9100,0xA600);//trickle register used to deal with Vbat
	Send1306byte(0x8700,0x8000);//1306 interrupt enable,so do the following 
	Send1306byte(0x8800,0x8000);
	Send1306byte(0x8900,0x8000);
	Send1306byte(0x8A00,0x8000);
}
void GetTime1306()
{
	int i,temp;
	cs1306Hig;	
	ClearSpiBuf();	

	SpiRegs.SPITXBUF=0x0000;//read Adress
	for(i=0;i<7;i++)
	{
		SpiRegs.SPITXBUF=0x5500 & 0xFF00;//send unavailable data to enable clock
	}

	while(SpiRegs.SPIFFRX.bit.RXFFST<8);//wait for recieve data
	temp=SpiRegs.SPIRXBUF & 0xFF;//unavailable data

	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.seconds = BCDtoHex(temp);//second

	temp=SpiRegs.SPIRXBUF & 0xFF;	
	Time1306.minutes = (BCDtoHex(temp)) & 0x3F;

	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.dayofweek = (BCDtoHex(temp)) & 0xF;

	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.hours  = (BCDtoHex(temp)) & 0x1F;
	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.dates  = (BCDtoHex(temp)) & 0x1F;

	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.months = (BCDtoHex(temp)) & 0x0F; 

	temp=SpiRegs.SPIRXBUF & 0xFF;
	Time1306.years  = (BCDtoHex(temp)) & 0x7F;

	cs1306Low;
}

void SetTime1306()
{  
	int temp=0;
	cs1306Hig;
    ClearSpiBuf();	

	SpiRegs.SPITXBUF = 0x8000;//write address	
	temp=HextoBCD(Time1306.seconds);
	SpiRegs.SPITXBUF = temp<<8;
	temp=HextoBCD(Time1306.minutes);
	SpiRegs.SPITXBUF = temp<<8;
	temp=HextoBCD(Time1306.hours);
	SpiRegs.SPITXBUF = temp<<8;
	temp=HextoBCD(Time1306.dayofweek);
	SpiRegs.SPITXBUF = temp<<8;
	temp=HextoBCD(Time1306.dates);
	SpiRegs.SPITXBUF = temp<<8;
	temp=HextoBCD(Time1306.months);
	SpiRegs.SPITXBUF = temp<<8;	
	temp=HextoBCD(Time1306.years);
	SpiRegs.SPITXBUF = temp<<8;

	while(SpiRegs.SPIFFRX.bit.RXFFST<8);//wait for recieve data
	while(SpiRegs.SPIFFRX.bit.RXFFST>0)//清理buffer
	{
		temp=SpiRegs.SPIRXBUF&0xff00;
	}
	cs1306Low;
}

void Send1306byte(int Add,int data)
{
	cs1306Hig;

	SpiRegs.SPITXBUF = Add&0xFF00;
	SpiRegs.SPITXBUF = data&0xFF00;
	while(SpiRegs.SPIFFRX.bit.RXFFST<2);//wait for recieve data
	SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF&0xFF;
	SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF&0xFF;
		
	cs1306Low;
}

void Rev1306byte(int Add,int *RevData, int num)
{
	int i;
	cs1306Hig;	
	ClearSpiBuf();	

	SpiRegs.SPITXBUF = Add;//read Adress
	for(i = 0; i < num; i++)
	{
		SpiRegs.SPITXBUF = 0x5500&0xFF00;//send unavailable data to enable clock
	}

	while(SpiRegs.SPIFFRX.bit.RXFFST < (num+1));//wait for recieve data
	SpiRegs.SPIRXBUF = SpiRegs.SPIRXBUF & 0xFF;//unavailable data
	for(i = 0; i < num; i++)
	{
		*(RevData + i) = SpiRegs.SPIRXBUF & 0xFF;
	}
	cs1306Low;
}
//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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