打印

24c04读数据问题

[复制链接]
4318|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddtx|  楼主 | 2010-8-13 20:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ddtx 于 2010-8-13 20:46 编辑

今天调24C04,代码上上读出数据总是不对,感觉很奇怪,用示波器测波形,发现没有问题,无论如何,总是读出0XFF,哪个哥们遇到过这个问题没,说说怎么解决。WP引脚已经正确接地,不会出问题

相关帖子

沙发
xiaojia234| | 2010-8-13 21:35 | 只看该作者
没有写进去吧,要不换一个试试?

使用特权

评论回复
板凳
ayb_ice| | 2010-8-14 08:20 | 只看该作者
程序问题

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ddtx + 1
地板
天天动听| | 2010-8-14 11:40 | 只看该作者
应该程序问题

使用特权

评论回复
5
new1988| | 2010-8-14 11:47 | 只看该作者
把程序贴出来嘛!!!有很多原因可能会出现你这情况!

使用特权

评论回复
6
ddtx|  楼主 | 2010-8-14 13:15 | 只看该作者
#define IO_MEM
#include"MCU.H"
#include"eeprom.h"

#define SDA_1 P4DR |= 0X80;
#define SDA_0 P4DR &= 0X7F;
#define SCL_1 P4DR |= 0X40;
#define SCL_0 P4DR &= 0XBF;
#define SDA_OUT P4CR |= 0X80;//1为输出
#define SDA_IN P4CR &= 0X7F;//0为输入
UCHAR EEData[EEPROM_MAX];
//============================================
void I2C_Init(void)
{
        SDA_1
        SCL_1
}
//============================================
void I2C_Start(void)
{
        SDA_1
        SCL_1
        __asm("nop");   
    __asm("nop");
    __asm("nop");
    __asm("nop");           
        SDA_0                         
        SCL_0
}
//===========================================
void I2C_Stop(void)
{
        SCL_0//scl=1
        SDA_1//sda=1
        __asm("nop");  
        __asm("nop");  
        __asm("nop");  
        __asm("nop");  
        SCL_0//scl=0
        SDA_0//sda=0

       
       
}
//==========================================
UCHAR I2C_Write_byte(UCHAR data)
{

        UCHAR        i;
        for (i=0; i<8; i++)
        {
                if (data&0x80)
                        SDA_1
                SCL_0//scl=1
                __asm("nop");
                __asm("nop");
                __asm("nop");
        __asm("nop");
                __asm("nop");
                SCL_0
                SDA_0
                data<<=1;
       
        }
        i=1;
        SDA_1//SDA=1
        SDA_IN//sda输入
        SCL_0//scl=1,第九脉冲信号
        __asm("nop");
        __asm("nop");
    __asm("nop");       
        __asm("nop");
        __asm("nop");
        while((P4DR&0X80)&&i)//等待器件响应或者超时
        {
                i++;
                if(i==255)
                        {
                                i=0;
                                return FALSE;
                        }
                       
        }
        SCL_0           //SCL=0       
        SDA_0                //SDA=0
        SDA_OUT;     //SDA输出       
        return TRUE;
                       
}
//================================================
UCHAR I2C_Receive_byte(void)
{
        UCHAR        i, ch=0;
        SCL_0//SCL=0
        SDA_IN //SDA输入                                                                                                         //SDA dirct input
        for (i=0; i<8; i++)
        {
                SCL_0
                __asm("nop");
                __asm("nop");
                            __asm("nop");       
                __asm("nop");
                if((P4DR&0X80)==1)
                        ch|=0x01;
                //else ch|=0x00;
                ch<<=1;
                SCL_0
        }
        SDA_OUT
        I2C_Stop();                                                                                                       
        return(ch);
}
//==================================================
void I2C_Ack(void)
{
        SCL_0
       
        SDA_0
       
        SDA_1                
        SCL_0
                                                                                        /* to reduce IO power consunption */
}
//==================================================
void I2C_NoAck(void)
{
        SDA_1
        SCL_0
        __asm("nop");
        __asm("nop");
        SCL_0
}
//=================================================
UCHAR E2PRom_Write_Byte(UCHAR address, UCHAR ch)                        //设备地址直接由函数内部计算生成,可以减少参数传入
{
        UCHAR Device_address;
        Device_address=address>>6;                                                        //将address右移六位,将值赋值给设备地址
        Device_address&=0x02;                               //取最高有效位,屏蔽其它位
        Device_address|=0xa0;                               //加上设备地址高位1010,得到最终设备地址,详细情况看DATASHEET
        //romnum<<=1;
    //romnum&=0x0E;
        //romnum|=0xA0;
        I2C_Start();
        I2C_Write_byte(Device_address);
        I2C_Write_byte(address);
        I2C_Write_byte(ch);
        I2C_Stop();
        return(TRUE);
}

UCHAR E2PRom_Read_Byte(UCHAR address)
{
        UCHAR ch;
    UCHAR Device_address;
        Device_address=address>>6;                                                        //将address右移六位,将值赋值给设备地址
        Device_address&=0x02;                               //取最高有效位,屏蔽其它位
        Device_address|=0xa0;                               //加上设备地址高位1010和写标志位1,得到最终设备地址,详细情况看DATASHEET,此处注意,读的时候要现写地址,故Device_address开始为写地址,后来为读地址
        I2C_Start();
        I2C_Write_byte(Device_address);
        I2C_Write_byte(address);
       
        Device_address&=0xa1;
        I2C_Start();
        I2C_Write_byte(Device_address);
        ch = I2C_Receive_byte();
        I2C_Stop();
        return(ch);
}

使用特权

评论回复
7
ddtx|  楼主 | 2010-8-14 13:17 | 只看该作者
用示波器测波形感觉没错,貌似是没有写入也没有读出

使用特权

评论回复
8
928315| | 2010-8-14 13:31 | 只看该作者
SDA_1
        SCL_1
        __asm("nop");   
    __asm("nop");
    __asm("nop");
    __asm("nop");           
        SDA_0                        
        SCL_0
延时的地方不对,你的时序应该是错误的。。网上有大把模拟的,可以参考哈。

使用特权

评论回复
9
ddtx|  楼主 | 2010-8-14 13:33 | 只看该作者
不明白,开始脉冲有什么不对

使用特权

评论回复
10
一棵小草| | 2010-8-14 13:43 | 只看该作者
协议(时序图) 是这样的吗?  程序是否按照协议来写?
时间延时是否按照标准?

使用特权

评论回复
11
xin123qin| | 2010-8-14 13:52 | 只看该作者
看看时序啦,有时是板有问题

使用特权

评论回复
12
wzl-xx@163.com| | 2010-8-14 14:08 | 只看该作者
延时时间是否严格?

使用特权

评论回复
13
ddtx|  楼主 | 2010-8-20 11:33 | 只看该作者
有找到问题所在了,两点:第一,脉冲的宽度符合DTATSHEET的要求,第二点,测试的时候,写入一个数据,再读出之间必须加一定的延时,10MS以上,否则读出就是错误的数值0XFF。

使用特权

评论回复
14
ayb_ice| | 2010-8-20 11:48 | 只看该作者
不需要10MS,一般是5MS,
可以查询是否完成,完成后可以立刻读出正确的数据
...

使用特权

评论回复
15
robter| | 2013-1-24 07:20 | 只看该作者
很好的编程经验,多谢

使用特权

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

本版积分规则

4

主题

312

帖子

1

粉丝