打印

请教,24C02 能写进去,但读不出来?

[复制链接]
4367|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qufo|  楼主 | 2010-4-14 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教,24C02 能写进去,但读不出来?                                                                                                                                                                                                                                                                                                                        如题,能写 24C02(模拟里看到),但读出来是一串0.
代码如下:复制内容到剪贴板代码:#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned int
#define ID 0xa0
#define NOP _nop_;_nop_;_nop_;_nop_;_nop_;

sbit WP =P3^7;
sbit SCL=P3^6;
sbit SDA=P2^7;

void delay(uint z)
{
        uint x,y;
        for (x=z;x>0;x--)
        {
                for (y=110;y>0;y--)
                {
                        ;
                }
        }
}

void Start()
{
        // 发送开始信号 时钟线保持高电平期间,数据线从高到低跳变
        SDA=1;
        SCL=1;
        SDA=0;
        SCL=0;
}

void Stop()
{
        // 停止 时钟保持高电平期间,数据电平从低到高跳变
        SCL=0;
        SDA=0;
        SCL=1;
        SDA=1;
}

void Write_byte(uchar dat)                 //写字节。
{
        uchar i,temp;
        temp=dat;
        for (i=0;i<8;i++)
        {
                SCL=0;
                if ((temp&0x80)==0x80)
                {
                        SDA=1;
                }
                else
                {
                        SDA=0;;
                }
                SCL=1;
                temp=temp<<1;
                NOP;
        }
        SCL=0;
}

void Wait4Ack()                 //等待应答
{
        uchar i=0;
        SCL=1;
        while ( (SDA==1) && (i<20) )
        {
                i++;
        }
        SDA=0;
        SCL=0;
}

void SendNoAck()        //发送一个不应答
{
        SDA=1;
        SCL=1;
        SCL=0;
}


void Write(uchar address,uchar dat)
{
        Start();
        Write_byte(ID);
        Wait4Ack();
        Write_byte(address);
        Wait4Ack();
        Write_byte(dat);
        Wait4Ack();
        Stop();
        NOP;
}

uchar Read_byte()
{
        uchar i,dat=0;
        for (i=0;i<8;i++)
        {
                SCL=1;
                dat=dat<<1;
                dat=dat|((uchar)(SDA));
                SCL=0;
        }
        return(dat);
}

uchar Read(uchar address)
{
        uchar dat;
        Start();
        Write_byte(ID);      //写器件地址 0xa0
        Wait4Ack();          //等待应答
        Write_byte(address); //写要读的地址
        Wait4Ack();          //等待应答


        Start();            //重新开始
        Write_byte(ID|0x01);//写器件地址,指明要读 (0xa1)
        Wait4Ack();         //等待应答 <---这里出问题,怎么都不应答。
        dat=Read_byte();   
        SendNoAck();
        Stop();
        return(dat);
}

void main()
{
        uchar DATA;
        WP=0;
        P1=0xf0;
        Write(0xf0,0xAB); //在0xf0 写入一个 0xAB;
        delay(20);
        NOP;        
        DATA=Read(0xf0); // 读 0xf0,给 DATA
        P1=DATA;                 // 按 DATA 点亮  P1。
        while(1);
}
通过调试,发现能正常写入,但读出时碰到器件不响应问题。

这是怎么回事,应该如何解决?

相关帖子

沙发
zdhlixiang2006| | 2010-4-14 12:23 | 只看该作者
程序我没看,不过我很早以前用过,最开始也是读不出来,后来发现时延时问题

使用特权

评论回复
板凳
qufo|  楼主 | 2010-4-14 12:39 | 只看该作者
我加了20ms延时。这个够长了吧。或者,在伪写后要延时长一些吗,我试一下。

使用特权

评论回复
地板
qufo|  楼主 | 2010-4-14 14:15 | 只看该作者
仍然不行,尝试过 1ms,5ms,10ms,20ms,都不行。

使用特权

评论回复
5
zdhlixiang2006| | 2010-4-14 14:40 | 只看该作者
可能你程序有问题,你把邮箱留下,我给你一个调试通过的程序

使用特权

评论回复
6
qufo|  楼主 | 2010-4-14 15:03 | 只看该作者
谢谢,我邮箱是 qufo@163.com

使用特权

评论回复
7
zdhlixiang2006| | 2010-4-14 16:33 | 只看该作者
发给你了,请查收,说明的是,我的原来是一个密码锁上面用到的程序,你自己看吧

使用特权

评论回复
8
qufo|  楼主 | 2010-4-14 20:09 | 只看该作者
资料收到,谢谢。

使用特权

评论回复
9
benjamin_2010| | 2010-4-14 21:14 | 只看该作者
zdhlixiang2006,我的邮箱是benjamin_math@163.com,能否也给我发送一份你的i2c程序呢?
谢谢先了

使用特权

评论回复
10
qq8682| | 2010-4-15 10:33 | 只看该作者
以前也碰到过,延时问题!

使用特权

评论回复
11
qq8682| | 2010-4-15 10:34 | 只看该作者
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
#define ulong unsigned long
#include <reg52.h>     //包括一个52标准内核的头文件

char code dx516[3] _at_ 0x003b;//这是为了仿真设置的

#define        WriteDeviceAddress 0xa0          //定义器件在IIC总线中的地址
#define        ReadDviceAddress 0xa1
sbit        SCL=P2^7;
sbit        SDA=P2^6;

sbit         P10=P1^0;

//定时函数
void DelayMs(unsigned int number)
{
        unsigned char temp;
        for(;number!=0;number--)
        {
                for(temp=112;temp!=0;temp--) ;
        }
}

//开始总线
void Start()
{
        SDA=1;
        SCL=1;
        SDA=0;
        SCL=0;
}

//结束总线
void Stop()
{
        SCL=0;
        SDA=0;
        SCL=1;
        SDA=1;
}


//发ACK0
void NoAck()
{
        SDA=1;
        SCL=1;
        SCL=0;
}

//测试ACK
bit TestAck()
{
        bit ErrorBit;
        SDA=1;
        SCL=1;
        ErrorBit=SDA;
        SCL=0;
        return(ErrorBit);
}

//写入8个bit到24c02
Write8Bit(unsigned char input)
{
        unsigned char temp;
        for(temp=8;temp!=0;temp--)
        {
                SDA=(bit)(input&0x80);
                SCL=1;
                SCL=0;
                input=input<<1;
        }
}

//写入一个字节到24c02中
void Write24c02(uchar ch,uchar address)
{
        Start();
        Write8Bit(WriteDeviceAddress);
        TestAck();
        Write8Bit(address);
        TestAck();

        Write8Bit(ch);
        TestAck();
       
        Stop();
        DelayMs(10);
}

//从24c02中读出8个bit
uchar Read8Bit()
{
        unsigned char temp,rbyte=0;
        for(temp=8;temp!=0;temp--)
        {
                SCL=1;
                rbyte=rbyte<<1;
                rbyte=rbyte|((unsigned char)(SDA));
                SCL=0;
        }
        return(rbyte);
}

//从24c02中读出1个字节
uchar Read24c02(uchar address)
{
        uchar ch;

        Start();
        Write8Bit(WriteDeviceAddress);
        TestAck();
        Write8Bit(address);
        TestAck();
        Start();
        Write8Bit(ReadDviceAddress);
        TestAck();
        ch=Read8Bit();
        NoAck();
        Stop();
        return(ch);
}

//本课试验写入一个字节到24c02并读出来验证

void main(void)        // 主程序
{
        uchar c1,c2;
        c1=Read24c02(0x02);

        Write24c02(0x99,0x03);
        c2=Read24c02(0x03);

        P10=0;
        while(1);  //程序挂起

}

使用特权

评论回复
12
qq8682| | 2010-4-15 10:35 | 只看该作者
转的程序

使用特权

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

本版积分规则

0

主题

21

帖子

1

粉丝