找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1183|回复: 7
收起左侧

I2C时序相关代码不理解

[复制链接]
ID:1078938 发表于 2023-6-11 21:47 | 显示全部楼层 |阅读模式
I2C对应的时序写代码:
延时函数:I2CDelay() {_nop_();_nop_();_nop_();_nop_();}

1.stop函数
void I2CStop()
{
    I2C_SCL = 0;
    I2C_SDA = 0;
    I2CDelay();
    I2C_SCL = 1;
    I2CDelay();
    I2C_SDA = 1;
    I2CDelay();
}


SCL和SDA都是高电平了,不理解最后一行还使用I2CDelay()的原因 ?

2.wrtie函数
  1. bit I2CWrite(unsigned char dat)
  2. {
  3.     bit ack = 0;

  4.     unsigned char mask ;

  5.     for (mask = 0x80; mask != 0; mask >>= 1)
  6.     {
  7.     1.根据时序图,觉得SDA这里应该加I2CDelay() ?
  8.         if ((mask & dat) == 0)
  9.         {
  10.             I2C_SDA = 0;
  11.         }
  12.         else
  13.         {
  14.             I2C_SDA = 1;
  15.         }
  16.         I2CDelay();
  17.         I2C_SCL = 1;
  18.         I2CDelay();
  19.         I2C_SCL = 0;
  20.     }
  21. 2.时序图这里也没有说I2C_SDA是高电平?不知道是干嘛的?
  22.     I2C_SDA = 1;
  23.     I2CDelay();
  24.     I2C_SCL = 1;
  25.     ack = I2C_SDA;
  26.     I2CDelay();
  27.     I2C_SCL = 0;

  28.     return ack;
  29. }
复制代码
个人对I2C时序的总结:
写过程::SCL电平主导了SDA的变化,SCL为高电平的时候,单片机读取SDA信号,SCL为低电平的时候,SDA变化。
开始过程::SDA影响SCL变化。





Snipaste_2023-06-11_21-46-26.jpg
回复

使用道具 举报

ID:332444 发表于 2023-6-12 08:00 | 显示全部楼层
I2C总线的位传输 起始条件:SCL为高电平时,SDA由高电平向低电平切换;表示开始传送数据。 停止条件:SCL为高电平时,SDA由低电平向高电平跳变;表示结束传送数据。 空闲条件:I2C总线的SDA和SCL两条信号线同时处于高电平时;表示空闲状态。
回复

使用道具 举报

ID:230500 发表于 2023-6-12 09:58 | 显示全部楼层
SCL和SDA都是高电平了,不理解最后一行还使用I2CDelay()的原因 ?

IIC通信速度一般都不快好像最快400K吧,单片机的速度一般远远大于IIC从设备;比如在调用程序里,发送Stop函数后 马上又发Start函数,就会有类似 SCL=0;马上又SCL=1;从设备会反应不过来; 加delay能够让通信更加稳定, 如果主机时钟频率和通信速率不高, 不加也是可以的;  个人习惯, 我一般会加几个Nop的延时时间!  程序本身就是边写边调试;刚开始能跑起来。可能到了后面你就会发现,噢,这个地方加个微妙级延时更稳定; 慢慢的这就成为经验吧!
回复

使用道具 举报

ID:1034262 发表于 2023-6-12 10:51 | 显示全部楼层
因为STOP之后要一定时间才能发起START,避免你发了STOP后马上发起START,所以加了延时,这个延时根据你的器件的时序而定,有的器件要几个us。而现代的单片机大部分速度都很快,如果发出STO跑步加延时马上发START,间隔可能在1us以内。
回复

使用道具 举报

ID:1078938 发表于 2023-6-12 13:21 | 显示全部楼层
写时序该如何理解了??
回复

使用道具 举报

ID:332444 发表于 2023-6-12 16:00 | 显示全部楼层
哈兰德 发表于 2023-6-12 13:21
写时序该如何理解了??

只要注意启动和停止那2段间隔符合即可,如1602开始的地址建立时间符合要求即可。
回复

使用道具 举报

ID:1064915 发表于 2023-6-12 17:29 | 显示全部楼层
哈兰德 发表于 2023-6-12 13:21
写时序该如何理解了??

I2C_SDA = 1;是释放总线
回复

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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