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

📄 dsp2812x5043spi.txt

📁 DSP2812 与X5043 SPI的连接程序
💻 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 + -