⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c02.c

📁 FLASH储存器24C256系列读写子程序
💻 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 + -