iic+ack函数
答: 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完...
答:为了防止IIC的sda信号异常导致在while的死循环,用i来限定sda跳变为0等待时间,如果sda==0则跳出while循环,如果sda==1,最多等待i的255次增量计数后跳出循环,i++是在while循环体内的。IIC对时序有严格的要求,由于各种原因接口上信号异常是有可能发生的。器件地址0101是器件的标识,多种IIC器件通信时...
答:可以,很多主机的I2C控制寄存器有ACK/NACK的选择位,如果选了NACK,则主机在接收完DATA后不在线上产生ACK信号而直接产生STOP信号。但是如果I2C从设备强制要求ACK的话,最好还是让主机发送一个ACK信号来确认通讯的完成。
答:你可以先看一下I2C时序。在I2C读时序中,start--->器件地址--->ACK--->内存地址--->ACK--->START--->器件地址--->ACK--->数据--- --->ACK ...--->STOP 其实读时序中包含一个写操作,因为必须告诉从机你要读的地址以及从机 ...
答:恩,这个问题困扰了两天,终于找到原因并且顺利解决了!原因是:单片机接收应答信号(向AT24C02写数据时)和发送应答信号(AT24C02向单片机发送数据)的代码是不一样的!void ack()//acknowledge (单片机接收应答信号){ uchar i;scl=1;delay();while((sda == 1)&&(i > 250))i++;scl=0;//注意...
答:我觉得还好吧,加点针对性的的代码就可以了 1.比如为了防止错过Ack信号的读取,可以加入循环发送并读Ack的步骤,也可以直接关中断,如果有资源用DMA最好了,收发数据以及标志位的相关处理和判断都自动处理。2.还有就是调试过程中,如果断点设在等待Ack前,会清除Ack信号 ADDR: Address sent (master mode...
答:void stop_iic(){ SDA=0; //为产生上跳沿做准备 SCL=1; //打开时钟线 Delay(10);SDA=1; //产生停止信号(上跳沿有效)Delay(10);SCL=0; //时钟线恢复无效态// } void ack_iic(){ SDA=0;// 接受器件发送应答信号 SCL=1;Delay(10);SCL=0;SDA=1;//应答信号低电平有效,...
答:只能读第一个字节,一般都是应答(ACK)有问题,检查应答的时序。
答:SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时...
答:不是,我就试过同样的程序,给ADV7390就没反映,给AT24C1024B,RTC8564都有ACK回应。每种芯片对时序严格度要求不是完全一样,但大体上说,除非某些时序要求非常严格的芯片,其余大部分芯片都是通用的,因为时序要求几ns的延时一般我们都会给us级,所以不存在这种问题。
网友评论:
燕废15594314918:
IIc总线中,应答函数信号怎样写??? -
10075温若
: 不对.bit Ask() //检测应答 { bit ack_bit; //储存应答位SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, //以让SDA线转由IIC设备控制 _nop_(); //等待一个机器周期_nop_(); //等待一个机器周期...
燕废15594314918:
C51与ADS1112的I2C程序如下,请问,为什么总程序运行时,总死在write - ads1110(unsigned char outdat)函数 -
10075温若
: void write_ads1110(unsigned char outdat) { start_iic(); send_byte(0x90); // ED0 0x90 ED2 0x94 while(iic_ack(1)); //等待应答 你这里 相当于是while(1) 当然成了死循环 send_byte(outdat); while(iic_ack(1)); //等待应答 stop_iic(); } 你的iic_ack(i)函数返回的值是一个固定值.这里逻辑不对,检查一下吧.
燕废15594314918:
51单片机控制DA芯片 -
10075温若
: 这6行程序是单片机向IIC总线发送的ACK(应答信号).在从24C02读取数据时,单片机是数据接收端,向24c02发送ACK应答信号,是表明单片机已接收到8位数据,24C02接收到这个信号,地址就会自动加1,等待单片机读取下一字节数据.
燕废15594314918:
C51单片机模拟IIC总线,应答函数的疑问 -
10075温若
: 应答是接收设别自动产生的,不一定是从机.在IIC上除了开始,停止和重复开始外,所有数据都在在时钟的低电平变化的,也就是为高后,数据就应该稳定了.所以如果是模拟总线,应先有下降沿,再设为输入,然后读ACK,如果是从机的应答,是自动产生的,是作为数据通信正确的判断标志,为了可靠,是要判断的.主机的应答一般是程序控制的,如果要结束总线,可以给也可以不给应答;如果要继续读数据,就必须给出应答.
燕废15594314918:
stm32用iic读取mpu6050为什么读不了 -
10075温若
: 既然是iic,那就要遵循iic的基本规则.1、基本应答函数是否正确,start,stop,waitack,ack,nack,sendbyte,readbyte是否都都确保可用,每个芯片都有自己的驱动时序,根据手册,对应去配置.2、确认这些基本函数的GPIO映射是否有误吧,还有拉高拉低操作是否写对了.3、前两个都没问题,就去检查电路吧,设计问题,焊接问题,如果都没问题,看看芯片是不是坏了吧.
燕废15594314918:
一个IIC协议的小问题~~求前辈点拨 -
10075温若
: 建议详细了解IIC的协议,按照协议规定,总线空闲时两线为高,当进行通信时,SDA在SCL高电平时由高变低表示通信开始( void iic_start(void) ),以后传输数据,SDA只能在SCL为低的时候才能发生变化,在SCL上升抓取数据;而停止位是在SCL高时SDA由低变高 (void iic_stop(void) ). 其实只要满足了协议要求最终两线处于什么状态也许都是可以的,或者你也可以试下在某些地方将SCL最终由低又拉为高是否能正常,当然首要还是在符合协议规定的前提下.
燕废15594314918:
利用递归法求阿克曼函数 -
10075温若
: 这里给出C语言的阿克曼递归函数:首先,阿克曼函数标准定义:#include #include int Ackmann(int n,int m) { if(m==0)return n+1; else if(m>0 && n==0)return Ackmann(m-1,1); else return Ackmann(m-1,Ackmann(m,n-1)); }int main() { int m,n; printf("输入m和n:"); scanf("%d,%d",&m,&n); printf("结果是:%d",Ackmann(n,m)); system("pause"); return 0; }
燕废15594314918:
30分——请高手解释一下这个iic应答c程序 -
10075温若
: ACK就是个应答信号,类似于“长江长江,我是黄河”,当长江收到信号,并确认是黄河的时候,就说明通讯可以确认了.这里在I2C发送数据之前,应该都会先发送一个ACK给下位机,为了就是确认握手信号.而同样道理,在程序中,也会有个接收ACK的子函数,用来确认下位机发送上来的一串数据中是否带有ACK信号.本人理解,仅供参考.
燕废15594314918:
I2C协议从机怎么发送ACK信号啊,就是把SDA拉低,要怎么编程实现啊 -
10075温若
: 以AT89c52单片机为例,主机发送指令过程中,当需要判断SDA是否被拉低时,先值高SDA,然后反复读取SDA电平,当SDA=0时就判断SDA被拉低了,在一定时间内没有读取到SDA=0就判断出错.汇编举例:aACK: MOV R7,#0 ; LOOP: CLR C ; MOV C, IO_SDA ; NOP; JNC IO_SDA , LOOP_OK ;有确认信号转 DJNZ R7, LOOP ; LOOP_ERR: //一定时间内没有检测到ACK信号. ...... LOOP_OK: //一定时间内检测到ACK信号. ......
燕废15594314918:
I2C总线协议中的 应答函数,读写函数中,SDA和SCL到底该怎么判断啊??? 一直弄不懂. -
10075温若
: 时间常数为rc的乘积,并联增大容值会导致时间常数变大,scl、sda上升沿变缓慢,从而可能导致不满足协议要求的trise参数. i2c(inter-integrated circuit)总线是由philips公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子...