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

接口/总线/驱动

1123人已加入

描述

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

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

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

01 I2C读写时序分析

I2C读写时序操作

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

I2C总线

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

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

I2C读写时序拆解

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

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

02 I2C实现思路

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

生成起始和停止信号

起始信号和停止信号描述

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

I2C总线

I2C总线

编程伪代码

//产生起始信号伪代码
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)数据操作后,会有应答/无应答信号。应答/无应答的时序如下图所示:

I2C总线

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

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

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

数据串行移位(读/写)

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

I2C总线

03 文章总结

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分