?? cat24wc16p.c
字號:
/***********************************************************************************
CAT24WC16P非遺失存儲芯片控制程序 CAT24WC16P.C
MCU 型號: Philips P89C668
時鐘頻率: 11.0592 MHz 6Clock
接口方式: I2C 100KHz
開發(fā)環(huán)境: Keil C51 V7.06
開發(fā)日期: 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忙
函數(shù)原型: bit CAT24WC16P_ready();
功能: 檢查CAT24WC16P
返回0--CAT24WC16P忙
返回1--CAT24WC16P準備
*******************************************************************/
bit CAT24WC16P_ready()
{
I2C_GetBus(); /*啟動總線*/
I2C_Send(CAT24WC16P_ADDRESS); /*發(fā)送器件地址,若無應(yīng)答則返回0*/
if(S1STA!=0X18)
{
S1CON=0XD5;
return(0);
}
return(1); /*發(fā)送器件地址,應(yīng)答則返回1*/
}
/*******************************************************************
從CAT24WC16P器件隨機地址讀入N字節(jié)數(shù)據(jù)函數(shù)(N<=2048)(地址:0-2047)
函數(shù)原型: bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 從啟動總線到發(fā)送地址、子地址、讀數(shù)據(jù)、結(jié)束總線的全過程,器件
數(shù)據(jù)地址(0-7FF),讀入的內(nèi)容在指向的存儲區(qū)N個字節(jié)。
如果返回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); //發(fā)送器件地址,三位高地址a10,a9,a8, 0 ,若無應(yīng)答則返回
if(S1STA!=0X18)
{
S1CON=0XD5;
return(0);
}
I2C_Send(suba_low); //發(fā)送器件子地址低字節(jié),若無應(yīng)答則返回
if(S1STA!=0X28)
{
S1CON=0XD5;
return(0);
}
S1CON=0XE5; //重新啟動總線
while(SI==0);
I2C_Send(suba_high+1); //發(fā)送器件地址,若無應(yīng)答則返回
if(S1STA!=0X40)
{
S1CON=0XD5;
return(0);
}
for(i=0;i<ucSize-1;i++)
{
S1CON=0XC5; //接收一字節(jié)數(shù)據(jù)并發(fā)送應(yīng)答位
while(SI==0); //等待接收數(shù)據(jù)
if(S1STA!=0X50)
{
S1CON=0XD5;
return(0);
}
*uc_Data = S1DAT; //讀取數(shù)據(jù)
uc_Data++;
}
S1CON=0XC1; //接收最后一字節(jié)數(shù)據(jù)并發(fā)送非應(yīng)答位
while(SI==0);
*uc_Data=S1DAT;
S1CON=0XD5; //結(jié)束總線
return(1);
}
/*******************************************************************
向CAT24WC16P器件頁寫入N字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit CAT24WC16P_PageW(uint suba,uchar suba_size,uchar *s)
功能: 從啟動總線到發(fā)送地址、子地址、讀數(shù)據(jù)、結(jié)束總線的全過程,器件
數(shù)據(jù)頁地址suba(0-FF),寫入的內(nèi)容在s指向的存儲區(qū)讀N個字節(jié)。
如果返回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); //發(fā)送器件地址,三位高地址a10,a9,a8, 0 ,若無應(yīng)答則返回
if(S1STA!=0X18)
{
S1CON=0XD5;
return(0);
}
I2C_Send(suba_low); //發(fā)送器件子地址低字節(jié),若無應(yīng)答則返回
if(S1STA!=0X28)
{
S1CON=0XD5;
return(0);
}
for(i=0;i<suba_size;i++)
{
I2C_Send(*s); //發(fā)送數(shù)據(jù),若無應(yīng)答則返回
if(S1STA!=0X28)
{
S1CON=0XD5;
return(0);
}
s++;
}
S1CON=0XD5; //結(jié)束總線
return(1);
}
/*******************************************************************
從CAT24WC16P器件隨機地址寫入N字節(jié)數(shù)據(jù)函數(shù)(N<=16)(地址:0-2047)
函數(shù)原型: bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
功能: 從啟動總線到發(fā)送地址、子地址、讀數(shù)據(jù)、結(jié)束總線的全過程,器件
數(shù)據(jù)地址(0-7FF),寫入的內(nèi)容在指向的存儲區(qū)N個字節(jié)。
如果返回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);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -