Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267162
  • 博文数量: 60
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 820
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-18 00:28
文章分类

全部博文(60)

文章存档

2010年(60)

我的朋友

分类:

2010-04-20 14:15:38

—————————————————————*/
#define SDA P0_0
#define SCL P0_1

/*----------------------------------------------------------------------------
调用方式:write_8bit(uchar ch) ﹫2001/03/23
函数说明:内函数
------------------------------------------------------------------------------*/
write_8bit(uchar ch)
{
uchar i=8;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
while (i--)
{
SDA=(bit)(ch&0x80);
_nop_();_nop_();_nop_();_nop_();_nop_();
ch<<=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();

}

/*------------------------------------------------------------------------------
--
调用方式:void ACK(void) ﹫2001/03/23
函数说明:内函数,私有,用户不直接调用。
--------------------------------------------------------------------------------
-*/
void ACK(void)
{
SDA=1;
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
time_1=5;
while(SDA) {if (!time_1) break;} //ACK
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*------------------------------------------------------------------------------
--
调用方式:void Write24LC65(uint address,uchar ddata) ﹫2001/03/23
函数说明:在指定地址address(address<0x2000)写入一个字节ddata
--------------------------------------------------------------------------------
-*/
void Write24LC65(uint address,uchar ddata)
{
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit(0xae); //写从地址
ACK();
write_8bit(address>>8);
ACK();
write_8bit(address&0x00FF);
ACK();
write_8bit(ddata);
ACK();
SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1; //STOP
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
delay(10);
}

/*------------------------------------------------------------------------------
--
调用方式:uchar Read24LC65(uint address) ﹫2001/03/23
函数说明:读取24LC65指定地址address(address<0x2000)的数据。
--------------------------------------------------------------------------------
-*/
uchar Read24LC65(uint address)
{
uchar ddata=0;
uchar i=8;
SDA=0;_nop_();SCL=0; //START
write_8bit(0xae); //写从地址
ACK();
write_8bit(address>>8);
ACK();
write_8bit(address&0x00FF);
ACK();
//以上是一个“哑”写操作,相当于设置当前地址

SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
SCL=0; //START
write_8bit(0xaf); //写从地址,置为读模式
ACK();
while (i--)
{
SDA=1;
ddata<<=1;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
if (SDA) ddata|=0x01;
}

SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1; //STOP
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
delay(5);
return ddata;
}

24c65 和24c64 可通用,俺的编程器就这样 [haotz] [50次] 01-3-24 下午 09:50:14

24LC65 I2C EEPROM字节读写驱动程序(修正版) [龙啸九天] [645次] 01-5-12 下午 12:27:07
修改,在读写EEPROM过程中关闭掉中断,否则在同时读写EEPROM和串口通讯时
会有随机的误码,请大家注意!

/*---------------------------------------------------------------------------
调用方式:void Write24LC65(uint address,uchar ddata)  ﹫2001/03/23
函数说明:在指定地址address(address<0x2000)写入一个字节ddata
-----------------------------------------------------------------------------*/
void Write24LC65(uint address,uchar ddata)
{
           EA=0;
    SCL=1;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;             //START
    write_8bit(0xae);   //写从地址
    ACK();
    write_8bit(address>>8);
    ACK();
    write_8bit(address&0x00FF);
    ACK();
    write_8bit(ddata);
    ACK();
    SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1;   //STOP
    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
           EA=1;
    delay(10);
}

/*------------------------------------------------------------------------------
调用方式:uchar Read24LC65(uint address)  ﹫2001/03/23
函数说明:读取24LC65指定地址address(address<0x2000)的数据。
------------------------------------------------------------------------------*/
uchar Read24LC65(uint address)
{
    uchar ddata=0;
    uchar i=8;
           EA=0;
    SDA=0;_nop_();SCL=0;        //START
    write_8bit(0xae);   //写从地址
    ACK();
    write_8bit(address>>8);
    ACK();
    write_8bit(address&0x00FF);
    ACK();
    //以上是一个“哑”写操作,相当于设置当前地址
   
    SCL=1;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
    SDA=0;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
    SCL=0;             //START
    write_8bit(0xaf);   //写从地址,置为读模式
    ACK();
    while (i--)
    {
        SDA=1;
        ddata<<=1;
        SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
        if (SDA) ddata|=0x01;
    }
   
    SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();SDA=1;   //STOP
    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
           EA=1;
    delay(5);
    return ddata;
}

阅读(1247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~