📄 cat24wc16p.c
字号:
/***********************************************************************************
CAT24WC16P非遗失存储芯片控制程序 CAT24WC16P.C
MCU 型号: Philips P89C668
时钟频率: 11.0592 MHz 6Clock
接口方式: I2C 100KHz
开发环境: Keil C51 V7.06
开发日期: 2003.08.27
修改日期:2004.04.27
程序编写: BaoFang
***********************************************************************************/
#include <REG668.H>
#include <I2C.H>
/*宏uchar定义*/
#define uchar unsigned char
/*宏uint定义*/
#define uint unsigned int
#define CAT24WC16P_ADDRESS 0xA0 // I2C write address of CAT24WC16P
/*******************************************************************
检查CAT24WC16P忙
函数原型: bit CAT24WC16P_ready();
功能: 检查CAT24WC16P
返回0--CAT24WC16P忙
返回1--CAT24WC16P准备
*******************************************************************/
bit CAT24WC16P_ready()
{
I2C_GetBus(); /*启动总线*/
I2C_Send(CAT24WC16P_ADDRESS); /*发送器件地址,若无应答则返回0*/
if(S1STA!=0X18)
{
S1CON=0XD5;
return(0);
}
return(1); /*发送器件地址,应答则返回1*/
}
/*******************************************************************
从CAT24WC16P器件随机地址读入N字节数据函数(N<=2048)(地址:0-2047)
函数原型: bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
数据地址(0-7FF),读入的内容在指向的存储区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;
suba_high = suba_high << 1;
suba_high |= CAT24WC16P_ADDRESS;
while(!CAT24WC16P_ready()); //等待CAT24WC16P的准备就绪
I2C_GetBus(); //启动总线
I2C_Send(suba_high); //发送器件地址,三位高地址a10,a9,a8, 0 ,若无应答则返回
if(S1STA!=0X18)
{
S1CON=0XD5;
return(0);
}
I2C_Send(suba_low); //发送器件子地址低字节,若无应答则返回
if(S1STA!=0X28)
{
S1CON=0XD5;
return(0);
}
S1CON=0XE5; //重新启动总线
while(SI==0);
I2C_Send(suba_high+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);
}
/*******************************************************************
向CAT24WC16P器件页写入N字节数据函数
函数原型: bit CAT24WC16P_PageW(uint suba,uchar suba_size,uchar *s)
功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
数据页地址suba(0-FF),写入的内容在s指向的存储区读N个字节。
如果返回1,表示操作成功,否则操作有误。
********************************************************************/
bit CAT24WC16P_PageW(uint suba,uchar suba_size,uchar *s)
{
uchar i;
uchar suba_high,suba_low;
suba_high = suba/256;
suba_low = suba%256;
suba_high = suba_high << 1;
suba_high |= CAT24WC16P_ADDRESS;
while(!CAT24WC16P_ready()); //等待CAT24WC16P的准备就绪
I2C_GetBus(); //启动总线
I2C_Send(suba_high); //发送器件地址,三位高地址a10,a9,a8, 0 ,若无应答则返回
if(S1STA!=0X18)
{
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);
}
/*******************************************************************
从CAT24WC16P器件随机地址写入N字节数据函数(N<=16)(地址:0-2047)
函数原型: bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
数据地址(0-7FF),写入的内容在指向的存储区N个字节。
如果返回1,表示操作成功,否则操作有误。
********************************************************************/
bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
{
char i;
i = (uiAddress%16) + ucSize - 16;
if( i > 0 )
{
CAT24WC16P_PageW(uiAddress,ucSize - i,uc_Data);
//CAT24WC16P_PageW(uiAddress + ucSize - i,i,uc_Data);
//BUG?
CAT24WC16P_PageW(uiAddress + ucSize - i,i,uc_Data + ucSize - i);
return(1);
}
else
{
CAT24WC16P_PageW(uiAddress,ucSize,uc_Data);
return(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -