?? 24c01.c
字號:
//**********************************************************************************
//** 一個通用的24C01-24C256共9種EEPROM的字節讀寫操作程序, ******
//** 程序有五個入口條件,分別為讀寫數據緩沖區指針, ******
//** 進行讀寫的字節數,EEPROM首址,EEPROM控制字節, ******
//** 以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多: ******
//**********************************************************************************
#pragma ot(6,SIZE)
#include "REG51RX.H"
#include "fj51_io_pin.h"
#include "DIS.H"
#include <intrins.h>
#define ERRORCOUNT 10
#define EepromType 1
//enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
//enum eepromtype EepromType;
#define M2416 4
//DataBuff為讀寫數據輸入/輸出緩沖區的首址
//ByteQuantity 為要讀寫數據的字節數量
//Address 為EEPROM的片內地址
//ControlByte 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
//表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
//EepromType為枚舉變量,需為M2401至M24256中的一種,分別對應24C01至24C256;
//函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
//ERRORCOUNT為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回1
//SDA和SCL由用戶自定義,這里暫定義為P0^0和P0^1;
//其余的不用管,只要把只子程序放在你的程序中并調用它就可以了;
bit RW24XX11(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte);
bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte) //,enum eepromtype EepromType)
{ uchar yy;
bit errorflag=1;
for(yy=0;yy<ByteQuantity;yy++)
{ if(RW24XX11(DataBuff++,1,Address++,ControlByte)==0)
{ errorflag=0;
}
else
{errorflag=1; break;}
}
return(errorflag) ;
}
/***********************************************************************************/
bit RW24XX11(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte) //,enum eepromtype EepromType)
{
void Delay(unsigned char DelayCount);
void IICStart(void);
void IICStop(void);
bit IICRecAck(void);
void IICNoAck(void);
void IICAck(void);
unsigned char IICReceiveByte(void);
void IICSendByte(unsigned char sendbyte);
unsigned char data j,i=ERRORCOUNT;
bit errorflag=1;
while(i--)
{
IICStart();
IICSendByte(ControlByte&0xfe); //寫器件地址
if(IICRecAck()) //接收應答
continue; //無應答重新再來
if(EepromType>M2416)
{
IICSendByte((unsigned char)(Address>>8)); //發長地址的高八位
if(IICRecAck())
continue;
}
IICSendByte((unsigned char)Address); //發長地址的低八位
if(IICRecAck())
continue;
if(!(ControlByte&0x01))
{ //如是寫數據 時
j=ByteQuantity;
errorflag=0; //********clr errorflag
while(j--)
{
IICSendByte(*DataBuff++);
if(!IICRecAck())
continue;
errorflag=1;
break;
}
if(errorflag==1)
continue;
break;
}
else //如是讀數據 時
{
IICStart();
IICSendByte(ControlByte);
if(IICRecAck())
continue;
while(--ByteQuantity)
{
*DataBuff++=IICReceiveByte();
IICAck();
}
*DataBuff=IICReceiveByte(); //read last byte data
IICNoAck();
errorflag=0;
break;
}
} //END WHILE DE }
IICStop();
if(!(ControlByte&0x01))
{
Delay(255);
Delay(255);
Delay(255);
Delay(255);
Delay(255);
Delay(255);
Delay(255);
}
return(errorflag);
} //END SUB DE }
/*****************以下是對IIC總線的操作子程序***/
/*****************啟動總線**********************/
void IICStart(void)
{
SCL=0; //
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1; //
}
/*****************停止IIC總線****************/
void IICStop(void)
{
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}
/**************檢查應答位*******************/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
CY=SDA; //因為返回值總是放在CY中的
SCL=0;
return(CY);
}
/***************對IIC總線產生應答*******************/
void IICACK(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SDA=1;
}
/*****************不對IIC總線產生應答***************/
void IICNoAck(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/*******************向IIC總線寫數據*********************/
void IICSendByte(unsigned char sendbyte) //先發高位
{
unsigned char data j=8;
for(;j>0;j--)
{
SCL=0;
sendbyte<<=1; //無論C51怎樣實現這個操作,始終會使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
/**********************從IIC總線上讀數據子程序**********/
unsigned char IICReceiveByte(void)
{
//register
uchar receivebyte,i=8;
SCL=0;
while(i--)
{
SCL=1;
receivebyte=(receivebyte<<1);
if(SDA)
receivebyte++;
SCL=0;
}
return(receivebyte);
}
/***************一個簡單延時程序************************/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}
//*********************************************************************************************
//一個通用的24C01-24C256共9種EEPROM的字節讀寫操作程序,*************************************
//*********************************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -