基于C51单片机的I2C接口EEPROM驱动程序源码

/******************************************************************************/
// 包含头文件
/******************************************************************************/
#include "config.h"
#include "eeprom.h"
#include "delay.h"


/******************************************************************************/
// 函数名称:EEPROM_Software_Reset 
// 输入参数:无
// 输出参数:无 
// 函数功能:EEPROM软件复位
/******************************************************************************/
void EEPROM_Software_Reset(void){
    uint8 i;
    IIC_Start();
    //9 clock
    scl = 0;
    sda = 1;
    for(i=0;i<9;i++){
        scl = 0;
        _nop_();//delay
        _nop_();
        scl = 1;
        _nop_();//delay
        scl = 0;
        _nop_();//delay
        _nop_();
    }
    IIC_Start();
    IIC_Stop();
}


/******************************************************************************/
// 函数名称:IIC_Start 
// 输入参数:无
// 输出参数:无 
// 函数功能:IIC发送开始信号
/******************************************************************************/
void IIC_Start(void){
    scl = 0;
    sda = 1;
    scl = 1;
    _nop_();
    sda = 0;
    _nop_();
}

/******************************************************************************/
// 函数名称:IIC_Stop 
// 输入参数:无
// 输出参数:无 
// 函数功能:IIC发送停止信号
/******************************************************************************/
void IIC_Stop(void){
    scl = 0;
    sda = 0;
    scl = 1;
    _nop_();
    sda = 1;
}

/******************************************************************************/
// 函数名称:IIC_Write_Byte 
// 输入参数:dataSend-发送字节数据
// 输出参数:无 
// 函数功能:IIC发送一个字节
/******************************************************************************/
void IIC_Write_Byte(uint8 dataSend){
    uint8 i;
    for(i=0;i<8;i++){
        scl = 0;
        if(dataSend&0x80)sda=1;    //从最高位开始写
        else sda = 0;
        _nop_();
        scl = 1;
        _nop_();
        scl = 0;
        _nop_();
        dataSend <<= 1;
    }            
}

/******************************************************************************/
// 函数名称:IIC_Ack 
// 输入参数:无
// 输出参数:返回flag=0表示写入成功 
// 函数功能:IIC应答信号
/******************************************************************************/
bit IIC_Ack(void){
    bit flag;
    scl = 0;
    sda = 1;
    _nop_();
    _nop_();
    scl = 1;
    _nop_();
    flag = sda;//读SDA
    _nop_();
    scl = 0;
    _nop_();
    _nop_();
    return flag;    
}

/******************************************************************************/
// 函数名称:IIC_NoAck 
// 输入参数:无
// 输出参数:无 
// 函数功能:IIC无应答信号
/******************************************************************************/
void IIC_NoAck(void){
    scl = 0;
    sda = 1;
    _nop_();
    _nop_();
    scl = 1;
    _nop_();
    _nop_();
    scl = 0;
    _nop_();
    _nop_();    
}

/******************************************************************************/
// 函数名称:IIC_Read_Byte 
// 输入参数:无
// 输出参数:返回读到的字节数据 
// 函数功能:读一个字节
/******************************************************************************/
uint8 IIC_Read_Byte(void){
    uint8 dataRead,i;
    for(i=0;i<8;i++){
        dataRead <<= 1;
        scl = 0;
        sda = 1;
        _nop_();
        _nop_();
        scl = 1;
        _nop_();
//        flag = sda;//读SDA
        if(sda)dataRead |= 0x01;
        _nop_();
        scl = 0;
        _nop_();
        _nop_();    
    }
    return dataRead;
}

/******************************************************************************/
// 函数名称:EEPROM_CurrentAddr_Read 
// 输入参数:devAddr-设备地址
// 输出参数:返回读到的字节数据 
// 函数功能:currentAddress Read方式读取一个字节
/******************************************************************************/
uint8 EEPROM_CurrentAddr_Read(uint8 devAddr){
    uint8 dataRead;
    IIC_Start();
    IIC_Write_Byte(devAddr);
    IIC_Ack();
    dataRead = IIC_Read_Byte();
    IIC_NoAck();
    IIC_Stop();
    return dataRead; 
}

/******************************************************************************/
// 函数名称:EEPROM_Byte_Write 
// 输入参数:devAddr-设备地址 wordAddr-字节地址 dataSend-数据
// 输出参数:无 
// 函数功能:在指定设备的字节地址写一个字节的数据
/******************************************************************************/
void EEPROM_Byte_Write(uint8 devAddr,uint8 wordAddr,uint8 dataSend){
    IIC_Start();
    IIC_Write_Byte(devAddr);
    IIC_Ack();
    IIC_Write_Byte(wordAddr);
    IIC_Ack();
    IIC_Write_Byte(dataSend);
    IIC_Ack();
    IIC_Stop();
    Delay5ms();//EEPROM发送停止信号之后需要延时5ms(EEPROM internal write/clear cycle)    
}
 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值