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

📄 eeprom.c

📁 SPI接口EEPROM驱动 EEPROMWRITE(绝对地址
💻 C
字号:
/*************************************************************************
	filename	EEPROM.c
	designer	戴展波
	date		2004/12/29
*************************************************************************/
#include "DSP28_Device.h"
#include "EEPROM.h"
extern unsigned int *ram_addr;
extern unsigned int flag,EEPROM_Addr1,Write_Length1;
extern unsigned char Spi_VarRx[155];
/*********************************************************************
	函数名:	void EEPROM_Write_Enable(void)
	目的:		EEPROM的写使能
	输入:		无
	输出:		无
*********************************************************************/
void EEPROM_Write_Enable(void)
{
//	unsigned int i;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0; //使能ste
	//发送SPI
	SpiaRegs.SPITXBUF = WREN;
	//
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	delay_time(60);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}

/*********************************************************************
	函数名:	void EEPROM_Write_Disable(void)
	目的:		EEPROM的写关闭
	输入:		无
	输出:		无
*********************************************************************/
void EEPROM_Write_Disable(void)
{
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = WRDI;
	//
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	delay_time(100);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}

/*********************************************************************
	函数名:	unsigned int EEPROM_Read_Status(void)
	目的:		EEPROM的读状态
	输入:		无
	输出:		无
*********************************************************************/
unsigned int EEPROM_Read_Status(void)
{
	unsigned int i,data;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = RDSR;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = 0xff;
	for(i = 0; i < 100; i++);
	//判断SPI发送准备好
	while(Spi_RxReady() == 0);
	//发送SPI
	data = SpiaRegs.SPIRXBUF;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
	return data;
}

/*********************************************************************
	函数名:	void EEPROM_Write_Status(unsigned int write_status)
	目的:		EEPROM的写状态
	输入:		write_status	写状态寄存器的控制字
	输出:		无
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = WRSR;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = write_status;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	delay_time(100);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 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 j;
	unsigned int data;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = READ;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = address;
	//for(i = 0; i < 10000; i++);
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = address << 8;

	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI~~~~~~
	SpiaRegs.SPITXBUF = 0x5500;
	for(j = 0; j < 100; j++);
	//判断SPI发送准备好
	while(Spi_RxReady() == 0);
	//发送SPI
	data = SpiaRegs.SPIRXBUF;
	
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	delay_time(50);/////////250
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
	//
	return data;
}

/*********************************************************************
	函数名:	void EEPROM_Write(unsigned int address,unsigned int *data)
	目的:		EEPROM的写
	输入:		address		写地址
	//////////////////////////////////////////////////
		*data		写数据~~~从0x00100000开始的数据。
	输出:		无
*********************************************************************/
void EEPROM_Write(unsigned int address,unsigned int data)
{
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = WRITE;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = address & 0xff00;
	//
	//for(i = 0; i < 10000; i++);
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = (address << 8) & 0xff00 ;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = (*(ram_addr+data) << 8) & 0xff00;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	delay_time(50);         //150~~~~3.8
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
	//delay_time(150); ///~~~~~~~~~~
}
/*********************************************************************
	函数名:	void EEPROM_Write_write(unsigned int first_addr)
	目的:		写EEPROM的写命令字
	输入:		first_addr		写入的页首地址
	输出:		无
*********************************************************************/
void EEPROM_Write_write(unsigned int first_addr)
{
    //判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
	//发送SPI
	SpiaRegs.SPITXBUF = WRITE;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = first_addr & 0xff00;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	//发送SPI
	SpiaRegs.SPITXBUF = (first_addr << 8) & 0xff00 ;
	//判断SPI发送准备好
	while(Spi_TxReady() == 0);
	delay_time(50);
}
////////////////////////////////////////////////////////
//eeprom按页写:64字节/页
////////////////////////////////////////////////////////
void EEPROM_Write_All(void)
{
	unsigned int Send_Counter,Page_Counter;
	EEPROM_Write_Enable();
	EEPROM_Write_write(EEPROM_Addr1);
	for(Send_Counter=0;Send_Counter!=Write_Length1;)
	{
		if(Page_Counter != 64)	
		{
			SpiaRegs.SPITXBUF =(*(ram_addr+Send_Counter) << 8) & 0xff00;
			delay_time(50);   //25000 1500 500 100
			Page_Counter++;
			Send_Counter++;			
		}
		else
		{
			GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
            while((EEPROM_Read_Status()&0x01) == 0x01);
			Page_Counter = 0;
			EEPROM_Addr1 = EEPROM_Addr1 + 64;
			EEPROM_Write_Enable();  
			EEPROM_Write_write(EEPROM_Addr1);	//更新写入页地址		
		}
	}
	GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;//写完
}

////////////////////////////////////////////
/*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;
}*/
////
void delay_time(unsigned int data)
{
	unsigned int i;
	for(i = 0; i < data; i++);
}

⌨️ 快捷键说明

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