打印

为什么不能读取AT24C01?内有程序,请大家帮忙!

[复制链接]
2327|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2007-6-18 02:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//-----***-IIC延时-***-----//
void IicWait(void)
{
    _nop_();//01
    _nop_();//02
    _nop_();//03
    _nop_();//04
    _nop_();//05
    _nop_();//06
    _nop_();//07
    _nop_();//08
    _nop_();//09
    _nop_();//10
    _nop_();//11
    _nop_();//12
    //_nop_();//13
    //_nop_();//14
    //_nop_();//15
}
//-----***-IIC启示-***-----//
void IicStart(void)                                                        
{
    IicSda=1;
    IicWait();
    IicScl=1;
    IicWait();
    IicSda=0;
    IicWait();
    IicScl=0;
    IicWait();
}
//-----***-IIC停止-***-----//
void IicStop(void)                                                        
{
    IicSda=0;
    IicWait();
    IicScl=1;
    IicWait();                                                        
    IicSda=1;
    IicWait();
}
//-----***-IIC应答-***-----//
void SendAcknowledge(bit ack)                                                
{
    IicSda=ack;
    IicScl=1;
    IicWait();
    IicScl=0;
    IicWait();
}             
//-----***-从slave端读取一个数据-***-----//
unsigned char IicReceiveByte(void)
{
    unsigned char i;
    unsigned char bytedata=0;
    IicSda=1;
    for(i=0;i<8;i++)
    {
        IicScl=1;
        IicWait();
        bytedata<<=1;
        if (IicSda) bytedata |=0x01;
        IicScl=0;
        IicWait();
    }
    return bytedata;
}
//-----***-传送一个 Byte 数据到 slave-***-----//
bit IicSentByte(unsigned char DataByte)                                    
{
    unsigned char i;
    bit ack;
    for(i=0;i<8;i++)
    {
        if(DataByte & 0x80)
        {
            IicSda=1;
        }
        else
        {
            IicSda=0;
        }
        DataByte <<=1;
        IicWait();
        IicScl=1;
        IicWait();
        IicScl=0;
        IicWait();
    }
    IicSda=1;
    IicWait();
    IicScl=1;
    IicWait();
    ack=IicSda;
    IicScl=0;
    IicWait();
    return ack;
}
//-----***-无扇区读---单字节-***-----//
unsigned char FgTimeout;
//读取指定器件无扇区指定地址单字节的数据
//Device=器件地址---单字节
//DataAdd=字节地址---单字节
unsigned char IicByteRead(unsigned char Device,unsigned char DataAdd)      
{
    unsigned char bytedata;
    EA=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    bytedata=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    EA=1;
      return bytedata;
}
//-----***-无扇区读---多字节-***-----//
//读取指定器件无扇区指定地址多字节数据到指定地址
//Device=器件地址---单字节 
//DataAdd=字节地址---单字节
void IicMuchByteRead(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i;
    EA=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    for(i=0;i<DataLend-1;i++)
    {
        *DataDptr=IicReceiveByte();
        DataDptr++;
        SendAcknowledge(0);
    }
    *DataDptr=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    EA=1;
}
/*
//-----***-有扇区读---单字节-***-----//
//读取指定器件有扇区指定地址中单字节的数据
//Device=器件地址---单字节 
//DataPage=扇区地址---单字节 
//DataAdd=字节地址---双字节)
unsigned char IicPageByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd)
{
    unsigned char data bytedata;
    ET1=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataPage);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    bytedata=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    ET1=1;
      return bytedata;
}
//-----***-有扇区读---多字节-***-----//
//读取指定器件有扇区指定地址中的多字节数据
//Device=器件地址---单字节 
//DataPage=扇区地址---单字节 
//DataAdd=字节地址---双字节)
void IicPageMuchByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataLend)           //读取指定器件指定地址中的数据
{
    unsigned char i;
    ET1=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataPage);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    for(i=0;i<DataLend-1;i++)
    {
        IIcBuf=IicReceiveByte();
        SendAcknowledge(0);
    }
    IIcBuf=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    ET1=1;
}
*/
//-----***-无扇区写---单字节-***-----//
//写入指定器件无扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte)
{
    unsigned char i;
    bit ack;
    if(PgIIcEn)
    {
        IicWp=0;
        EA=0;
        for(i=0;i<3;i++)
        {
            IicStart();
            ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
            ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
            ack=IicSentByte(DataByte);if(ack==1){IicStop();continue;}
            IicStop();
            if(ack==0)
            {
                MataStData&=0xfd;
                break;
            }
            else
            {
                MataStData|=0x02;//硬件故障---IIC故障
            }
        }
        IicWp=1;
        EA=1;
        Delay(1000);
    }    
}
//-----***-无扇区写---多字节-***-----//
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char i,j;
    bit ack;
    if(PgIIcEn)
    {
        IicWp=0;
        EA=0;
        for(i=0;i<3;i++)
        {
            IicStart();
            ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
            ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
            for(j=0;j<DataLend;j++)
            {
                ack=IicSentByte(*DataDptr);if(ack==1){IicStop();continue;} 
                DataDptr++;
            }
            IicStop();
            if(ack==0)
            {
                MataStData&=0xfd;
                break;
            }
            else
            {
                MataStData|=0x02;//硬件故障---IIC故障
            }
        }
        IicWp=1;
        EA=1;
        Delay(1500);
    }
}
/*
//-----***-有扇区写---单字节-***-----//
//写入指定器件有扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataPage=扇区地址---单字节
//DataAdd=字节地址---双字节
void IicPageByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataByte)
{
    unsigned char data i;
    bit ack;
    ET1=0;
    FgTimeout=1;
    IicWp=0;
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataByte); if(ack==1){IicStop();continue;}
        IicStop();
        FgTimeout=0;
        if(ack==0)break;
    }
    Delay(50);
    IicWp=1;
    ET1=1;
}  
//-----***-有扇区写---多字节-***-----//
//写入指定器件有扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataPage=扇区地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicPageMuchByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned int *DataDptr,unsigned char DataLend)
{
    unsigned char data i,j;
    bit ack;
    ET1=0;
    FgTimeout=1;
    IicWp=0;
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        for(j=0;j<DataLend;j++)
        {
            ack=IicSentByte(*DataDptr); if(ack==1){IicStop();continue;} 
            DataDptr++;
        }
        IicStop();
        FgTimeout=0;
        if(ack==0)break;
    }
    Delay(50);
    IicWp=1;
    ET1=1;
}
*/

相关帖子

沙发
HotPower| | 2007-6-18 02:16 | 只看该作者

这种事情250%都是时序问题~~~

使用特权

评论回复
板凳
雁舞白沙|  楼主 | 2007-6-18 02:38 | 只看该作者

既然是时序问题,为什么可以读取24C02----24C256,确不能读24C01

使用特权

评论回复
地板
雁舞白沙|  楼主 | 2007-6-18 03:05 | 只看该作者

是否24C01和24C02的时序不一样?

使用特权

评论回复
5
HotPower| | 2007-6-18 03:10 | 只看该作者

看的有些眼晕~~~再模块化些~~~

使用特权

评论回复
6
HotPower| | 2007-6-18 03:24 | 只看该作者

晕~~~明天见~~~

使用特权

评论回复
7
ayb_ice| | 2007-6-18 08:22 | 只看该作者

那你去找2402和2401的区别啊。。。

使用特权

评论回复
8
zhaoyu2005| | 2007-6-18 09:36 | 只看该作者

AT24C01和AT24C02的时序一样

LZ你确定是AT24C01吗?后边带什么字没?还有你买的片子是否是真的?

使用特权

评论回复
9
雁舞白沙|  楼主 | 2007-6-18 12:57 | 只看该作者

确定没有问题!

并且此程序在

PIC

ATMEL

LPC

时钟从4M---12M都没有问题!运行都正常!

可是在HC908JK8里面运行却不正常,实在不明白错误在那里,

时钟从4M---12M都没有问题!

使用特权

评论回复
10
古道热肠| | 2007-6-19 10:56 | 只看该作者

HC908JK8单片机读写24XX你有没成功过?

  如果没成功,多半是换单片机差异引起的。如果成功过,如是找不出24CXX的差异性的话,你要怀疑硬件了,用示波器查吧!

使用特权

评论回复
11
jimoom| | 2007-6-19 13:04 | 只看该作者

AT24C01型号对嘛?

AT24C01  和 AT24C01A 时序是不一样的

AT24C01A 和 AT后续的器件 才完全兼容的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

243

粉丝