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