lp2323 发表于 2020-8-14 11:18 谢谢大佬的指教。 |
Y_G_G 发表于 2020-8-14 13:57 好的,谢谢哈 |
梯度 发表于 2020-8-14 11:45 I2cReadRespon后面不是完整的代码,没有看到时钟的操作 读取数据的应答是为了告诉IIC器件下一个动作要做什么 应答:继续输出数据 不应答:停止输出数据 |
Y_G_G 发表于 2020-8-13 22:03 哪为什么I2cReadRespon哪里注释了呢? |
首先baiIIC通信要分清主机与从机的关系,在du主机对从机进行写操zhi作时,一般dao是在传送完一个数据之后单片机就进入检测应答信号状态:先将两个脚置位SDA=1;SCL=1;然后在一定时间内不断检测SDA脚的电平状态,比如说你弄个循环for(i=255;i>0;i--){..;if(...)break;...}进行不断判断,当SDA的电平为低时就跳出循环,说明此时从机已经ACK,就可说明是I2C器件拉低;如果为高时,则一直判断完整个循环,到最后还为高时,就说明没有应答。 2、写应答和读应答肯定有所区别的。写应答是在你读从机数据期间,当你接收到一个数据时,可以应答的(想继续通信就应答),就将SDA复位(拉低),不想应答(想结束通信时)就置位(SDA=1)。读应答则在主机写数据给从机期间,每当从机接收到一个数据就会应答一下(将数据SDA线拉低),主机将不断检测SDA线的电平,主机就是凭SDA的电平状态才知道从机是否已经正确地接收了主机发送的 |
应答就是从机告诉主机我在听你说话,你可以继续说。如果从机不在听主机说话,那么主机就不会接着往下说了。 51里面如果把io口置高就是输入模式。如果置低就是输出模式,显然应答是要把io口置高来接收从机的信息。 |
应答: 200us时间内,等待从机回答一个ACK信号(就是拉低SDA);如果超过200us,从机不会答,则拉低SCL,等待下一个操作。 I2cReadRespon怎么注释了 这个有没有后续程序? 如果没有的话,I2CReadByte()函数最后第三步 把SCL 拉低了,就不用再重复低SCL。 |
还有在主机发送应答哪里,等待应答是SCL=1,不是应该为零才对嘛? |
C语言不会 IIC的应答是这样子的:不管是读还是写,每8个位(一个字节)之后,一定要有一个应答. 向IIC器件写入:写入完成一个字节之后,由IIC器件产生应答(低电平),单片机等待低电平,出现低电平就表示器件已经有了应答 读取:在读取完一个字节之后,由单片机向IIC器件发送应答信号(低电平) |
对方连续发送的时候,也可以不产生应答 |