全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

I2C读写时序分析和实现思路

时间:2023-10-01 16:54

人气:

作者:admin

标签: I2C  读写  I2C总线  时序分析 

导读:I2C读写时序分析和实现思路-上篇推文对I2C总线的特性进行了介绍和描述。对于开发者而言,最重要的是编码I2C的读写时序驱动。本篇推文主要总结和分享I2C总线主机端通信的编程实现思...

大家好,这里是程序员 杰克 。一名平平无奇的嵌入式软件工程师

上篇推文对I2C总线的特性进行了介绍和描述。对于开发者而言,最重要的是编码I2C的读写时序驱动。本篇推文主要总结和分享I2C总线主机端通信编程实现思路,并不对应特定MCU硬件I2C外设,此处需要加以区分。

下面正式进入本章推送的内容。

01 I2C读写时序分析

I2C读写时序操作

上篇推文已对I2C主机的读写时序进行了描述。对I2C基本读写时序如图所示:

图片

在上图I2C总线(主机)的读写时序中,无论读/写操作,操作如下所示:

  • 主机发起起始信号
  • 主机向从机发送控制帧(8bit)
  • 等待从机应答位/无应答
  • 主机接收/发送数据(8bit)
  • 主机接收数据应答/无应答(读操作)、灯带从机应答/无应答(写操作)
  • 主机发起停止位

I2C读写时序拆解

对于软件开发者而言,编码上实现原则“高内聚低耦合”,即按模块独立编码。对上节的I2C总线(主机)的读写操作分析,主机需要单独实现如下操作:

  • 生成起始信号
  • 生成应答信号/无应答信号
  • 写8bit数据(控制帧和写数据合并)
  • 读8bit数据
  • 生成停止信号

02 I2C实现思路

对于I2C总线主机端的编码实现,主要是产生 起始信号 、 停止信号 、 应答/无应答信号 、 数据串行移位(读/写),下面便对各个实现进行描述。

生成起始和停止信号

起始信号和停止信号描述

I2C总线空闲时SDA和SCL皆为高电平,而起始信号和停止信号便是有别于空闲状态的特殊情况,如下图所示:

图片

image.png

编程伪代码

//产生起始信号伪代码
void I2C_Start(void)
{
    SCL = 1, SDA = 1;
    持续一段时间;
    SCL = 1, SDA = 0;
    持续一段时间;
}


//产生停止信号伪代码
void I2C_Stop(void)
{
    SCL = 0, SDA = 0;
    持续一段时间;
    SCL = 1;
    SDA = 1;
    持续一段时间;
}

应答信号/无应答信号

I2C总线通信中读/写1字节(8bit)数据操作后,会有应答/无应答信号。应答/无应答的时序如下图所示:

image.png

I2C总线主机端的应答信号/无应答信号的操作根据读时序/写时序有两种情况,主机实现以及伪代码如下所示:

读取1字节,主机发起应答/无应答信号给从机

写入1字节,主机等待从机的应答/无应答信号

数据串行移位(读/写)

对于数据的串行移位,其实现主要是在时钟SCL的驱动下,SDA信号线按MSB(高位在前、低位在后)将1字节(8bit)数据移位便可,如下图框内所示。此处不详细描述。

图片

03 文章总结

本篇主要是分享杰克对I2C的读写时序以及编码实现思路。后续会总结和分享在FPGASTM32上实现I2C的示例。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信