I2C_SCL 时钟抖动问题之“if条件判断分支” 软件优化

I2C_SCL 时钟抖动问题之“if条件判断分支” 软件优化


一开始,我先给出一个比较常见的GPIO模拟的I2C的I2C_writeByte的代码,代码是从南京沁恒CH450的网站上download下来的推荐代码。

void CH450_I2c_WrByte(unsigned char dat) //写一个字节数据
{
 unsigned char i;
 CH450_SDA_D_OUT;   /* 设置SDA为输出方向 */
 for(i=0;i!=8;i++)  // 输出8位数据
 {
  if(dat&0x80) {CH450_SDA_SET;}
  else {
    CH450_SDA_CLR;
   }
  DELAY_0_1US;  // 可选延时,这边对应的为一个指令周期
  CH450_SCL_SET;
  dat<<=1;
  DELAY_0_1US;  // 可选延时,这边对应的为一个指令周期
  CH450_SCL_CLR;
 }
 CH450_SDA_D_IN;   /*设置SDA为输入方向 */
 CH450_SDA_SET;
 DELAY_0_1US;
 CH450_SCL_SET;  //接收应答
 DELAY_0_1US;
 CH450_SCL_CLR;
}

使用keil的逻辑分析工具,查看I2C波形,SCL一个周期内放大,发现仿真输出结果有差异。

在这里插入图片描述SDA为高变低的时候,CLK从之前拉高到之后拉高的周期时间,经历了14个指令周期(如上图所示,水平方向,1Grid=0.5us,即24M条件下的一个指令周期)
SCL从拉高,保持高,到拉低:5个指令周期
SCL从拉低(保持低)~SDA拉低,7个指令周期
SCL继续保持低~SCL拉高:2个指令周期<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值