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

📄 dps2812_eeprom.c

📁 SPI接口EEPROM驱动 EEPROMWRITE(绝对地址
💻 C
字号:
#include "DSP28_Device.h"
#include "EEPROM.h"
unsigned char Spi_VarRx[155];
unsigned char Spi_VarTx[155];
unsigned char *EEPROM_Write_Date1,*EEPROM_Read_Date1;
unsigned int i,j,i1;
//unsigned int EEPROM_Read1(void);
//inline Uint16 EEPROM_Read1(void);
void EEPROM_MultiRead(Uint16 EEPROM_Addr,unsigned char *EEPROM_Read_Date,Uint16 Read_Length);
void EEPROM_MultiWrite(Uint16 EEPROM_Addr,unsigned char *EEPROM_Write_Date,Uint16 Write_Length);
unsigned int *ram_addr = (unsigned int *)0x100000;
//unsigned int Send_Counter,Page_Counter;
unsigned int EEPROM_Addr1,Write_Length1;

void main(void)
{
	/*初始化系统*/
	InitSysCtrl();
	/* 关中断 */
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/* 初始化PIE控制寄存器 */
	InitPieCtrl();
	/* 初始化PIE参数表 */
	InitPieVectTable();	
	/* 初始化外设寄存器 */
	InitPeripherals();
	EEPROM_Addr1 = 0x0003;
//	Send_Counter = 0;
//	Page_Counter = 0;
	Write_Length1 = 70;  //假设有的数据
    	for(i = 0; i < 32000; i++)
    	{
    	//*(ram_addr+i)=i+1;///~~~~~~~~~~~~~~~
    	//Spi_VarTx[i] = i+2;
    	}
    	for(i = 0; i < 155; i++)
    	{
    		Spi_VarRx[i] = 0;
    		Spi_VarTx[i] = i+2;
    	}
    	i = 0;
    	j = 0;	
    	EEPROM_Write_Date1 = Spi_VarTx;
    	EEPROM_Read_Date1 = Spi_VarRx;
   		/* 开中断 */
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	
    EEPROM_MultiWrite(EEPROM_Addr1,EEPROM_Write_Date1,Write_Length1);
	EEPROM_MultiRead(EEPROM_Addr1,EEPROM_Read_Date1,Write_Length1);

/*	while((EEPROM_Read_Status()&0x01) == 0x01);
	while(Spi_TxReady() == 0);
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	SpiaRegs.SPITXBUF = READ;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x0000;
	//for(i = 0; i < 10000; i++);
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x0000 << 8;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x5500;
	for(j = 0; j < 100; j++);
	while(Spi_RxReady() == 0);
	/////////////////////////
	*/
//void EEPROM_MultiWrite(Uint16 EEPROM_Addr,unsigned char *EEPROM_Read_Date,Uint16 Read_Length);
//{
	while((EEPROM_Read_Status()&0x01) == 0x01);
    while(Spi_TxReady() == 0);
	GpioDataRegs.GPFCLEAR.bit.GPIOF3 = 1;
	SpiaRegs.SPITXBUF = 0x0300;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x0000;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x0000 << 8;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x5500;
	for(j = 0; j < 100; j++);
	while(Spi_RxReady() == 0);	
	for(i1 = 0; i1 < 155; i1++)
	{
    	Spi_VarRx[i1] = SpiaRegs.SPIRXBUF;
		while(Spi_TxReady() == 0);
		SpiaRegs.SPITXBUF = 0x5500;
		for(j = 0; j < 100; j++);
		while(Spi_RxReady() == 0);
		delay_time(50);
    }   
//}   	  	
	for(;;)
	{

	}
} 	
//===========================================================================
/*inline Uint16 SPIA_Transmit(void)
{
Uint16 recvData;
while( Spi_TxReady() == 0);
recvData = SPIARegs.SPIRXBUF;
while( Spi_TxReady() == 0);
SPIARegs.SPITXBUF = 0x5500;
for(j = 0; j < 100; j++);
while(Spi_RxReady() == 0);
delay_time(50);
return recvData;
}*/
/*////////////////////////////////////////
inline Uint16 EEPROM_Read1(void)
{
	Uint16  data;
	data = SpiaRegs.SPIRXBUF;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x5500;
	for(j = 0; j < 100; j++);
	while(Spi_RxReady() == 0);
	delay_time(50);
	return data;
}*/
////////////////////////////////////////////////////////
//EEPROM多字节写
//EEPROM_MultiWrite(EEPROM绝对地址,数组指针,数据长度) 
////////////////////////////////////////////////////////	
void EEPROM_MultiWrite(Uint16 EEPROM_Addr,unsigned char *EEPROM_Write_Date,Uint16 Write_Length)
{	
	unsigned int Send_Counter,Page_Counter;
	EEPROM_Write_Enable();
	EEPROM_Write_write(EEPROM_Addr);
	Page_Counter = EEPROM_Addr%64;  //取出EEPROM页内地址。
	for(Send_Counter=0;Send_Counter!=Write_Length;)
	{
		if(Page_Counter != 64)	
		{
			SpiaRegs.SPITXBUF =(*EEPROM_Write_Date << 8) & 0xff00;
			delay_time(50);
			Page_Counter++;
			Send_Counter++;
			EEPROM_Addr++;	
			EEPROM_Write_Date++;		
		}
		else
		{
			GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
            while((EEPROM_Read_Status()&0x01) == 0x01);
			Page_Counter = 0;
			EEPROM_Write_Enable();  
			EEPROM_Write_write(EEPROM_Addr);	//更新写入页地址		
		}
	}
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;//写完
    return;
}	

void EEPROM_MultiRead(Uint16 EEPROM_Addr,unsigned char *EEPROM_Read_Date,Uint16 Read_Length)
{	
	int t;
	while((EEPROM_Read_Status()&0x01) == 0x01);
    while(Spi_TxReady() == 0);
	GpioDataRegs.GPFCLEAR.bit.GPIOF3 = 1;
	SpiaRegs.SPITXBUF = 0x0300;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = EEPROM_Addr;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = EEPROM_Addr << 8;
	while(Spi_TxReady() == 0);
	SpiaRegs.SPITXBUF = 0x5500;
	for(t = 0; t < 100; t++);
	while(Spi_RxReady() == 0);	
	for(t = 0; t < Read_Length; t++)
	{
    	*EEPROM_Read_Date++ = SpiaRegs.SPIRXBUF;
		while(Spi_TxReady() == 0);
		SpiaRegs.SPITXBUF = 0x5500;
		for(j = 0; j < 100; j++);
		while(Spi_RxReady() == 0);
		delay_time(50);
    }  
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;  
    return;
} 


⌨️ 快捷键说明

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