I2C读写eeprom的问题

接线

在配置I2C的时候要把IO的口设置为开漏模式,为什么要设置开漏模式呢?

答:I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况所以总线一般会使用开漏输出。

为什么要接上拉电阻?

接上拉电阻是因为I2C通信需要输出高电平的能力,一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换输出,通过上拉电阻连接到电源,这样才能够实现“线与”功能。
当总线空闲时SDA和SCL都为高电平,当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
I2C读写eeprom的问题_第1张图片
上图为SPI的接线。

I2C协议层

I2C读写eeprom的问题_第2张图片

  1. 状态1为SPI空闲状态:SCL和SDA都为高阻态,被自己的上拉电阻设置为高阻态,成了高电平。
  2. 起始状态:在总线都处于高电平的时,检测到SPI的数据线(SDA)出现了一个下降沿,产生一个 开始信号,这时设备会跳出这个空闲状态(这个地方不太明白,跳出空闲??)等待数据的输入。
  3. 数据的读写时序图如下
    I2C读写eeprom的问题_第3张图片
    上面的时序图为从某几位开始的并不是从开头开始的主意哈,到响应之前表示8位数据发送完了。
    主设备向从设备写数据的时候,要遵循一个原则:
    (一) 当时钟SCL为高电平时,数据总线向从机写入一位数据,在写的过程中这个时钟信号不能变,也就是说保持为高电平。
    如果把数据传送比作为过桥,那么时钟就是一座桥,在过桥的时候不能把桥拆了,这就是为什么不能把时钟信号变化的原因。
    (二)当数据发送完了后,需要重新发送数据了,可以把时钟信号(SCL)拉低,将数据进行保存重新发送、
    就是上个数据已经过桥了,数据换了相当于换人了,所以要重新进行搭桥,搭桥就是把时钟线拉高,让数据过桥。
    一直在重复这个过桥拆桥的问题,一直到数据传输了8位,也就是1byte,从设备要进行应答处理,保证数据传输的准确性。
    (三)从设备响应
    如果上面8个数据都接受到正确的数据,会把SDA数据线进行拉低,向主机发送1位的应答信号,如果从机给的回应正确,可以继续传输下一个字节,或者结束数据的传输。如果应答错误,应放弃数据或者重新读写。
    (四)停止状态
    在数据都传输都结束了,在时钟信号为高电平的时候检测到数据线SDA从低电平变到了高电平(检测到了一个上升沿产生停止信号),此时I2C结束,返回空闲状态。

刚才步骤(三),当传输完8位数据时,需要从机设备要应答的,需要给主设备发送数据,怎末应答呢??
应答的时候需要释放数据线,步骤实现:
主机发送完数据后,将数据线拉低(SDA)。
主机保持低电平一段时间,这个时间通常被称为"回复时间"或"延迟时间"。这个时间应该足够长,以便从机能够读取数据线上的低电平。
在回复时间之后,主机将数据线释放为高电平(SDA)
然后去读取这个引脚的信号是不是被从机拉低产生ACK信号了,如果拉低了说明正确。也就输说发送一次需要9位。。

先到这
参考的博主的感谢小勇,studyhttps://blog.csdn.net/weixin_44834094/article/details/121261910

你可能感兴趣的:(嵌入式开发,单片机,单片机,嵌入式硬件)