找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

I2C时序相关代码不理解

查看数: 1801 | 评论数: 7 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-6-11 21:47

正文摘要:

I2C对应的时序写代码: 延时函数:I2CDelay() {_nop_();_nop_();_nop_();_nop_();} 1.stop函数 void I2CStop() {     I2C_SCL = 0;     I2C_SDA = 0;     I2CDelay(); &nbs ...

回复

ID:1045628 发表于 2023-6-12 17:46
第9行,也就是你提出的问题,没有必要,函数进来默认scl是低电平,这时候可以立马拉低对sda进行操作
第18行延时,这是为了给从机时间,并且延时使时钟达到从机要求
第20行延时,给从机读数据的时间
第24行,将sda恢复到高电平并在25行做延时是为了给从机操作sda,作为ask,防止发送字节最后一位为低电平产生误判
I2C一般也就400k最大,你这4个空操作的时间够吗,这芯片频率也太低了吧
ID:1064915 发表于 2023-6-12 17:29
哈兰德 发表于 2023-6-12 13:21
写时序该如何理解了??

I2C_SDA = 1;是释放总线
ID:332444 发表于 2023-6-12 16:00
哈兰德 发表于 2023-6-12 13:21
写时序该如何理解了??

只要注意启动和停止那2段间隔符合即可,如1602开始的地址建立时间符合要求即可。
ID:1078938 发表于 2023-6-12 13:21
写时序该如何理解了??
ID:1034262 发表于 2023-6-12 10:51
因为STOP之后要一定时间才能发起START,避免你发了STOP后马上发起START,所以加了延时,这个延时根据你的器件的时序而定,有的器件要几个us。而现代的单片机大部分速度都很快,如果发出STO跑步加延时马上发START,间隔可能在1us以内。
ID:230500 发表于 2023-6-12 09:58
SCL和SDA都是高电平了,不理解最后一行还使用I2CDelay()的原因 ?

IIC通信速度一般都不快好像最快400K吧,单片机的速度一般远远大于IIC从设备;比如在调用程序里,发送Stop函数后 马上又发Start函数,就会有类似 SCL=0;马上又SCL=1;从设备会反应不过来; 加delay能够让通信更加稳定, 如果主机时钟频率和通信速率不高, 不加也是可以的;  个人习惯, 我一般会加几个Nop的延时时间!  程序本身就是边写边调试;刚开始能跑起来。可能到了后面你就会发现,噢,这个地方加个微妙级延时更稳定; 慢慢的这就成为经验吧!
ID:332444 发表于 2023-6-12 08:00
I2C总线的位传输 起始条件:SCL为高电平时,SDA由高电平向低电平切换;表示开始传送数据。 停止条件:SCL为高电平时,SDA由低电平向高电平跳变;表示结束传送数据。 空闲条件:I2C总线的SDA和SCL两条信号线同时处于高电平时;表示空闲状态。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表