📄 cat24wc64p.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 + -