第9行,也就是你提出的问题,没有必要,函数进来默认scl是低电平,这时候可以立马拉低对sda进行操作 第18行延时,这是为了给从机时间,并且延时使时钟达到从机要求 第20行延时,给从机读数据的时间 第24行,将sda恢复到高电平并在25行做延时是为了给从机操作sda,作为ask,防止发送字节最后一位为低电平产生误判 I2C一般也就400k最大,你这4个空操作的时间够吗,这芯片频率也太低了吧 |
哈兰德 发表于 2023-6-12 13:21 I2C_SDA = 1;是释放总线 |
哈兰德 发表于 2023-6-12 13:21 只要注意启动和停止那2段间隔符合即可,如1602开始的地址建立时间符合要求即可。 |
写时序该如何理解了?? |
因为STOP之后要一定时间才能发起START,避免你发了STOP后马上发起START,所以加了延时,这个延时根据你的器件的时序而定,有的器件要几个us。而现代的单片机大部分速度都很快,如果发出STO跑步加延时马上发START,间隔可能在1us以内。 |
SCL和SDA都是高电平了,不理解最后一行还使用I2CDelay()的原因 ? IIC通信速度一般都不快好像最快400K吧,单片机的速度一般远远大于IIC从设备;比如在调用程序里,发送Stop函数后 马上又发Start函数,就会有类似 SCL=0;马上又SCL=1;从设备会反应不过来; 加delay能够让通信更加稳定, 如果主机时钟频率和通信速率不高, 不加也是可以的; 个人习惯, 我一般会加几个Nop的延时时间! 程序本身就是边写边调试;刚开始能跑起来。可能到了后面你就会发现,噢,这个地方加个微妙级延时更稳定; 慢慢的这就成为经验吧! |
I2C总线的位传输 起始条件:SCL为高电平时,SDA由高电平向低电平切换;表示开始传送数据。 停止条件:SCL为高电平时,SDA由低电平向高电平跳变;表示结束传送数据。 空闲条件:I2C总线的SDA和SCL两条信号线同时处于高电平时;表示空闲状态。 |