• GPIO模拟IIC接口信号质量分析


    信号质量有问题的波形001:

    信号质量有问题的波形002:

    从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况。

    因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下拉状态,因而SCL对应的GPIO内部有下拉电阻,导致在输出为高电平时,上升沿慢的台阶出现。后把SCL脚的内部下拉disable之后,测试的波形如下图所示,从下图可以看出SCL时钟信号已经正常。

    但是SDA存在小的脉冲尖峰和ACK的半高情况。具体见图中的红色圈所示。

    SDA小的脉冲尖峰出现在read_byte阶段,是因为软件在SCL无效状态时,对SDA置为输入状态后,又对SDA置高处理,因硬件外部已有上拉电阻,SCL无效时,软件无需对SDA置高处理。后软件去除此部份操作后SDA小的脉冲尖峰消除了。

    ACK半高电平,软件在停止位结束后,SCL从高到低反转一执行,马上把SDA从输出状态改为输入状态,此时ACK就会马上生效,SDA从而直接变为低电平,剩下的半高状态,只有大约800us的时间。具体见下图。

    测试结果:软件修改后,模拟SDA和SCL信号均满足要求。

    GPIO模拟IIC是需要注意:

    1、GPIO内部的默认是上拉还是下拉,可以都采取disable内部上下拉,使用外部强上拉的方式。

    2、每发送一个字节write_byte的过程中,最后一个bit在时钟SCL为高电平时保持有效,SCL被拉低后,从机的SDA即有ACK响应,所以在最后一个bit,在SCL的低电平半周期即需要置位输入状态,否则如果最后一个bit为高电平时,则SDA则会被拉到半高。

    3、read_byte的过程中,只需把SDA置为输入状态,不可以把管脚置为1状态。

  • 相关阅读:
    关于C++类中的静态数据成员
    关于C++中char,sizeof,strlen,string
    C++学习笔记(7)
    C++学习笔记(6)
    C++学习笔记(指针)
    C++学习笔记(4)
    UVA 10780
    UVA 531
    HDU, 3579 Hello Kiki
    UVA, 10413 Crazy Savages
  • 原文地址:https://www.cnblogs.com/utank/p/4253512.html
Copyright © 2020-2023  润新知