📄 at24c02.c
字号:
/*
*********************************************************************************************************
* 80-CPU-5
*
* MainBoard Program for Bt0502
*
* 2004\05\10
*
* V1.00
*
* File : At24c02.C
* By : H.H
*********************************************************************************************************
*/
#include <REG52.h>
#include <intrins.h>
#include "At24c02.h"
#include "main.h"
//-------------------------for Fm24Cxx EEPROM-------------------
#ifdef HaveFm24Cxx
sbit SCL = P2^6;
sbit SDA = P2^7;
//------------------------------------------------------------
#define WR_DEVICE_ADDR 0xa0
#define RD_DEVICE_ADDR 0xa1
#define I2NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//2005/11/25 //double _nop_()..
//------------------------------------------------------------//2005-12-03
void Start()
{
I2NOP;
SCL=0;
I2NOP;
SDA=1;
I2NOP;
SCL=1;
I2NOP;
SDA=0;
I2NOP;
I2NOP;
}
//------------------------------------------------------------
void Stop()
{
I2NOP;
SCL=0;
I2NOP;
SDA=0;
I2NOP;
SCL=1;
I2NOP;
SDA=1;
I2NOP;
I2NOP;
}
//------------------------------------------------------------
void Init(void)
{
Stop();
}
//------------------------------------------------------------
bit MasterAsTraAck(void)
{
I2NOP;
SCL=0;
I2NOP;
SDA=1;
I2NOP;
SCL=1;
I2NOP;
return !SDA; //传送方使SDA在地九个SCL变高释放SDA以便接收者拉低SDA告知传送方
}
//------------------------------------------------------------
void MasterAsRecAck(void)
{
I2NOP;
SCL=0;
I2NOP;
SDA=0;
I2NOP;
SCL=1;
I2NOP;
SCL=0;
I2NOP;
SDA=1;//使I/O口为输入状态
I2NOP;
}
//------------------------------------------------------------
void MasterAsRecNoAck(void)
{
I2NOP;
SCL=0;
I2NOP;
SDA=1;
I2NOP;
SCL=1;
I2NOP;
}
//------------------------------------------------------------
bit Write8Bit(uchar input)
{
unsigned char i;
for( i=0; i<8; i++ ){
SCL=0;
I2NOP;
SDA=(bit)(input&0x80);
I2NOP;
input<<=1;
SCL=1;
I2NOP;
}
//写完一个字节就启动ASK测试一下接器件(接收方)是否接收正确
return MasterAsTraAck();
}
//------------------------------------------------------------
uchar Read8Bit(void)
{
unsigned char i,rbyte=0;
for( i=0; i<8; i++ ){
rbyte<<=1;
SCL=0;
I2NOP;
SCL=1;
I2NOP;
if(SDA){
rbyte++;
}
}
return(rbyte);
}
//------------------------------------------------------------
bit At24Write( uint Addr, uint len, uchar * buf )
{
uint i;
bit result = FALSE;
/* if( len==0 ){
return FALSE;
}*/
if(( len==0 )||(len > U_I_BUFF_LENGTH )){//2005/12/09
return FALSE;
}
Init();
Start();
if( Write8Bit( WR_DEVICE_ADDR )){ //写设备地址
if( Write8Bit( Addr>>8 )){ //写eeprom 地址的MSB(A12-A8)
if( Write8Bit(Addr) ){ //写eeprom 地址的MSB(A7-A0)
for( i=0; i<len; i++ ){
if( Write8Bit( buf[i] ) ){
result=TRUE;
}
else{
result = FALSE;
break;
}
}
}
}
}
Stop();
return result;
}
//------------------------------------------------------------
//
//------------------------------------------------------------
bit At24Read( uint Addr, uint len, uchar *buf )
{
uint i;
bit result = FALSE;
/* if( len == 0 ){
return FALSE;
}*/
if(( len==0 )||( len > U_I_BUFF_LENGTH )){//2005/12/09
return FALSE;
}
Init();
Start();
if( Write8Bit( WR_DEVICE_ADDR )){ //写设备地址,且为写命令
if( Write8Bit(Addr>>8) ){ //写eeprom 地址的MSB(A12-A8)
if( Write8Bit( Addr )){ //写eeprom 地址的MSB(A7-A0)
Start();
if( Write8Bit( RD_DEVICE_ADDR )){//写设备地址,且为读命令
i=0;
while(1){
buf[i]=Read8Bit();
i++;
if( i == len ){
MasterAsRecNoAck();
result = TRUE;
break;
}
else{
MasterAsRecAck();
}
}
}
}
}
}
Stop();
return result;
}
#endif //for #ifdef HaveFm24Cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -