📄 dsp2812x5043spi.txt
字号:
//DSP2812 与X5043 SPI的连接程序,经过验证可以使用
#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); //用于测试5043的内部数据,共选择了5个点,正常情况下不会破坏内部的数据。返回OK
extern unsigned int Init_5043_canshu(void); //初始化系统参数表
//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);
}
/*********************************************************************
函数名: void EEPROM_Write_Enable(void)
目的: EEPROM的写使能
输入: 无
输出: 无
*********************************************************************/
void EEPROM_Write_Enable(void)
{
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WREN;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
delay_time(60);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
}
/*********************************************************************
函数名: void EEPROM_Write_Disable(void)
目的: EEPROM的写关闭
输入: 无
输出: 无
*********************************************************************/
void EEPROM_Write_Disable(void)
{
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WRDI;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
delay_time(100);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
}
/*********************************************************************
函数名: unsigned int EEPROM_Read_Status(void)
目的: EEPROM的读状态
输入: 无
输出: 无
*********************************************************************/
unsigned int EEPROM_Read_Status()
{
unsigned int i1,data;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
SpiaRegs.SPITXBUF = RDSR;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = 0x00;
for(i1 = 0; i1 < 200; i1++);////////本延时特别关键,必须要有
//判断SPI发送准备好
while(Spi_RxReady() == 0);
//发送SPI
data = SpiaRegs.SPIRXBUF;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
//
return data;
}
/*********************************************************************
函数名: void EEPROM_Write_Status(unsigned int write_status)
目的: EEPROM的写状态
输入: write_status 写状态寄存器的控制字
输出: 无
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
unsigned int i;
EEPROM_Write_Enable();//写使能
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WRSR;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = write_status<<8;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
delay_time(100);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
//
for(i = 0; i < 100; i++);
}
/*********************************************************************
函数名: unsigned int EEPROM_Read(unsigned int address)
目的: EEPROM的读
输入: length 读EEPROM的8位BYTE长度
address 读EEPROM的首地址,16BIT
输出: 无
*********************************************************************/
unsigned int EEPROM_Read(unsigned int address)
{
unsigned int i1,j1;
unsigned int data;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = READH;
}
else
{
SpiaRegs.SPITXBUF = READL;
}
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address<<8;
for(i1 = 0; i1 < 50; i1++);
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = 0x5500;
for(j1 = 0; j1 < 1000; j1++);////////本延时特别关键,必须要有
//判断SPI发送准备好
while(Spi_RxReady() == 0);
//发送SPI
data = SpiaRegs.SPIRXBUF;
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 1;
return data;
}
/*********************************************************************
函数名: void EEPROM_Write(unsigned int address,unsigned int data)
目的: EEPROM的写
输入: address 写地址
data 写数据
输出: 无
*********************************************************************/
void EEPROM_Write(unsigned int address,unsigned int data)
{
unsigned int i;
EEPROM_Write_Enable();
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = WRITEH;
}
else
{
SpiaRegs.SPITXBUF = WRITEL;
}
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address<<8;
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = data << 8 ;
//判断SPI发送准备好
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++);
}
/*********************************************************************
函数名: void EEPROM_Page_Write(unsigned int address,unsigned int data[],unsigned int number)
目的: EEPROM的分页写入
输入: address 要写入的开始地址
data 要写入的数据组
number 需要写入的数据个数(1-14)
输出: 无
说明: 由于特殊原因,最多写入十四个字节,最后的两个字节是乱数据
*********************************************************************/
void EEPROM_Page_Write(unsigned int address,unsigned int data[],unsigned int number)
{
unsigned int n;
EEPROM_Write_Enable();
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
GpioDataRegs.GPDDAT.bit.GPIOD5 = 0;
//发送SPI
if(address>=0x100)
{
SpiaRegs.SPITXBUF = WRITEH;
}
else
{
SpiaRegs.SPITXBUF = WRITEL;
}
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address << 8;
for(n=0; n < number; n++)
{
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = (data[n] << 8 );
//判断SPI发送准备好
}
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) //用于测试5043的内部数据,共选择了5个点,正常情况下不会破坏内部的数据。返回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(); //初始化系统
DINT; //关中断
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); //初始化PIE中断
InitPieVectTable(); //初始化PIE中断矢量表
InitGpio(); //初始化开入和开出 等很多设备
InitSpi(); //初始化SPI EEROM
IER = 0x011d;
EINT;
ERTM;
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -