?? dsp2812x5043spi.txt
字號(hào):
//DSP2812 與X5043 SPI的連接程序,經(jīng)過(guò)驗(yàn)證可以使用
#define WREN 0x0600
#define WRDI 0x0400
#define RDSR 0x0500
#define WRSR 0x0100
#define READL 0x0300
#define READH 0x0b00
#define WRITEL 0x0200
#define WRITEH 0x0A00
extern void EEPROM_Write_Enable(void);
extern void EEPROM_Write_Disable(void);
extern unsigned int EEPROM_Read_Status(void);
void EEPROM_Write_Status(unsigned int write_status);
extern unsigned int EEPROM_Read(unsigned int address);
extern void EEPROM_Write(unsigned int address,unsigned int data);
extern void delay_time(unsigned int data);
extern void EEPROM_Page_Write(unsigned int address,unsigned int data[],unsigned int number);
extern void Reset_Rtc(void);
extern void Write_Sta_Register(unsigned int data);
extern unsigned int test_5043(void); //用于測(cè)試5043的內(nèi)部數(shù)據(jù),共選擇了5個(gè)點(diǎn),正常情況下不會(huì)破壞內(nèi)部的數(shù)據(jù)。返回OK
extern unsigned int Init_5043_canshu(void); //初始化系統(tǒng)參數(shù)表
//SPI 變量
extern unsigned int Spi_VarRx[100];
extern unsigned int Spi_VarTx[100];
extern unsigned int k;
void InitSpi(void)
{
/* 8 bit data */
SpiaRegs.SPICCR.all = 0x07;
SpiaRegs.SPICTL.all = 0x0e;//SpiaRegs.SPICTL.all = 0x0E;
SpiaRegs.SPIBRR = 0xa;
SpiaRegs.SPIPRI.all = 0x30; // free run
SpiaRegs.SPICCR.all = 0x87;
//PieCtrl.PIEIER6.bit.INTx1 = 1;
//PieCtrl.PIEIER6.bit.INTx2 = 1;
}
unsigned int Spi_TxReady(void)
{
unsigned int in;
if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
{
in = 0;
}
else
{
in = 1;
}
return(in);
}
unsigned int Spi_RxReady(void)
{
unsigned int im;
if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
{
im = 1;
}
else
{
im = 0;
}
return(im);
}
/*********************************************************************
函數(shù)名: void EEPROM_Write_Enable(void)
目的: EEPROM的寫(xiě)使能
輸入: 無(wú)
輸出: 無(wú)
*********************************************************************/
void EEPROM_Write_Enable(void)
{
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
SpiaRegs.SPITXBUF = WREN;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
delay_time(60);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
}
/*********************************************************************
函數(shù)名: void EEPROM_Write_Disable(void)
目的: EEPROM的寫(xiě)關(guān)閉
輸入: 無(wú)
輸出: 無(wú)
*********************************************************************/
void EEPROM_Write_Disable(void)
{
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
SpiaRegs.SPITXBUF = WRDI;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
delay_time(100);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
}
/*********************************************************************
函數(shù)名: unsigned int EEPROM_Read_Status(void)
目的: EEPROM的讀狀態(tài)
輸入: 無(wú)
輸出: 無(wú)
*********************************************************************/
unsigned int EEPROM_Read_Status()
{
unsigned int i1,data;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
SpiaRegs.SPITXBUF = RDSR;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = 0x00;
for(i1 = 0; i1 < 200; i1++);////////本延時(shí)特別關(guān)鍵,必須要有
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_RxReady() == 0);
//發(fā)送SPI
data = SpiaRegs.SPIRXBUF;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
//
return data;
}
/*********************************************************************
函數(shù)名: void EEPROM_Write_Status(unsigned int write_status)
目的: EEPROM的寫(xiě)狀態(tài)
輸入: write_status 寫(xiě)狀態(tài)寄存器的控制字
輸出: 無(wú)
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
unsigned int i;
EEPROM_Write_Enable();//寫(xiě)使能
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
SpiaRegs.SPITXBUF = WRSR;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = write_status<<8;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
delay_time(100);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
//
for(i = 0; i < 100; i++);
}
/*********************************************************************
函數(shù)名: unsigned int EEPROM_Read(unsigned int address)
目的: EEPROM的讀
輸入: length 讀EEPROM的8位BYTE長(zhǎng)度
address 讀EEPROM的首地址,16BIT
輸出: 無(wú)
*********************************************************************/
unsigned int EEPROM_Read(unsigned int address)
{
unsigned int i1,j1;
unsigned int data;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = READH;
}
else
{
SpiaRegs.SPITXBUF = READL;
}
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = address<<8;
for(i1 = 0; i1 < 50; i1++);
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = 0x5500;
for(j1 = 0; j1 < 1000; j1++);////////本延時(shí)特別關(guān)鍵,必須要有
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_RxReady() == 0);
//發(fā)送SPI
data = SpiaRegs.SPIRXBUF;
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
return data;
}
/*********************************************************************
函數(shù)名: void EEPROM_Write(unsigned int address,unsigned int data)
目的: EEPROM的寫(xiě)
輸入: address 寫(xiě)地址
data 寫(xiě)數(shù)據(jù)
輸出: 無(wú)
*********************************************************************/
void EEPROM_Write(unsigned int address,unsigned int data)
{
unsigned int i;
EEPROM_Write_Enable();
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = WRITEH;
}
else
{
SpiaRegs.SPITXBUF = WRITEL;
}
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = address<<8;
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = data << 8 ;
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
while((EEPROM_Read_Status()&0x01) == 0x01);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
for(i = 0; i < 100; i++);
}
/*********************************************************************
函數(shù)名: void EEPROM_Page_Write(unsigned int address,unsigned int data[],unsigned int number)
目的: EEPROM的分頁(yè)寫(xiě)入
輸入: address 要寫(xiě)入的開(kāi)始地址
data 要寫(xiě)入的數(shù)據(jù)組
number 需要寫(xiě)入的數(shù)據(jù)個(gè)數(shù)(1-14)
輸出: 無(wú)
說(shuō)明: 由于特殊原因,最多寫(xiě)入十四個(gè)字節(jié),最后的兩個(gè)字節(jié)是亂數(shù)據(jù)
*********************************************************************/
void EEPROM_Page_Write(unsigned int address,unsigned int data[],unsigned int number)
{
unsigned int n;
EEPROM_Write_Enable();
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//發(fā)送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = WRITEH;
}
else
{
SpiaRegs.SPITXBUF = WRITEL;
}
//判斷SPI發(fā)送準(zhǔn)備好
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = address << 8;
for(n=0; n < number; n++)
{
while(Spi_TxReady() == 0);
//發(fā)送SPI
SpiaRegs.SPITXBUF = (data[n] << 8 );
//判斷SPI發(fā)送準(zhǔn)備好
}
while(Spi_TxReady() == 0);
while((EEPROM_Read_Status()&0x01) == 0x01);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
}
unsigned int test_5043(void) //用于測(cè)試5043的內(nèi)部數(shù)據(jù),共選擇了5個(gè)點(diǎn),正常情況下不會(huì)破壞內(nèi)部的數(shù)據(jù)。返回OK
{
unsigned int xe,tmp;
for(i=0;i<5;i++)
{
xe=EEPROM_Read(i*2);
EEPROM_Write(i*2,0xaa);
tmp=EEPROM_Read(i*2);
if(tmp==0xaa)
{
EEPROM_Write(i*2,0x55);
tmp=EEPROM_Read(i*2);
if(tmp==0x55)
{
EEPROM_Write(i*2,xe);
}
else
{
return(NOK);
}
}
else
{
return(NOK);
}
}
return(OK);
}
void main(void)
{
InitSysCtrl(); //初始化系統(tǒng)
DINT; //關(guān)中斷
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); //初始化PIE中斷
InitPieVectTable(); //初始化PIE中斷矢量表
InitGpio(); //初始化開(kāi)入和開(kāi)出 等很多設(shè)備
InitSpi(); //初始化SPI EEROM
IER = 0x011d;
EINT;
ERTM;
while(1)
{
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -