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

📄 eeprom.h

📁 C语言实现的24系列EEPROM的读写程序
💻 H
字号:
//**********************************************************************//
//					EEprom读写函数										//
//																//
//																		//
//**********************************************************************//




static bit      	_F0;
static volatile bit	_SDA	@ (unsigned)&PORTC*8+4;
static volatile bit	_SCL	@ (unsigned)&PORTC*8+3;

//***************************************
//	启动I2C总线的函
//***************************************
void I2C_Start(void)
    {
        //启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变
        _SDA=1;
        _SCL=1;
        DelayUs(DELAY_TIME);
        _SDA=0;
        DelayUs(DELAY_TIME);
        _SCL=0;
        DelayUs(DELAY_TIME);
    }
//***************************************
//		终止I2C总线
//***************************************
void  I2C_Stop(void)
    {
        //终止I2C总线,当SCL为高电平时使SDA产生一个正跳变
        _SDA=0;
        _SCL=1;
        DelayUs(DELAY_TIME);
        _SDA=1;
        DelayUs(DELAY_TIME);
        _SCL=0;
        DelayUs(DELAY_TIME);
    }
//***************************************
//		发送0
//***************************************
void SEND_0(void)   // SEND ACK 
    {
        //发送0,在SCL为高电平时使SDA信号为低
        _SDA=0;
        _SCL=1;
        DelayUs(DELAY_TIME);
        _SCL=0;
        DelayUs(DELAY_TIME);
    }
//***************************************
//		发送1
//***************************************
void SEND_1(void)
    {
        //发送1,在SCL为高电平时使SDA信号为高
        _SDA=1;
        _SCL=1;
        DelayUs(DELAY_TIME);
        _SCL=0;
        DelayUs(DELAY_TIME);
    }
//***************************************
//	发送完一个字节后检验设备的应答信号
//***************************************
bit Check_Acknowledge(void)
    {
        //发送完一个字节后检验设备的应答信号
        _SDA=1;
        _SCL=1;
        TRISC!=0x10;				//改变端口的方向
        DelayUs(DELAY_TIME/2);
        _F0=_SDA;
        DelayUs(DELAY_TIME/2);
        _SCL=0;
        DelayUs(DELAY_TIME);
        TRISC&=0xEF;
        if(_F0)
            return FALSE;
        return TRUE;
    }
//***************************************
//		向I2C总线写一个字节
//***************************************
void WriteI2CByte(char b)
    {
        //向I2C总线写一个字节
        char i;
        for(i=0;i<8;i++)
        if((b<<i)&0x80)
            SEND_1();
        else
            SEND_0();
    }

//***************************************
//		从I2C总线读一个字节
//***************************************
unsigned char ReadI2CByte(void)
    {
        //从I2C总线读一个字节
        char b=0,i;
        for(i=0;i<8;i++)
        {
            _SDA=1;    //释放总线
            TRISC|=0x10;
            _SCL=1;    //接受数据
            DelayUs(10);
            _F0=_SDA;
            DelayUs(10);
            _SCL=0;
            if(_F0)
                {
                    b=b<<1;
                    b=b|0x01;
                }
            else
                b=b<<1;
        }
        TRISC&=0xEF;		//改变端口的方向
        DelayUs(10);
        return b;
    }
    
//**********以下为读写24c02的函数**********/

//*******************************************
//		向24C02写一个字节
//*******************************************
void Write_One_Byte(char addr,char thedata)
	{
          static bit acktemp;
          /*write a byte to mem*/
          acktemp=1;
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          WriteI2CByte(thedata);/*thedata*/
          acktemp=Check_Acknowledge();
          I2C_Stop();
	}

//*******************************************
//		向24C02写一个页(8字节)
//*******************************************
void Write_A_Page(char *buffer,char addr)
	{
          static bit acktemp;
//          static bit wrtmp;
          int i;
          acktemp=1;
          /*write a page to at24c02*/
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          for(i=0;i<8;i++)
          {
            WriteI2CByte(buffer[i]);
            if(!Check_Acknowledge())
                {
                I2C_Stop();
                }
           }
          I2C_Stop();
	}
//***************************************
//		从24C02处读取一个字节
//***************************************
char Read_One_Byte(char addr)
	{       
	  static bit acktemp;
          char mydata;
           //read a byte from mem*/
          acktemp=1;
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          I2C_Start();
          WriteI2CByte(0xa1);
          acktemp=Check_Acknowledge();
          mydata=ReadI2CByte();
          acktemp=Check_Acknowledge();
          I2C_Stop();
          return mydata;
	}
//*******************************************
//		从24C02读N个字节
//*******************************************

void Read_N_Bytes(char *buffer,char n,char addr)
	{
          static bit acktemp;
          int i=0;
          acktemp=1;
           /*read 8 bytes from mem*/
          I2C_Start();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);/*address*/
          acktemp=Check_Acknowledge();
          I2C_Start();
          WriteI2CByte(0xa1);
          acktemp=Check_Acknowledge();
          for(i=0;i<n;i++)
          {
                buffer[i]=ReadI2CByte();
                if(i!=n-1)
                    SEND_0();    //发送应答*/
                else
                    SEND_1();    //发送非应答*/
          }
   	I2C_Stop();
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -