|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
求教:对AT24C02进行读写,是否要检测应答? |
作者:道源 栏目:单片机 |
我写了个AT24C02读写程序,但是程序一直都卡在了应答检测上,就是检测不到24C02的应答,所以读写不成功;但我把检测应答屏蔽了,程序就OK了! 我想问一下,对存储芯片的读写,需要检测应答吗?为什么? |
2楼: | >>参与讨论 |
作者: szzfq61 于 2005/9/20 10:14:00 发布:
要检测应答的! 如果你写的多,更要检测,否则,你就写不成功的。 |
3楼: | >>参与讨论 |
作者: lxb_gd 于 2005/9/20 10:47:00 发布:
我也有疑问,能和你聊聊吗? qq:59753340 msn:lixiaobingd@hotmail.com |
4楼: | >>参与讨论 |
作者: nitrogen 于 2005/9/20 11:47:00 发布:
北方单片机 我曾经做过24C02的程序,略有所知 我劝你还是好好写一下接收或发送完数据后的“应答”和“结束”的程序块! 因为24C02的读写程序的开始和结束的信号比较复杂,很容易搞错的!容易进入死循环!最好分块写程序! |
5楼: | >>参与讨论 |
作者: 道源 于 2005/9/20 13:44:00 发布:
那可能是什么原因造成无应答呢 会不会是延时不够呢 |
6楼: | >>参与讨论 |
作者: chenluck 于 2005/9/20 13:55:00 发布:
一定要测试的而且还要注意分页 一定要测试的而且还要注意分页, 在你完成写的所有时序后(写入时只是暂存在内部的RAM),2402内部开始启动电路写入真正的EEPROM(一般要5MS)这时是不会响应新的应答的! 程序就是在写入后查询是否得到应答,如未得到应答可以认为是IC内部正在执行写入,可以设定一个20MS的超时时间,防止出错时死在里面出不来 如果不检测应答信号,有可能使你下一次的写入失败的 |
7楼: | >>参与讨论 |
作者: forbbs21ic 于 2005/9/21 1:23:00 发布:
好! 24C02读写结束后,重新开始要延时10ms以上 |
8楼: | >>参与讨论 |
作者: 道源 于 2005/9/21 13:29:00 发布:
楼上几位大侠,能问一下 如果一个字节的数据写入24C02,然后检测应答;但24C02没有应答;这可能跟什么有关系啊; 如果单字节写入24C02的子程序有问题,那么会影响24C02的应答信号吗? |
9楼: | >>参与讨论 |
作者: etiller 于 2005/9/21 14:18:00 发布:
如下,用了多少年了 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; } /******************************************************************************/ /*每次对器件进行写操作之前都要用此函数查询其忙状态,对MICROCHIP的24C16测试结果*/ /*如下: */ /* 在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楼: | >>参与讨论 |
作者: 西安周公 于 2005/9/21 16:24:00 发布:
会不会是检测应答时数据线没有置‘1’? |
11楼: | >>参与讨论 |
作者: 道源 于 2005/9/21 17:10:00 发布:
谢谢etiller ,试试 我有使SDA=1,后在检测的 |
12楼: | >>参与讨论 |
作者: hejoin 于 2005/9/21 20:16:00 发布:
如果对速度没有最好检测一下 否则就等一个时钟 |
13楼: | >>参与讨论 |
作者: 道源 于 2005/9/22 9:11:00 发布:
检测已经搞定;谢谢楼上几位 如果能够检测到应答,是否说明我写入的数据是正确的呢?? 另外,关于检测应答信号的函数,我是这样写的: /**************检查应答位*****************/ 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 于 2005/9/22 9:29:00 发布:
从器件已经释放SCL? 看来LZ对IIC协议还是没有理解透切 SCL永远是由主机控制的。 |
15楼: | >>参与讨论 |
作者: iamccb 于 2005/9/22 9:48:00 发布:
我从来不应答 我从来也不应答,程序也活得好好的。当然前提条件是器件比较可靠而且不是关系生死存亡的数据。 |
16楼: | >>参与讨论 |
作者: 道源 于 2005/9/22 11:27:00 发布:
to:AVRx007,我对IIC确实不是很理解 (1)我想问的是,主器件发送一个字节,是一位一位依次往端口上送;而从器件采集和处理主器件发送的“位信息”总要有个时间吧;有可能,从器件还没处理或者正在处理当前的位信息,而主器件已经把下一位给发过来了呀!这样,你如何保证信息的正确传递呢? (2)不知道,从器件在处理中(忙状态),是否把SCL拉低?? (3)如果能够检测到正确应答,是否说明我正确的写入了数据呢?? |
17楼: | >>参与讨论 |
作者: 平凡 于 2009/12/15 23:00:12 发布:
我也是个菜鸟,也在怀疑要不要,希望大家多来说说,好让我们多学习学习,先谢谢各位前辈了。。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |