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

📄 cat24wc64p.c

📁 一个流量控制仪器的源码
💻 C
字号:
/***********************************************************************************

CAT24WC64P非遗失存储芯片控制程序  CAT24WC64P.C

MCU 型号: Philips P89C668
时钟频率: 11.0592 MHz
接口方式: I2C 100KHz
开发环境: Keil C51 V7.04	
开发日期: 2003.05.07
修改日期:2004.04.27
程序编写: BaoFang
	
***********************************************************************************/

#include <REG668.H>

#include <I2C.H>


/*宏uchar定义*/ 
#define uchar unsigned char

/*宏uint定义*/
#define uint unsigned int


#define CAT24WC64P_ADDRESS 0xA0                 // I2C write address of CAT24WC64P


/*******************************************************************
			检查CAT24WC64P忙
函数原型: bit CAT24WC64P_ready();
功能: 检查CAT24WC64P
      返回0--CAT24WC64P忙
      返回1--CAT24WC64P准备
*******************************************************************/

bit CAT24WC64P_ready()
{
        I2C_GetBus();          /*启动总线*/
	
	I2C_Send(CAT24WC64P_ADDRESS);         /*发送器件地址,若无应答则返回0*/
	if(S1STA!=0X18)
	{
		S1CON=0XD5;
		return(0);
	}

        return(1);                              /*发送器件地址,应答则返回1*/
}


/*******************************************************************
	从CAT24WC64P器件随机地址读入N字节数据函数(N<=8192)(地址:0-8191)
函数原型: bit	fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 	从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
	数据地址(0-1FFF),读入的内容在指向的存储区N个字节。
	如果返回1,表示操作成功,否则操作有误。
********************************************************************/
bit	fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
{
        uchar i;
        uchar suba_high,suba_low;

        suba_high = uiAddress/256;
        suba_low = uiAddress%256;

        while(!CAT24WC64P_ready()); 	    //等待CAT24WC64P的准备就绪
	

        I2C_GetBus();                           //启动总线
	
	I2C_Send(CAT24WC64P_ADDRESS);         //发送器件地址,若无应答则返回
	if(S1STA!=0X18)
	{
		S1CON=0XD5;
		return(0);
	}
	
	I2C_Send(suba_high);        //发送器件子地址高字节,若无应答则返回
	if(S1STA!=0X28)
	{
		S1CON=0XD5;
		return(0);
	}

	I2C_Send(suba_low);        //发送器件子地址低字节,若无应答则返回
	if(S1STA!=0X28)
	{
		S1CON=0XD5;
		return(0);
	}


	S1CON=0XE5; 		//重新启动总线
	while(SI==0);
	
	I2C_Send(CAT24WC64P_ADDRESS+1);       //发送器件地址,若无应答则返回
	if(S1STA!=0X40)
	{
		S1CON=0XD5;
		return(0);
	}
	
	for(i=0;i<ucSize-1;i++)
	{
		S1CON=0XC5; 	//接收一字节数据并发送应答位
		while(SI==0); 	//等待接收数据
		if(S1STA!=0X50)
		{
			S1CON=0XD5;
			return(0);
		}
		
		*uc_Data = S1DAT; 	//读取数据
		uc_Data++;
	}
	
	S1CON=0XC1; 		//接收最后一字节数据并发送非应答位
	while(SI==0);
	*uc_Data=S1DAT;
	
	S1CON=0XD5; //结束总线
	
	return(1);        
}


/*******************************************************************
			向CAT24WC64P器件页写入N字节数据函数
函数原型: bit CAT24WC64P_PageW(uint suba,uchar suba_size,uchar *s)
功能: 	从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
	数据页地址suba(0-FF),写入的内容在s指向的存储区读N个字节。
	如果返回1,表示操作成功,否则操作有误。
********************************************************************/
bit CAT24WC64P_PageW(uint suba,uchar suba_size,uchar *s)
{
        uchar i;
        uchar suba_high,suba_low;

        suba_high = suba/256;
        suba_low = suba%256;

        while(!CAT24WC64P_ready()); 	    //等待CAT24WC64P的准备就绪
	

        I2C_GetBus();                           //启动总线
	
	I2C_Send(CAT24WC64P_ADDRESS);         //发送器件地址,若无应答则返回
	if(S1STA!=0X18)
	{
		S1CON=0XD5;
		return(0);
	}
	
	I2C_Send(suba_high);        //发送器件子地址高字节,若无应答则返回
	if(S1STA!=0X28)
	{
		S1CON=0XD5;
		return(0);
	}

	I2C_Send(suba_low);        //发送器件子地址低字节,若无应答则返回
	if(S1STA!=0X28)
	{
		S1CON=0XD5;
		return(0);
	}
	
	for(i=0;i<suba_size;i++)
	{
		I2C_Send(*s);         //发送数据,若无应答则返回
		if(S1STA!=0X28)
		{
			S1CON=0XD5;
			return(0);
		}
		s++;
	} 
	
	S1CON=0XD5; //结束总线
	
	return(1);

        

}

/*******************************************************************
	从CAT24WC64P器件随机地址写入N字节数据函数(N<=32)(地址:0-8191)
函数原型: bit	fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 	从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
	数据地址(0-1FFF),写入的内容在指向的存储区N个字节。
	如果返回1,表示操作成功,否则操作有误。
********************************************************************/
bit	fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
{
        char i;

        i = (uiAddress%32) + ucSize - 32;

        if( i > 0 )
        {
                CAT24WC64P_PageW(uiAddress,ucSize - i,uc_Data);
                //CAT24WC64P_PageW(uiAddress + ucSize - i,i,uc_Data); 
                //BUG?
                CAT24WC64P_PageW(uiAddress + ucSize - i,i,uc_Data + ucSize - i); 
                return(1);
        }
        else
        {
                CAT24WC64P_PageW(uiAddress,ucSize,uc_Data);
                return(1);
        }

}


⌨️ 快捷键说明

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