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

📄 e2prom.c

📁 tms320lf2407中SPI模块与25AA320(EEPROM)读写程序
💻 C
字号:
#include "JINGWEI_2407.h"
#include "My Define.h"
extern struct COMMAND_ALL_MEMBER command_all;
extern unsigned int canshu[133];
extern struct E2PROM_NUMBER spi_e2_num;
unsigned int spi_con=0;
unsigned int old_t=0;
struct Time spi_time;
unsigned int SPI_WAIT();
struct SPI_E2PROM_READ_WORD e2_word={0,0};
SPI_INIT()
{
	unsigned int i;
	for(i=0;i<35;i++)
	{
		spi_e2_num.list[i].con=0;
		spi_e2_num.list[i].num=0x55;
		if(i<34)
		spi_e2_num.list[i].next=&spi_e2_num.list[i+1];
		else
		spi_e2_num.list[i].next=&spi_e2_num.list[0];
	}
	spi_e2_num.e2_read=spi_e2_num.e2_write=&spi_e2_num.list[0];
	spi_e2_num.e2_r_full=0;
	SPICCR=0x07;//发送8个BIT
	SPICTL=0x1f;
	SPIBRR=0x4f;
	SPIPRI=0x40;
	SPICCR=0x87;//发送8个BIT
}
/*
unsigned int SPI_E2PROM_WRITEENABLE()
{
	if(spi_con==0)
	{
		SPITXBUF=0x0600;
		//SPITXBUF=0x8000;
		spi_con=3;
	}
	while(1)
	{
		SPI_WAIT();
		if(spi_con==0)
		{
			break;
		}
	}
}
unsigned int SPI_E2PROM_WRITESTATUS(unsigned int data)
{
	if(spi_con==0)
	{
		SPITXBUF=0x0100;
		SPITXBUF=data<<8;
		spi_con=2;
		old_t=3;
	}
	while(1)
	{
		SPI_WAIT();
		if(spi_con==0)
		{
			break;
		}
		TIME_PR_ADD();
	}
	
}
unsigned int SPI_E2PROM_READSTATUS()
{
	unsigned int data;
	SPITXBUF=0x0500;
	SPITXBUF=0xff00;
	spi_e2_num.e2_r_full=0;
	while(1)
	{	
		if(spi_e2_num.e2_r_full==2)
		{
			data=spi_e2_num.e2_r_data;
			break;
		}	
	}
	return data;
}
//E2PROM 写一个字节

SPI_E2PROM_WRITEBYTE(unsigned int address,unsigned int data)
{
	spi_e2_num.e2_write->num=(address);
	spi_e2_num.e2_write->con=1;
	spi_e2_num.e2_write=spi_e2_num.e2_write->next;
	spi_e2_num.e2_write->num=data;
	spi_e2_num.e2_write->con=1;
	spi_e2_num.e2_write=spi_e2_num.e2_write->next;
	SPITXBUF=0x0200;
	SPITXBUF=(address&0xff00);
}
*/
void SPI_E2PROM_READBYTE(unsigned int address)
{
	unsigned int data;
	spi_e2_num.e2_write->num=(address);
	spi_e2_num.e2_write->con=1;
	spi_e2_num.e2_write=spi_e2_num.e2_write->next;
	spi_e2_num.e2_write->num=0x3f;
	spi_e2_num.e2_write->con=1;
	spi_e2_num.e2_write=spi_e2_num.e2_write->next;
	SPITXBUF=0x0300;
	SPITXBUF=(address&0xff00);
	spi_con=1;
}

unsigned int SPI_E2PROM_READWORD(unsigned int address)
{
	unsigned int j=0;
	if(spi_con==0)
	{
		if(e2_word.byte==0)
		{
			SPI_E2PROM_READBYTE(address<<1);
			e2_word.byte=1;
		}
		else if(e2_word.byte==2)
		{
			e2_word.byte_1_read=spi_e2_num.e2_r_data;
			spi_e2_num.e2_r_data=0xff;
			SPI_E2PROM_READBYTE((address<<1)+1);
		}
		else
		{
			e2_word.byte_1_read+=spi_e2_num.e2_r_data<<8;
			spi_e2_num.e2_r_data=0xff;
			e2_word.byte=0;
			j=1;
		}
	}
	return j;
}

unsigned int SPI_E2PROM_WRITEWORD(unsigned int address,unsigned int data)
{
	unsigned int j=0;
	unsigned int i;
	if(spi_con==0)
	{
		//SPI_E2PROM_WRITEENABLE();
		spi_e2_num.e2_write=spi_e2_num.e2_write->next;
		spi_e2_num.e2_write->num=((address<<1)>>8);
		spi_e2_num.e2_write->con=1;
		spi_e2_num.e2_write=spi_e2_num.e2_write->next;
		spi_e2_num.e2_write->num=(address<<1);
		spi_e2_num.e2_write->con=1;
		spi_e2_num.e2_write=spi_e2_num.e2_write->next;
		spi_e2_num.e2_write->num=data;
		spi_e2_num.e2_write->con=1;
		spi_e2_num.e2_write=spi_e2_num.e2_write->next;
		spi_e2_num.e2_write->num=data>>8;
		spi_e2_num.e2_write->con=1;
		spi_e2_num.e2_write=spi_e2_num.e2_write->next;
		//head=((address<<1)&0xff00);
		//SPITXBUF=0x0600;
		//SPITXBUF=0x0200;
		//SPITXBUF=((address<<1)&0xff00);
		spi_e2_num.e2_r_full=0;
		spi_con=2;
		j=1;
	}
	return j;
}
WRITE_E2PROM_L_WORDS(unsigned int address,unsigned int length,unsigned int *p)
{
	unsigned int i;
	unsigned int l;
	l=0;
	while(1)
	{
		SPI_WAIT();
		if(spi_con==0)
		{   
			if(l==length)
			break;
			spi_e2_num.e2_write=spi_e2_num.e2_write->next;
			spi_e2_num.e2_write->num=(((address+l)<<1)>>8);
			spi_e2_num.e2_write->con=1;
			spi_e2_num.e2_write=spi_e2_num.e2_write->next;
			spi_e2_num.e2_write->num=((address+l)<<1);
			spi_e2_num.e2_write->con=1;
			spi_e2_num.e2_write=spi_e2_num.e2_write->next;
			for(i=0;i<16;i++)
			{   
				if(l==length)
				break;
				spi_e2_num.e2_write->num=*(p+l);
				spi_e2_num.e2_write->con=1;
				spi_e2_num.e2_write=spi_e2_num.e2_write->next;
				spi_e2_num.e2_write->num=(*(p+l))>>8;
				spi_e2_num.e2_write->con=1;
				spi_e2_num.e2_write=spi_e2_num.e2_write->next;
				l++;
			}
			spi_e2_num.e2_r_full=0;
			spi_con=2;
		}
		TIME_PR_ADD();
		KICK_DOG();
	}
}

unsigned int SPI_WAIT()
{
	/*
	unsigned int i;
	if(spi_e2_num.e2_r_full==2)
	{
		for(i=0;i<40000;i++);
		return 1;		
	}
	else
		return 0;
	*/
	if(spi_con==4)
	{
		if(spi_e2_num.e2_r_full==2)
		{
			spi_e2_num.e2_r_full=0;
			spi_con=0;
		}
	}
	if(spi_con==3)
	{
		if(spi_e2_num.e2_r_full==1)
		{
			spi_e2_num.e2_r_full=0;
			spi_con=0;
		}
	}
	else if(spi_con==2)
	{
		if(old_t==0)
		{
			SPITXBUF=0x0600;
			old_t++;
		}
		else if(old_t==1)
		{
			if(spi_e2_num.e2_r_full==1)
			{
				spi_e2_num.e2_r_full=0;
				old_t++;
			//	TIME_FU(&spi_time);
			}
		}
		else if(old_t==2)
		{
			//if(TIME_OUT(&spi_time,(unsigned long)0x1f))
			//{
				//SPI_E2PROM_WRITEWORD(500,0x63);
				spi_e2_num.e2_read=spi_e2_num.e2_read->next;
				SPITXBUF=0x0200;
				SPITXBUF=spi_e2_num.e2_read->num<<8;
				spi_e2_num.e2_read->con=0;
				spi_e2_num.e2_read=spi_e2_num.e2_read->next;
				old_t++;
			//}
		}
		else if(old_t==3)
		{
			if(spi_e2_num.e2_r_full==2)
			{
				TIME_FU(&spi_time);
				old_t++;
			}
		}
		else
		{
			if(TIME_OUT(&spi_time,(unsigned long)0xa1f))
			{
				old_t=0;
				spi_e2_num.e2_r_full=0;
				spi_con=0;
			}
		}
	}
	else if(spi_con==1)
	{
		if(spi_e2_num.e2_r_full==2)
		{
			e2_word.byte++;
			spi_e2_num.e2_r_full=0;
			spi_con=0;
		}
	}
	if(spi_con==0)
	return 1;
	else
	return 0;
}
void READ_E2PROM_L_WORDS(unsigned int address,unsigned int length,unsigned int *p)
{   
	unsigned int i;
	for(i=0;i<length;)
	{
		SPI_WAIT();
		if(SPI_E2PROM_READWORD(address+i))
		{
			*(p+i)=e2_word.byte_1_read;	
			i++;
		}
		TIME_PR_ADD();
		KICK_DOG();
	}
}
void WRITE_CANSHU()
{	
}

⌨️ 快捷键说明

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