• 大小: 532KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: 其他
  • 标签: AT24C08  I2C  驱动  

资源简介

EEPROM是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPROM芯片最常用的通讯方式是IIC协议。此代码为AT24C08的I2C驱动程序,其他型号可按照规格书自行扩展

资源截图

代码片段和文件信息

#include “AT24C08.h“

static void I2C_START(){
  IIC_SDA_H;
  IIC_SCL_H;
  halMcuWaitUs(5);
  IIC_SDA_L;
  halMcuWaitUs(4);
  IIC_SCL_L;
}

static void I2C_STOP(){
  IIC_SDA_L;
  halMcuWaitUs(2);
  IIC_SCL_H;
  halMcuWaitUs(4);
  IIC_SDA_H;
  halMcuWaitUs(5); //到下一次开始的总线最短空闲时间4.7us
}

//低电平应答,返回1表示无应答
static uint8 I2C_WaitAck(void)
{
    IIC_SDA_H;
    IIC_SCL_H;
    halMcuWaitUs(5);
    if(IIC_SDA_VALUE)
        return 1;
    IIC_SCL_L;
    halMcuWaitUs(5);
    return 0;
}

static void I2C_SendAck(void)
{
    IIC_SCL_L;
    IIC_SDA_L;
    halMcuWaitUs(5);
    IIC_SCL_H;
    halMcuWaitUs(4);
    IIC_SCL_L;
}

static void I2C_SendNoAck(void)
{
    IIC_SCL_L;
    IIC_SDA_H;
    halMcuWaitUs(5);
    IIC_SCL_H;
    halMcuWaitUs(4);
    IIC_SCL_L;
}


void I2C_WRITE(uint8 byte){
    uint8 Cnt;
    IIC_SDA_OUT;
    IIC_SCL_L;
    halMcuWaitUs(1);
    for(Cnt=0;Cnt<8;Cnt++)
    {
        if(byte&0x80)
        {
            IIC_SDA_H;
        }
        else
        {
            IIC_SDA_L;
        }
        byte<<=1;
        halMcuWaitUs(5);
        IIC_SCL_H;
        halMcuWaitUs(5);
        IIC_SCL_L;
    }
}

uint8 I2C_READ(){
    uint8 CntByte=0;
    IIC_SDA_H;
    IIC_SDA_IN;
    halMcuWaitUs(2);
    for(Cnt=0;Cnt<8;Cnt++)
    {
        Byte<<=1;
        IIC_SCL_H;
        halMcuWaitUs(5);
        if(IIC_SDA_VALUE)
            Byte++;
        IIC_SCL_L;
        halMcuWaitUs(5);
    }
    IIC_SDA_OUT;
    return Byte;
}







//写单个字节(设备地址+寄存器地址+单字节数据+停止位)数据地址为0-0xff每个地址存储一个8位字节
//at24c08设备地址第二三位表示存储阵列地址08总共有1k字节,共有四个区域,每个存储区域256字节,所以area--> 00 01 10 11
uint8 writeOneByte(uint8 Reguint8 RegValuint8 area)
{
    I2C_START();
    I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
    if(I2C_WaitAck())
        return 1;
    I2C_WRITE(Reg);
    if(I2C_WaitAck())
        return 1;
    I2C_WRITE(RegVal);
    if(I2C_WaitAck())
        return 1;
    I2C_STOP();
    return 0;



//读单个字节,读取完成后主机不需要应答,只需要停止信号
//Reg 要读的寄存器的地址
//RegVal 读出来的数据保存的地址
//0 成功  1失败
uint8 readOneByte(uint8 Reguint8 *RegValuint8 area)
{
    I2C_START();
    I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
    if(I2C_WaitAck())
        return 1;
    
    I2C_WRITE(Reg);
    if(I2C_WaitAck())
        return 1;
    
    I2C_START();
    I2C_WRITE(IIC_READ_ADDR|(area<<1));
    if(I2C_WaitAck())
        return 1;
    *RegVal=I2C_READ();
    I2C_SendNoAck();
    I2C_STOP();
    return 0;
}




//连续写多个字节(写地址自动累加,最大16字节,多的将会覆盖之前的数据)
//设备地址+寄存器地址+多字节数据+停止位
uint8 writeMutipleDatas(uint8 Reguint8* RegValuint8 countuint8 area){
uint8 i = 0;
    if(count>16)
        return 1;
I2C_START();
    I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
    if(I2C_WaitAck())
        return 1;
    I2C_WRITE(Reg);
    if(I2C_WaitAck())
        return 1;
for(;i I2C_WRITE(RegVal[i]);
if(I2C_WaitAck())return 1;
}
I2C_STOP();
    return 0;
}




//连续读多个

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     667886  2018-11-15 18:30  AT24系列E2PROM\AT24c02中文官方资料手册pdf.pdf

     文件       4538  2018-11-21 14:47  AT24系列E2PROM\AT24C08.c

     文件       1060  2018-11-16 08:50  AT24系列E2PROM\AT24C08.h

     目录          0  2018-11-26 17:57  AT24系列E2PROM

----------- ---------  ---------- -----  ----

               673484                    4


评论

共有 条评论