登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

求教:对AT24C02进行读写,是否要检测应答?

作者:道源 栏目:单片机
求教:对AT24C02进行读写,是否要检测应答?
我写了个AT24C02读写程序,但是程序一直都卡在了应答检测上,就是检测不到24C02的应答,所以读写不成功;但我把检测应答屏蔽了,程序就OK了!
我想问一下,对存储芯片的读写,需要检测应答吗?为什么?

2楼: >>参与讨论
szzfq61
要检测应答的!
如果你写的多,更要检测,否则,你就写不成功的。

3楼: >>参与讨论
lxb_gd
我也有疑问,能和你聊聊吗?
qq:59753340
msn:lixiaobingd@hotmail.com

4楼: >>参与讨论
nitrogen
北方单片机
我曾经做过24C02的程序,略有所知
我劝你还是好好写一下接收或发送完数据后的“应答”和“结束”的程序块!
因为24C02的读写程序的开始和结束的信号比较复杂,很容易搞错的!容易进入死循环!最好分块写程序!

5楼: >>参与讨论
道源
那可能是什么原因造成无应答呢
会不会是延时不够呢

6楼: >>参与讨论
chenluck
一定要测试的而且还要注意分页
一定要测试的而且还要注意分页,
在你完成写的所有时序后(写入时只是暂存在内部的RAM),2402内部开始启动电路写入真正的EEPROM(一般要5MS)这时是不会响应新的应答的!
程序就是在写入后查询是否得到应答,如未得到应答可以认为是IC内部正在执行写入,可以设定一个20MS的超时时间,防止出错时死在里面出不来
如果不检测应答信号,有可能使你下一次的写入失败的


7楼: >>参与讨论
forbbs21ic
好!
24C02读写结束后,重新开始要延时10ms以上

8楼: >>参与讨论
道源
楼上几位大侠,能问一下
如果一个字节的数据写入24C02,然后检测应答;但24C02没有应答;这可能跟什么有关系啊;
如果单字节写入24C02的子程序有问题,那么会影响24C02的应答信号吗?

9楼: >>参与讨论
etiller
如下,用了多少年了
void I2C_Start(void){
    SCL=1;nop();nop();

    SDA=1;nop();nop();
    SDA=0;nop();nop();

    SCL=0;nop();nop();
}
void I2C_Stop(void){
    SDA=0;nop();nop();
    SCL=1;nop();nop();
    SDA=1;nop();nop();

    SCL=0;nop();nop();
}
void I2C_Ack(bit sig){
    SDA=sig;

    SCL=0;nop();nop();
    SCL=1;nop();nop();
    SCL=0;nop();nop();
}
UCHAR I2C_ReadByte(void){
    UCHAR i,rByte=0;

    SDA=1;
    for(i=0;i<8;i++){
        SCL=0;nop();nop();
        SCL=1;

        rByte<<=1;
        if(SDA==1){rByte+=1;}
    }
    SCL=0;

    return rByte;
}
bit I2C_WriteByte(UCHAR preByte){
    bit ack;
    UCHAR i;

    for(i=0;i<8;i++){
        SDA=0;
        if((preByte<<i)&0x80){SDA=1;}
       
        SCL=1;nop();nop();
        SCL=0;
    }
    SDA=1;nop();nop();//释放数据线,准备接收应答信号
    ack=SDA;
        
    SCL=1;nop();nop();
    SCL=0;            

    return ack;
}
/******************************************************************************/
/*每次对器件进行写操作之前都要用此函数查询其忙状态,对MICROCHIP24C16测试结果*/
/*如下:                                                                      */
/*    在22.1184M时钟晶体的情况下,i典型值为16                                 */
/*    在11.0592M时钟晶体的情况下,i典型值为8                                  */
/******************************************************************************/
void I2C_AcknowledgePolling(void){
    unsigned CHAR i;
    
    I2C_Start();
    for(i=0;i<30;i++){
        if(I2C_WriteByte(0xa0)==1){I2C_Start();}
        else{break;}
    }
}

10楼: >>参与讨论
西安周公
会不会是检测应答时数据线没有置‘1’?
 
11楼: >>参与讨论
道源
谢谢etiller ,试试
我有使SDA=1,后在检测的

12楼: >>参与讨论
hejoin
如果对速度没有最好检测一下
否则就等一个时钟

13楼: >>参与讨论
道源
检测已经搞定;谢谢楼上几位
如果能够检测到应答,是否说明我写入的数据是正确的呢??

另外,关于检测应答信号的函数,我是这样写的:
/**************检查应答位*****************/
bit iic_rec_ack(void)//正确应答为SDA=0(SCL=1)
{
    SCL=0;
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
         //再延长时间
    CY=SDA;        //因为返回值总是放在CY中;应SDA=0,返回0!
    SCL=0;
    return(CY);
}
在对24C02写入控制字或者数据后,紧接的就是这么一条
if(iic_rec_ack()) break;即应答对,接着执行下面指令;错则跳出
这也就对应答函数只执行一次,这样会运行不对的;即使在应答函数中加入更长延时也没用!
后来,我把这条指令该为if(iic_rec_ack());也即不断运行应答函数,检测应答,就运行正确了,有检测到应答!
--------------------------------
另外,我对IIC还有一个疑问:
我们如何保证从器件接受到正确的信息呢?
我发现在写数据时,很多都是类似这样:
/***************向iic 总线写数据*****************/
void iic_send_byte(uchar send_byte)
{
    uchar data j;
    for(j=8;j>0;j--)
    {
        SCL=0;
        SCL=1;
        send_byte<<=1;        //CY=send_byte^7
        SDA=CY;
    }
    SCL=0;
}
我们知道iic端口是线与的,当主器件SCL=1后,我们如何保证从器件已经释放了SCL,即使SCL=1呢?是否在主器件SCL=1,后要加入检测while(SCL==0);在检测到从器件已经释放SCL,再发送数据给从器件呢??






14楼: >>参与讨论
AVRx007
从器件已经释放SCL?
看来LZ对IIC协议还是没有理解透切

SCL永远是由主机控制的。

15楼: >>参与讨论
iamccb
我从来不应答
我从来也不应答,程序也活得好好的。当然前提条件是器件比较可靠而且不是关系生死存亡的数据。

16楼: >>参与讨论
道源
to:AVRx007,我对IIC确实不是很理解
(1)我想问的是,主器件发送一个字节,是一位一位依次往端口上送;而从器件采集和处理主器件发送的“位信息”总要有个时间吧;有可能,从器件还没处理或者正在处理当前的位信息,而主器件已经把下一位给发过来了呀!这样,你如何保证信息的正确传递呢?
(2)不知道,从器件在处理中(忙状态),是否把SCL拉低??
(3)如果能够检测到正确应答,是否说明我正确的写入了数据呢??


17楼: >>参与讨论
平凡
我也是个菜鸟,也在怀疑要不要,希望大家多来说说,好让我们多学习学习,先谢谢各位前辈了。。
参与讨论
昵称:
讨论内容:
 
 
相关帖子
这种电源干扰问题你碰到过没有,如何解决的。
SOS!---DC24V-50W电机调速
MSP430秋季研讨会免费报名
求教有关专用单片机
对搞单片机的随想
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号