EEPROM at24c256读写
2014-01-12 21:47
211 查看
/******************************************
*
* Description: EEPROM Read/Write.
* Author:LY
* Date: 2013-07-24
*
******************************************/
#include <c8051f340.h>
#include "at24c128.h"
//Write:0xA0,Read:0xA1 读写间须延时
#define EEPROM_ADDR 0xA0
#define DELAY_TIME 1
extern void delay(uint uiCnt);
unsigned char i2c_eeprom_byte_write(unsigned int uiAddr, unsigned char ucData)
{
unsigned char ucTmp;
unsigned int uiTmp;
unsigned char i;
SDA = 1;
SCL = 1;
delay(DELAY_TIME);
//start bit
SDA = 0;
delay(DELAY_TIME);
//device addr
ucTmp = 0xA0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//high address
uiTmp = uiAddr;
uiTmp >>= 8;
ucTmp = uiTmp;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//low address
ucTmp = uiAddr;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//data send
ucTmp = ucData;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 0;
}
unsigned char i2c_eeprom_byte_read(unsigned int uiAddr)
{
unsigned char ucTmp;
unsigned int uiTmp;
unsigned char i;
unsigned char ucData;
F0=0;
SDA = 1;
SCL = 1;
delay(DELAY_TIME);
//start bit
SDA = 0;
delay(DELAY_TIME);
//device addr
ucTmp = 0xA0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(100);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//high address
uiTmp = uiAddr;
uiTmp >>= 8;
ucTmp = uiTmp;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//low address
ucTmp = uiAddr;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//start bit
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 0;
delay(DELAY_TIME);
//device address, read
ucTmp = 0xA1;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//read data
ucData = 0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(SDA)
{
ucData |= 0x01;
}
else
{
ucData &= (~0x01);
}
if(i<7)
{
ucData <<= 1;
}
SCL = 1;
delay(DELAY_TIME);
}
//ack read, no ack----
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 1) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
}
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return ucData;
}
*
* Description: EEPROM Read/Write.
* Author:LY
* Date: 2013-07-24
*
******************************************/
#include <c8051f340.h>
#include "at24c128.h"
//Write:0xA0,Read:0xA1 读写间须延时
#define EEPROM_ADDR 0xA0
#define DELAY_TIME 1
extern void delay(uint uiCnt);
unsigned char i2c_eeprom_byte_write(unsigned int uiAddr, unsigned char ucData)
{
unsigned char ucTmp;
unsigned int uiTmp;
unsigned char i;
SDA = 1;
SCL = 1;
delay(DELAY_TIME);
//start bit
SDA = 0;
delay(DELAY_TIME);
//device addr
ucTmp = 0xA0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//high address
uiTmp = uiAddr;
uiTmp >>= 8;
ucTmp = uiTmp;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//low address
ucTmp = uiAddr;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//data send
ucTmp = ucData;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1;
}
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 0;
}
unsigned char i2c_eeprom_byte_read(unsigned int uiAddr)
{
unsigned char ucTmp;
unsigned int uiTmp;
unsigned char i;
unsigned char ucData;
F0=0;
SDA = 1;
SCL = 1;
delay(DELAY_TIME);
//start bit
SDA = 0;
delay(DELAY_TIME);
//device addr
ucTmp = 0xA0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(100);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//high address
uiTmp = uiAddr;
uiTmp >>= 8;
ucTmp = uiTmp;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//low address
ucTmp = uiAddr;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//start bit
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 0;
delay(DELAY_TIME);
//device address, read
ucTmp = 0xA1;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(ucTmp & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(DELAY_TIME);
ucTmp <<= 1;
SCL = 1;
delay(DELAY_TIME);
}
//ack read
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 0) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{ F0=1;
/* SCL = 1; //111
delay(DELAY_TIME);
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return 1; //*/
}
//read data
ucData = 0;
for(i = 0; i<8;i++)
{
SCL = 0;
delay(DELAY_TIME);
if(SDA)
{
ucData |= 0x01;
}
else
{
ucData &= (~0x01);
}
if(i<7)
{
ucData <<= 1;
}
SCL = 1;
delay(DELAY_TIME);
}
//ack read, no ack----
SCL = 0;
SDA = 1;
delay(DELAY_TIME);
if(SDA == 1) //ack ok
{
SCL = 1;
delay(DELAY_TIME);
}
else //ack error
{
SCL = 1;
delay(DELAY_TIME);
}
//stop bit send
SCL = 0;
SDA = 0;
delay(DELAY_TIME);
SCL = 1;
delay(DELAY_TIME);
SDA = 1;
return ucData;
}
相关文章推荐
- 下面程序有什么错误呢?
- Linux sed命令学习
- vim的常用命令
- vim显示标签页的序号
- Candy III
- PHP设置头部编码为UTF-8语句
- Linux crontab命令学习
- AD9516
- 软件工程-软件危机
- python itertools模块学习
- [转] C语言**位运算**终极剖析 分析的很详细
- python爬虫常用的模块
- 递归算法——归并排序,快速排序,二分查找
- C 语言中 setjmp 和 longjmp
- 2013最吃香的技能:Java称霸、Android势头正猛
- iOS- 用MapKit和CoreLocation 来实现移动设备(地图与定位)
- 据说,能把这个字符串题目做对的人,有,但寥寥无几!
- 中国名人排行榜2014年网络红人排行榜网络红人斌少
- 设计模式学习—建造者模式
- 获取WinCE已加载驱动的信息