论坛元老
 
- 积分
- 3571
- 金钱
- 3571
- 注册时间
- 2014-12-2
- 在线时间
- 365 小时
|
发表于 2016-3-7 16:58:50
|
显示全部楼层
你看看我之前写的代码:
[mw_shl_code=c,true]
# include "AT24C02.h"
# include "i2c.h"
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_write(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
while (len > 0)
{
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**再写入操作地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**写入数据**/
while (len > 0)
{
if (I2CWrite(*buf++)) return 0x22; //若不能接受数据,则退出
len--;
addr++;
if ((addr&0x07) == 0) break; //若到达下一页,则翻页
}
I2CStop(); //停止本页写操作
}
return 0x00; //写入成功返回0
}
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_read(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**告知其即将操作的地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**重启总线开始读取**/
I2CStart();
if (I2CWrite(0xA3)) return 0x22; //若没有应答,则退出
while (--len) *buf++ = I2CRead(0); //读取足数的字节
*buf = I2CRead(1); //读取最后一个字节并返回非应答位
I2CStop();
return 0x00; //读取成功返回0
}
[/mw_shl_code] |
|