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
/******************************************************************************* * 版权所有 (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; //成功返回 }