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

时间:2023-03-08 17:48:28

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

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

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

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

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

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

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

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

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

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

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

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

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

GPIO模拟IIC是需要注意:

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

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

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