原子哥在I2C的代码有些没有看懂下面这段代码里,IIC_Wait_Ack()函数应该会返回一个0或1,这里并没有用它的返回值,而是直接往下运行了,那如果这里的返回值是0,代码里并没有给出相应的处理啊,求大佬帮助一下,多谢多谢 void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr>>8);//发送高地址,即WriteAddr高八位 }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址,即WriteAddr低八位 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10); } |
IIC_Wait_Ack()应答信号只是回复1个低电平;
IIC_NAck()回复1个高电平而已。
AT24CXX_WriteOneByte()里 执行IIC_Send_Byte()后就要一直等到低电平的到来。
评分
查看全部评分
IIC_Wait_Ack()和IIC_NAck()这两个函数并不是等待什么 而是发送相应的电平。所以并不是楼主理解的接收电平
评分
查看全部评分
光从函数名来看,IIC_Wait_Ack()就应该是等待应答,而不是发送相应的电平。
IIC_NAck()才是发送相应的电平
评分
查看全部评分
比如IIC写EEPROM时,可以不处理应答,通过写入再读取的方式判断是否成功;当然也可以通过处理应答的方式来判断是否成功;就看个人而已。
也就是说发完一个字节的数据必须空出一个SCL脉冲的时间去读这个应答,而不能继续发数据,所以就有了IIC_Wait_Ack()这个函数。
也像楼下说的,这个应答是成功还是失败可以自己再写相应的程序去处理,只不过这里没有管应答成功还是失败就继续传下一个字节了,这个理解对吗?
“发送相应的电平”,指的是主机发送SCL上升下降的脉冲,来读由从机发来的应答信号吗
然后再问一下,主机如果是发送设备,是不需要用IIC_NAck()的对吧?只有从机是接受设备,而且接受完一个字节的时候,才需要发送一个IIC_NAck(),用来释放SDA
但是主设备从设备读取多条字节指令时,最后一条要求主设备应答NACK,然后停止IIC总线。
评分
查看全部评分
如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。
如楼主所述:“这个应答是成功还是失败可以自己再写相应的程序去处理”。
好的,谢谢您的解答!
您误人子弟哈!