求助单片机模拟iic从机高手关于iic通信应答位读取问题

【请教:已解决】关于IIC协议读操作中的应答问题|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
&&&&以前在大学时候研究过iic,参照的是郭天祥的视频教程,把at24c02里面的数据读写完成之后就没深入研究了,而是作为一个子程序封装来用了。最近研究rda5802时候参考挪用了一个论坛一坛友的代码,后来据说是伟纳的工程师放出来的代码,呵呵偏题了。&& 我发现用如下的代码读at24c02时候总是出错,比如我的某个但愿存的是bcd码01,但是读出来就是03,我参考at24c02的官方pdf,然后参考如下代码段,就产生疑问了,望坛友们不吝赐教,谢谢[attachment=1100684] 代码
#include &intrins.h&#define&&I2C_ACK&&&& 1#define&&I2C_NACK&&&&0#define uchar unsigned char#define uint&&unsigned int//#define AT24c02extern unsigned char&&RDA_reg_data[8];sbit SDA = P3^6;sbit SCL = P3^7;void I2C_start(){&& SDA = 1;&& SCL = 1;&& _nop_();_nop_();_nop_();&& SDA = 0;&& _nop_();_nop_();_nop_();&& SCL = 0;}void I2C_stop(){&& SDA = 0;&& SCL = 1;&& _nop_();_nop_();_nop_();&& SDA = 1;&& _nop_();_nop_();_nop_();}// 发送一个字节子程序unsigned char I2C_write_byte(unsigned char indata){&&&&unsigned char i,&&&&// I2C 发送8 位数据&&&&for (i=0; i&8; i++)&&&&{&&&&&&&&// 高在前低在后&&&&&&&&if (indata & 0x80)&&&&&&&&&&&&SDA = 1;&&&&&&&&else&&&&&&&&&&&&SDA = 0;&&&&&&&&// 发送左移一位&&&&&&&&indata &&= 1;&&&&&&&&_nop_();_nop_();_nop_();&&&&&&&&SCL = 1;&&&&&&&&_nop_();_nop_();_nop_();&&&&&&&&SCL = 0;&&&&}&&&&// 设置SDA为输入&&&&SDA =1;&&&&_nop_();_nop_();_nop_(); &&&&// 读取从机应答状态&&&&SCL = 1;&&&&_nop_();_nop_();_nop_(); &&&&if(SDA)&&&&&& //为什么?一个是uchar一个是bit,返回一个ack值有什么意义呢???&&&&&&&&ack = I2C_NACK;&&&&else&&&&&&&&ack = I2C_ACK;&&&&SCL = 0;&&&&}//&&读一个字节子程序unsigned char I2C_read_byte(unsigned char ack){&&&&unsigned char i, out_data = 0;&&&&SDA = 1;&&// SDA 设置输入方向
&&&&// I2C 接收8位数据&&&&for(i = 8; i & 0; i--)&&&&{&&&&&&&&out_data &&= 1;&&&&&&&&SCL = 1;&&&&&&&&_nop_();_nop_();_nop_(); &&&&&&&&// 高在前低在后&&&&&&&&if (SDA)&&&&&&&&&&&&out_data++;
&&&&&&&&SCL = 0;&&&&&&&&_nop_();_nop_();_nop_();&&&&}
&&&&// 主机发送应答状态&&&&if(ack == I2C_ACK)&&&&&&&&&&&&&&&&&&&&&& //pdf所示的时序中没有对sda进行操作啊,为什么这儿进行了,并且时序还不一致&&&&&&&&&&SDA = 0;&&&&else&&&&SDA = 1;
&&&&_nop_();_nop_();_nop_();&&&&SCL = 1;&&&&_nop_();_nop_();_nop_();&&&&SCL = 0;
&&&&return out_} 问题结症是我在读多字节读操作中读完最后一个字节后主机没有向从机发送无应答信号NACK,导致错误。发送应答信号后一切正常。但是此处还有个小疑问:最后一个自己结束后我就发了stop()信号,按道理我已经读到正确值了,上述问题到底怎么得来的。void IIC_ser_read(uchar chip_add,uchar firstadd ,uchar length ,uchar getadd,uchar *aim){&&&&I2C_start();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//启动总线&&&&I2C_write_byte(chip_add & 0xfe);&&&&&&&&//发送器件地址&&&&I2C_write_byte(firstadd);&&&&&&&&&&&&&&&&//发送器件子地址&&&&I2C_start();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//启动总线&&&&I2C_write_byte(chip_add | 0x01);&&&&&&&&//发送器件读地址&&&&length -= 1;&&&&while(length)&&&&{&&&&&&&&aim[getadd] = I2C_read_byte(I2C_ACK);&&&&&&&&getadd&&&&&&+= 1;&&&&&&&&length&&&&&&-= 1;&&&&}&&
aim[getadd] = I2C_read_byte(I2C_NACK);//原来就是这个非应答信号没有,所以失败&&&&I2C_stop();}
赞助商链接
图中的DATA TOU 和DATA IN都是SDA数据线上的操作,只不过一个是主机下拉一个是从机下拉,ack信号是i2c总线协议规定的同步信号~楼主去找飞利浦那个i2c的文档看嘛,i2c就是飞利浦发明的~
赞助商链接
RDA5802啊&& 伟蒳那个是RDA5807 的 貌似差不多&& 我也有RDA5802&&没怎么用 现在在玩CL6017
额~~哥们儿,你辛苦了啊
呵呵,你玩的东西有什么不同吗
建议楼主先了解清楚I2C协议……在I2C中答应信号是非常重要的……简单来说是接收数据方产生答应信号……但是不同的器件不同的状态下答应位的作用不同。无论主设备还是从设备都要判断答应位来作出下一步的响应。
因为出错的时候或者停止的时候需要了解啊。但是c的函数只能返回一个值,所以一般用一个bit,一个字节的数据。至于bit或者char,速度上也不提升吧。
你看看镇南的网站上共享的源码,肯定有收获
目前来说,你做的仅仅是24C01/02的实验,还没有深入到C16以上你应该先查阅芯片的datasheet给你两幅图[attachment=1104409][attachment=1104410]你要先弄明白,你的代码是读/写一个字节还是页读/写24C系列在读取前有一段虚写的过程,主要看我发的图看完,你再对照你的代码你就会明白了
源码资料下载
查看完整版本: [--
Powered by
Time 0.079821 second(s),query:5 Gzip enabled例说单片机数据通信之模拟IIC通信
> 例说单片机数据通信之模拟IIC通信
例说单片机数据通信之模拟IIC通信
   即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线。本文引用地址:  I2C串行总线一般有两根信号线,一根是双向的数据线,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据都接到总线的上,各设备的时钟线SCL接到总线的SCL上。以51和AT24C02介绍IO模拟通信。  启始与停止  启始条件:必须在所有命令之前发送,时钟线保持高电平期间,数据线电平从高到低的跳变作为IIC总线的启动信号。  停止条件:时钟线保持高电平期间,数据线电平从低到高的跳变作为IIC总线的停止信号。操作结束时必须发送停止条件。  void startbit()  {  clrSCL();  setSDA();  setSCL(); //时钟为高时  clrSDA(); //SDA下降沿  clrSCL();  }  void stopbit()  {  clrSCL();  clrSDA();  setSCL(); //时钟为高时  setSDA(); //SDA上升沿  clrSCL();  }  应答信号  每次数据传送成功后,从设备发送一个应答信号。当第九个时钟信号产生时,产生应答信号的器件将SDA下拉为低,通知已经接收到8位数据。  void respond()  {  unsigned char i = 0;  setSDA(); //释放总线  setSCL(); //时钟  while(SDA != 0)  {  i++;  if(i & 200)  }  clrSCL();  }  读写字节操作  IIC总线协议定义如下:  1. 只有在总线非忙时才被允许进行数据传输。  2. 在数据传输时,当时钟线为高电平,数据线必须为固定状态,不允许跳变,时钟线为高电平时数据线的任何电平变化都会被当做总线的启动或停止条件
模拟信号相关文章:
51单片机相关文章:
pic相关文章:
单片机相关文章:
单片机相关文章:
单片机相关文章:
数字通信相关文章:
通信相关文章:
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一51单片机的模拟IIC总线程序_文档下载
亿万文档 免费下载
当前位置: &
& 51单片机的模拟IIC总线程序
51单片机的模拟IIC总线程序
单片机模拟IIC总线通信
/********************************************************************
VI2C_C51.C
此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展.....
注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作
一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
********************************************************************/
#include &reg764.h&
/*头文件的包含*/
#include &intrins.h&
uchar unsigned char /*宏定义*/
unsigned int
/*定义空指令*/
/* 常,变量定义区 */
/*端口位定义*/
sbit SDA=P1^3;
/*模拟I2C数据传送位*/
sbit SCL=P1^2;
/*模拟I2C时钟控制位*/
/*状态标志*/
/*应答标志位*/
/*******************************************************************
起动总线函数
函数原型: void
Start_I2c();
启动I2C总线,即发送I2C起始条件.
********************************************************************/ void Start_I2c()
/*发送起始条件的数据信号*/
Word文档免费下载: (下载1-8页,共8页)
同时,以访问 IIC 总线 接口芯片 EEPROM AT24C02 为例,并且给出具体程序来说明软件模拟的实现过程。 关键词 IIC 总线 MCS51 单片机 软件模拟 MCU 和几个从 ...编写程序使用 AT89C51 的 IO 口模拟实现 IIC 总线协议进行通信, 并向 24C02 存储器内从字节 0 到字节 FF 写入数字 0 到 FF。 51 系列单片机本身没有 IIC...51单片机IO口线模拟IIC总... 3页 免费 51单片机IIC程序 3页 2下载券喜欢...IIC_SDA=P2^6; sbit IIC_SCL=P2^5; //声明 IIC 总线的数据线接在单片机...51 单片机 IO 口线模拟 IIC 总线 3 部曲之第 3 部.txt24 生活如海,宽容作舟,泛舟于海,方 知海之宽阔;生活如山,宽容为径,循径登山,方知山之高大;生活...51单片机模拟iic总线协议使用EEPROM器件AT24C02_电子/电路_工程科技_专业资料。51...告诉从机我要对你进行读操作,所以先 写,后读 while(1);//将程序终止于此 ...51单片机IO口线模拟IIC总线3部曲之第3部_互联网_IT/计算机_专业资料。51单片机...51单片机IIC总线程序 3页 2下载券 51单片机的I2C底层驱动程... 1页 免费喜欢...51单片机IO口线模拟IIC总线3部曲之第2部_互联网_IT/计算机_专业资料。教师节双语...51单片机IIC总线程序 3页 2下载券 51单片机_IIC总线协议 26页 1下载券喜欢...基于Proteus的80C51单片机IIC总线接口设计_专业资料。文中利用Proteus强大的仿真功能,在其仿真平台下搭建硬件,利用其所支持的第三方编程软件,进行了80C51的IIC总线接口...3页 免费 51单片机IO口线模拟IIC总... 3页 免费喜欢此文档的还喜欢 51单片机的模拟IIC总线程... 8页 免费 IIC总线读写程序 3页 免费 IIC中文版(免费) 38...51单片机模拟I2C总线的汇编源代码_IT/计算机_专业资料。;为软件包定义变量 ACK ...启动IIC总线子程序 START:SETB SDA NOP NOP SETB SCL ;起始条件建立时间大于...1、I2C(Inter-IntegratedCi;2、I2C总线是由数据线SDA和时钟SCL构成的;3、I2C总线在传送数据过程中共有三种特殊类型信;4、I2C总线最主要的优点是其简单性和有效性;5、I2C总线是由数据线SDA和时钟SCL构成的;下面是我的电路板单片机引脚接线情况:;第16、17号引脚接的就是SDA、SCL.;下面是SCL和SDA接的EEPR
1、I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备(特别是外部存储器件)。
2、I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
3、I2C总线在传送数据过程中共有三种特殊类型信号, 它们分别是:开始信号、结束信号和应答信号。
4、I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。I2C总线的另一个优点是,它支持多主机,其中任何能够进行发送和接收的设备都可以成为主机。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主机。
5、 I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。各种I2C均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址。
下面是我的电路板单片机引脚接线情况:
第16、17号引脚接的就是SDA、SCL.
下面是SCL和SDA接的EEPROM,通过单片机的两个引脚连接一个外围存储器
前面说IIC有三种信号
先看开始信号:
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
若用代码表示开始信号:
// 只有在SCL为0时才能将SDA改变,SCL为高x相当于告诉别人SDA不会被改变了 // 当在SCL为高时改变SDA状态,只会被识别成开始或终止状态
Void StartIIC()
// 首先我们需要将SDA和SCL置成高,变成上图最开始状态
// 将SDA置高,
// 再将SCL置高,此时SDA和SCL都为高电平
// 一切就绪,就等着SDA在SCL为高时变低,表示开始了
// 将SCL = 0
再看看终止信号:
Void StopIIC()
// 终止就是要先将SCL置高,SDA置低,然后在此基础上将SDA置高
// 先将SCL置0,便于将SDA改变
// 此时SCL = 1,SDA = 0;
// 将SDA = 1,表示终止信号
之所以将SCL好SDA在0和1,就像两个相隔很远的人通过两个手电的光信号交流一样,高电平表示打开手电,低电平表示不开手电没有光,每一秒记录一个状态。一切根据上面的图来写程序。
IIC通信的读和写:
1,I2C与UART不同的地方首先在于先传高位,后传送低位。
2,主机写数据时,每发送一个字节,接收机需要回复一个应答位“0”,通过应答位来判断从机是否接收成功。
3,主机读数据时,接收一个字节结束后,主机也需要发送一应答位“0”,但是当接收最后一个
字节结束后,则需发送一个非应答位“1”,发完了1后,再发一个停止信号,最终结束通信。
首先I2C起始信号,然后发送首字节,即器件(EEPROM)地址。并且在读写方向位上选择“写操作”方向。(0xa0)
第二个字节,发送数据的存储地址,就是要读取的数据所存储在EEPROM中的位置。 第三个字节,发送要存储的数据第一个字节,第二个字节??
在写数据的过程中,都要等待EEPROM返回一个“应答位”。
先大概看一下写数据的过程:
Void WriteIIC(unsigned
address,unsigned
// 开始信号
StartIIC();
// 写器件地址,1010 xxxy(x表示地址,y表示操作方式,0表示写,1表示读)
SendData(0xa0);
// 写操作数据的地址
SendData(address);
// 写入数据
SendData(d);
// 终止信号
StopIIC();
其中有个SendData(unsigned
d)函数,传入数据d,然后通过改变SCL和SDA的高低来发送数据。
Void SendData(unsigned char d)
// 向EEPROM写数据
// 一位一位的发送
unsigned char temp = 0x80,i;
for (i = 0;i & 8;i ++)
if ((c & temp) != 0)
// 真表示测试位是1
// 假表示测试位是0
temp &&= 1;
// 将scl置高,让EEPROM有机会读取SDA上的信息
// 最后再接收一个应答位
// 此时SDA已经接收到一个应答位,暂不处理
//if (SDA != 0)
// 没有接收到应答位,返回错误
//return 0;
IIC通信的读数据:
首先I2C起始信号,然后发送首字节,即器件(EEPROM)地址。并且在读写方向位上选择“写操作”方向。
第二个字节,发送数据的存储地址,就是要读取的数据所存储在EEPROM中的位置。 第三个字节,重新发送I2C起始信号和器件地址,并且在方向位上选择“读操作”方向。 在前三个字节操作过程,都要等待器件给与回应一个“应答位0”
第四个字节,接收从器件发回的首字节后,单片机要主动返回一个“(非)应答位0”??
Unsigned char ReadIIC(unsigned char address)
Unsigned char d = 0;
// 起始信号
StartIIC();
// 写设备地址
SendData(0xa0);
// 写数据地址
SendData(address);
// 重新发送起始信号
StartIIC();
// 写设备地址和操作方式为读
SendData(0xa1);
// 得到读取的数据
d = ReadData();
// 终止信号
StopIIC();
unsigned char ReadData()
三亿文库包含各类专业文献、幼儿教育、小学教育、外语学习资料、生活休闲娱乐、文学作品欣赏、各类资格考试、专业论文、高等教育、单片机IIC通信52等内容。 
 (1,0); SCL=0; } 5.IIC 通信的写数据 单片机进行写操作时, 位地址码和写方向位“0” 单片机进行写操作时, 首先发送该器件的 7 位地址码和写方向位 (...  单片机模拟IIC通信控制AT24C02芯片_信息与通信_工程科技_专业资料。#include&reg52.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned ...  单片机做iic从机_信息与通信_工程科技_专业资料。单片机做 iic 从机
15:22 为启动从机接收模式, TWAR 与 TWCR 设置如下: 前 7 位是主机寻址时...  51单片机的模拟IIC总线程序_信息与通信_工程科技_专业资料。单片机模拟IIC总线通信 /*** VI2C_C51.C 此程序是 I2C 操作平台(主方式的软件平台)的底层的 C 子...  3、IIC 通信程序和 1602 的 4 线制驱动程序相结合 4、51 单片机任意 2 个 IO 口驱动 1602 成功! !!。 (我只是个业余爱好者,要是各位觉得太低端那就见谅...  模块化设计-单片机IIC通讯模块_信息与通信_工程科技_专业资料。单片机IIC模块软件设计代码//===Copyright (c)=== // 文件名称: IIC.c // 功能描述: IO 口模...  51单片机IO口模拟IIC总线协议_信息与通信_工程科技_专业资料。I2C 总线是 Philips 公司提出的一种集成电路 IC 器件之间相连接的总线协 议,其目的是使电子系统(不...  基于PIC单片机的IIC功能例程_信息与通信_工程科技_专业资料。PIC单片机的I2C技术 基于PIC 单片机的 IIC 功能例程用 PIC 单片机的 IIC 功能实现用 3*3 矩阵键盘...  串行通信协议_计算机硬件及网络_IT/计算机_专业资料。总结了串口、IIC、SPI通信协议的异同; 比较了USB、TTL、RS232电平的转换方式; 简单明了,适合初学者。...只需一步,快速开始
后使用快捷导航没有帐号?
查看: 660|回复: 9
第十二节IIC通信读写EEPROM
累计签到:140 天连续签到:0 天&
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
游客,如果您要查看本帖隐藏内容请
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:1084 天连续签到:1 天&
这个看一看哈
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:204 天连续签到:1 天&
来看看 小小的支持一下
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:41 天连续签到:1 天&
这个看一看
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:467 天连续签到:1 天&
感谢楼主分享!,,,,,,,,,,,,,,,,,,,
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:1 天连续签到:1 天&
{:1_1:}看看吧&&
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:155 天连续签到:1 天&
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:9 天连续签到:1 天&
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:9 天连续签到:1 天&
From FishC Mobile
大神有时间在写个SPI的吧
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
累计签到:7 天连续签到:1 天&
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
•••(
Powered by}

我要回帖

更多关于 iic从机无应答 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信