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

📄 seeprom.c

📁 Tornado 2.0 BSP for HaeDong HD860-R3 韩国HaeDong公司开发的基于Motorola的MPC860处理器的开发板的BSP
💻 C
字号:
 
#include "seeprom.h"


/**************************************************************************/
/*	SEEPROM(24C64) Byte Read & Write Functions Definition                 */
/**************************************************************************/

unsigned char addhi, addlo, addlo2, rwdata, a, c, rddata;

void seeprom_nop(void)
{
	unsigned int i;
	for(i =0;i<0x1000;i++);

} 
 
void seeprom_write(void)
{

	seeprom_start();
 	a = addhi;
 	a = a << 1;
 	a = a | 0xA0;
 	a = a & 0xAF;
 	seeprom_sendb();
 	seeprom_ack();
 	
 	a = addlo;
  	seeprom_sendb();
 	seeprom_ack();
 	
 	a = addlo2;
  	seeprom_sendb();
 	seeprom_ack();
 	
 	a = rwdata;
 	seeprom_sendb();
 	seeprom_ack();
 	seeprom_stop();
}
 
void seeprom_poll(void)
{
	do{
 		seeprom_start();
 		a = 0xa0;
 		seeprom_sendb();
 		seeprom_ack();
 	}while(c);
 	seeprom_stop();
}
 
void seeprom_read(void)
{
	
	seeprom_start();
 	a = addhi;
 	a = a << 1;
 	a = a | 0xa0;
 	seeprom_sendb();
 	seeprom_ack();
 	
 	a = addlo;
 	seeprom_sendb();
 	seeprom_ack();
 	
 	a = addlo2;
 	seeprom_sendb();
 	seeprom_ack();
 	
 	
 	seeprom_start();
 	a = addhi;
 	a = a << 1;
 	a = a | 0xa1;
 	seeprom_sendb();
 	seeprom_ack();
 	
 	seeprom_readb();
/* 	rddata = a;*/
 	SetSDA();
 	seeprom_clock();
 	seeprom_stop();
}
 
 
void seeprom_start(void)
{
 	SetSDA();
 	SetSCL();
 	seeprom_nop();
 	ResetSDA();
 	seeprom_nop();
 	seeprom_nop();
 	seeprom_nop(); 	
 	ResetSCL();
 	seeprom_nop();
 	
}
 
void seeprom_stop(void)
{
 	SetSCL();
 	seeprom_nop();
 	ResetSDA();
 	seeprom_nop();
 	SetSDA();
 	seeprom_nop();
}
 
void seeprom_clock(void)
{
	seeprom_nop();
 	SetSCL();
 	seeprom_nop();
/* 	c = ACK();
	seeprom_nop(); 	*/
 	ResetSCL();
}
 
void seeprom_ack(void)
{
	unsigned int save, i;
	unsigned int *pbdir = (unsigned int *)REG_PBDIR;
	unsigned int *pbdat = (unsigned int *)REG_PBDAT;	

	seeprom_nop();
	save = *pbdir;
	*pbdir &= ~0x10;

 	SetSCL();
 	seeprom_nop();
	c = (*pbdat & B_SDA);
	for(i=0;i<0x100;i++){
		c = (*pbdat & B_SDA);
		if(c== 0)
			break;
	}
	seeprom_nop();	
	seeprom_nop();	
	seeprom_nop();	
	seeprom_nop();				
	ResetSCL();
	*pbdir |=0x10;
}
 
void seeprom_sendb(void)
{
 	int i;
 	unsigned char tdata;
	
 	tdata = a;

 	for(i=0;i<8;i++)
 	{
 		if(tdata & 0x80)
 			SetSDA();
 		else
 			ResetSDA();
 		 		
 		seeprom_clock();
 		
 		tdata = tdata << 1;
 	}

	SetSDA(); /* lisong */ 	
}
 
void seeprom_readb(void)
{
	unsigned int save, i, temp;
	unsigned int *pbdir = (unsigned int *)REG_PBDIR;
	unsigned int *pbdat = (unsigned int *)REG_PBDAT;	

	seeprom_nop();
	save = *pbdir;
	*pbdir &= ~0x10;
 	
 	a = 0;
 	for(i=0;i<8;i++)
 	{

		seeprom_nop();
	 	SetSCL();
//	 	printf(" pbdat is %x\n", *pbdat & 0x10);
	 	if(*pbdat & 0x10)
			a = (a<<1) + 1;
	 	else
	 		a = a<<1;

	 	seeprom_nop();
	 	ResetSCL();
 		 			
 	}
 	rddata = a;
	*pbdir |=0x10; 	
}

/* add : 0..2047 */
void seeprom_writeToEEPROM(unsigned long add, unsigned char d)
{
	addhi = (unsigned char)(add >> 16);
	addlo = (unsigned char)((add >> 8) & 0x000000ff);
	addlo2 = (unsigned char)(add & 0x000000ff);
	
	rwdata = d;
	seeprom_write();
}

/* add : 0..2047 */
unsigned char seeprom_readFromEEPROM(unsigned long add)
{
	addhi = (unsigned char)(add >> 16);
	addlo = (unsigned char)((add >> 8) & 0x000000ff);
	addlo2 = (unsigned char)(add & 0x000000ff);
	
	seeprom_read();
	return rddata;
} 
 
int initI2C()
{
	volatile unsigned short *cpcr  = (unsigned short *)REG_CPCR;
	volatile unsigned int   *pbdir = (unsigned int *  )REG_PBDIR;
	volatile unsigned int   *pbdat = (unsigned int *  )REG_PBDAT;
	volatile unsigned int   *pbpar = (unsigned int *  )REG_PBPAR;
	volatile unsigned int   *pbodr = (unsigned int *)REG_PBODR;

	*pbpar &= ~0x30;
	*pbdir |=  0x30;	
	*pbodr |=  0x30;
	*pbdat |=  0x30;

//	printf(" address of pbpar %x, pbdat %x, pbdir %x", pbpar, pbdat, pbdir);	
//	printf(" value of   pbpar %x, pbdat %x, pbdir %x", *pbpar, *pbdat, *pbdir);
	*cpcr = (CP_FLG	| CP_I2C);
	while(*cpcr & CP_FLG);

}

⌨️ 快捷键说明

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