EEPROM驱动

EEPROM读写数据用I2C,关于I2C驱动见上一篇博客。


头文件 E2rom.h  :

/*******************************************************************************
* 版权所有 (C)2007,XXXXXXXXX。
*
* 文件名称:
* 文件标识:
* 内容摘要:
* 其它说明:
* 当前版本:1.0
* 作    者:XXX
* 开始日期:XXXX年X月XX日
*
* 修改记录1:
*    修改日期:
*    版 本 号:
*    修 改 人:
*    修改内容:
* 修改记录2:…
*******************************************************************************/
#ifndef _E2ROM_H
#define _E2ROM_H

BYTE WriteSingleByte_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE nValue);
BYTE PageWrite_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE *pBuf,BYTE Leth);
BYTE ReadRandom_CAT24C64(BYTE nAddr_H,BYTE nAddr_L, BYTE *nValue);
BYTE ReadSeq_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE *nValue,BYTE Leth);

#endif


源文件 E2rom.c :

/*******************************************************************************
* 版权所有 (C)2007,XXXXXXXXX。
*
* 文件名称:
* 文件标识:
* 内容摘要:
* 其它说明:
* 当前版本:1.0
* 作    者:XXX
* 开始日期:XXXX年XX月XX日
*
* 修改记录1:
*    修改日期:
*    版 本 号:
*    修 改 人:
*    修改内容:
* 修改记录2:…
*******************************************************************************/

/*******************************************************************************
// 模块运行环境配置
*******************************************************************************/
#include "AX5051_subject.h"
#include "AX5051_Registers.h"
#include "I2C.h"
/*******************************************************************************
// 模块内部定义
*******************************************************************************/

/*******************************************************************************
// 模块内部变量
*******************************************************************************/

/*******************************************************************************
* 函数名称:WriteSingleByte_CAT24C64
* 功能描述:单个字节写
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE WriteSingleByte_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE nValue)
{
    BYTE nTemp = 0xA0;  //写命令

    I2C_START();        // 启动数据总线
    I2C_TxByte(nTemp);	// 发送控制字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
        return FALSE;
    }
    I2C_TxByte(nAddr_H);	// 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_L);
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nValue);	// 发送数据字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_STOP();	// 停止总线
    Delay_ms(20);
    return TRUE;
}
/*******************************************************************************
* 函数名称:PageWrite_CAT24C64
* 功能描述:连续写
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE PageWrite_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE *pBuf,BYTE Leth)
{
    BYTE i;
    BYTE nTemp = 0xA0;      //写命令
    
    I2C_START();        // 启动数据总线
    I2C_TxByte(nTemp);	// 发送控制字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_H);        // 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_L);	// 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    for(i = 0; i < Leth;i++)	// 发送数据字节
    {
        I2C_TxByte(pBuf[i]);
        nTemp = I2C_GetACK();		// 等待 ACK
        if(nTemp & SDA) 
        {
          return FALSE;
        }
    }
    I2C_STOP();		// 停止总线
    Delayms(20);
    return TRUE;
}
/*******************************************************************************
* 函数名称:ReadRandom_CAT24C64
* 功能描述:读指定地址数据
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE ReadRandom_CAT24C64(BYTE nAddr_H,BYTE nAddr_L, BYTE *nValue)
{
    
    BYTE nTemp = 0xA0;	//写命令
    
    I2C_START();	// 启动数据总线
    I2C_TxByte(nTemp);	// 发送控制字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_H);	// 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_L);        // 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_START();	// 启动数据总线
    nTemp = 0xA1;	// 发送控制字节
    I2C_TxByte(nTemp);
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    *nValue = I2C_RxByte();	//读取数据
    I2C_STOP();	// 停止总线
    return TRUE;	//成功返回
}
/*******************************************************************************
* 函数名称:ReadSeq_CAT24C64
* 功能描述:读连续的数据串
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
*******************************************************************************/
BYTE ReadSeq_CAT24C64(BYTE nAddr_H,BYTE nAddr_L,BYTE *nValue,BYTE Leth)
{
    BYTE i;
    BYTE nTemp = 0xA0;	//写命令
    
    I2C_START();	// 启动数据总线
    I2C_TxByte(nTemp);	// 发送控制字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_H);	// 发送地址字节
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    I2C_TxByte(nAddr_L);
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE; 
    }
    I2C_START();	// 启动数据总线
    nTemp = 0xA1;	// 发送控制字节
    I2C_TxByte(nTemp);
    nTemp = I2C_GetACK();	// 等待 ACK
    if(nTemp & SDA) 
    {
      return FALSE;
    }
    for(i = 0; i < Leth; i++)	//读取数据
    {
        nValue[i] = I2C_RxByte();		//读一个字节数据
        if (i==(Leth-1))  
        {
            I2C_SetNAk();      	//发送ACK
        }
        else 
        {
            I2C_SetACK(); 
        }
    }
    I2C_STOP();	// 停止总线
    return TRUE;	//成功返回
}



你可能感兴趣的:(驱动,eeprom)