0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C主设备与从设备的一般通信过程

xCb1_yikoulinux 来源:一口Linux 作者:一口Linux 2022-04-25 14:36 次阅读

I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备

物理I2C接口有两根双向线,串行时钟线(SCL)串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。

923195ca-c44c-11ec-bce3-dac502259ad0.png

I2C主设备与从设备的一般通信过程

一. 主设备给从设备发送/写入数据:

1.主设备发送起始(START)信号

2. 主设备发送设备地址到从设备

3. 等待从设备响应(ACK)

4. 主设备发送数据到从设备,一般发送的每个字节数据后会跟着等待接收来自从设备的响应(ACK)

5.数据发送完毕,主设备发送停止(STOP)信号终止传输

9243d1b8-c44c-11ec-bce3-dac502259ad0.png

二. 主设备从从设备接收/读取数据

1.设备发送起始(START)信号

2. 主设备发送设备地址到从设备

3. 等待从设备响应(ACK)

4.主设备接收来自从设备的数据,一般接收的每个字节数据后会跟着向从设备发送一个响应(ACK)

5.一般接收到最后一个数据后会发送一个无效响应(NACK),然后主设备发送停止(STOP)信号终止传输

92567f84-c44c-11ec-bce3-dac502259ad0.png

注:具体通信过程需视具体时序图而定

I2C通信的实现

一.使用I2C控制器实现

就是使用芯片上的I2C外设,也就是硬件I2C,它有相应的I2C驱动电路,有专用的IIC引脚,效率更高,写代码会相对简单,只要调用I2C的控制函数即可不需要用代码去控制SCL、SDA的各种高低电平变化来实现I2C协议,只需要将I2C协议中的可变部分(如:从设备地址、传输数据等等)通过函数传参给控制器,控制器自动按照I2C协议实现传输,但是如果出现问题,就只能通过示波器看波形找问题。

二.使用GPIO通过软件模拟实现

软件模拟I2C比较重要因为软件模拟的整个流程比较清晰哪里出来bug很快能找到问题模拟一遍会对I2C通信协议更加熟悉

如果芯片上没有IIC控制器,或者控制接口不够用了,通过使用任意IO口去模拟实现IIC通信协议,手动写代码去控制IO口的电平变化,模拟IIC协议的时序,实现IIC的信号和数据传输,下面会讲到根据通信协议如何用软件去模拟

I2C通信协议

IIC总线协议无非就是几样东西:起始信号停止信号应答信号、以及数据有效性

一. 空闲状态

时钟线(SCL)和数据线(SDA)接上拉电阻默认高电平表示总线是空闲状态

二. 从设备地址

从设备地址用来区分总线上不同的从设备,一般发送从设备地址的时候会在最低位加上读/写信号,比如设备地址为0x50,0表示读,1表示写,则读数据就会发送0x50,写数据就会发送0x51。

三. 起始(START)信号

I2C通信的起始信号由主设备发起,SCL保持高电平,SDA由高电平跳变到低电平。

926a1292-c44c-11ec-bce3-dac502259ad0.png

//起始信号
voidIIC_start(void)
{
//1.首先把数据线设置为输出模式
//总线空闲,SCL和SDA输出高
SCL=1;
SDA=1;
delay_us(5);

//SDA由高变低
SDA=0;
delay_us(5);

//拉低SCL开始传输数据
SCL=0;
}

四. 停止(STOP)信号

I2C通信的停止信号由主设备终止,SCL保持高电平,SDA由低电平跳变到高电平。

927c8d14-c44c-11ec-bce3-dac502259ad0.png

//停止信号
voidIIC_stop(void)
{
//1.首先把数据线设置为输出模式

//拉高时钟线
SDA=0;
delay_us(5);
SCL=1;
delay_us(5);

//SDA由低变高
SDA=1;
}

五. 数据有效性

I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令STARTSTOP,也就是前面的起始信号停止信号)。

928da61c-c44c-11ec-bce3-dac502259ad0.png

六. 应答信号(ACK:有效应答,NACK:无效应答)

接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。

当SDA是低电平为有效应答(ACK),表示对方接收成功

当SDA是高电平为无效应答(NACK),表示对方没有接收成功

发送数据需要等待接收方的应答:

//等待ACK1-无效0-有效
u8IIC_wait_ack(void)
{
u8ack=0;

//数据线设置为输入

//拉高时钟线
SCL=1;
delay_us(5);
//获取数据线的电平
if(SDA)
{//无效应答
ack=1;
IIC_stop();
}
else
{//有效应答
ack=0;
//拉低SCL开始传输数据
SCL=0;
delay_us(5);
}

returnack;
}

需要发送发送

voidIIC_ack(u8ack)
{
//数据线设置为输出

SCL=0;
delay_us(5);

if(ack)
SDA=1;//无效应答
else
SDA=0;//有效应答
delay_us(5);
SCL=1;
//保持数据稳定
delay_us(5);
//拉低SCL开始传输数据
SCL=0;
}


审核编辑 :李倩


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

    关注

    18

    文章

    6021

    浏览量

    135949
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1484

    浏览量

    123592

原文标题:IIC通信入门,搞懂这篇就够了

文章出处:【微信号:yikoulinux,微信公众号:一口Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全志模块设备开发之I2C编程基础介绍

    发送到设备上去;也需要把数据设备传送到主设备上去,数据涉及到双向传输。 ​对于
    发表于 12-16 09:45

    I2C总线为什么要接上拉电阻

    I2C为什么要接上拉电阻?因为它是开漏输出。 为什么是开漏输出? I2C协议支持多个主设备与多个设备
    的头像 发表于 11-20 10:07 420次阅读
    <b class='flag-5'>I2C</b>总线为什么要接上拉电阻

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c设备通信编程

    struct_i2c_param,包含了些与i2c通信相关的参数,包括设备地址、寄存器地址、数据长度和数据缓冲区。main.cmain.
    发表于 11-02 17:01

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c编写程序

    对于我们ELF 1板卡来说,我们前面看到的i2c-0、i2c-1总线对应着CPU的两个i2c适配器,作为主设备,而总线上挂载的设备作为
    发表于 11-01 11:31

    飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c设备通信编程

    函数执行i2c写操作。最后,释放动态分配的内存,并返回执行结果。 (三)第三部分定义了函数func_read_regs,用于设备读取寄存器数据。过程与func_write_regs类
    发表于 11-01 11:28

    RISC V的I2C操作

    。tsuData中,1代表10ns;Timeout中,1表示10nstLow和tHigh的1代表10ns10.1.3 软件部分(Risc V)l  I2C通信主要包括以下几个部分:1、主设备发送起始位(Start
    的头像 发表于 11-01 11:06 191次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c编写程序

    总线上挂载的设备作为设备。如/dev/i2c-1对应的适配器作主设备,其上面挂载的光线传感器就作为
    发表于 10-31 12:00

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c硬件原理

    读写位组成,i2c开始通信时,主设备会发起总线寻址,在发起起始信号之后,发送个字节的设备地址。R/W位:表示数据传输的方向。当R/W位为0
    发表于 10-29 16:29

    飞凌嵌入式ElfBoard ELF 1板卡-i2c设备通讯编程示例之i2c硬件原理

    读写位组成,i2c开始通信时,主设备会发起总线寻址,在发起起始信号之后,发送个字节的设备地址。R/W位:表示数据传输的方向。当R/W位为0
    发表于 10-28 08:58

    简单认识I2C通信协议

    I2C(Inter-Integrated Circuit)通信协议是由飞利浦公司(现为恩智浦半导体)开发的种简单、双向二线制同步串行总线协议。自1982年发布以来,I2C协议因其高效
    的头像 发表于 07-25 18:06 1422次阅读

    I2C、SPI、UART的通信过程还可以这样理解

    到目前为止,I2C、SPI和UART等仍然是电子嵌入式设备中最常用的通信协议,本文,我们将剖析这三种协议,让大家清楚、直观的了解它们的功能、优点和局限性,并辅以GIF动图展示。、II
    的头像 发表于 05-23 08:10 7072次阅读
    <b class='flag-5'>I2C</b>、SPI、UART的<b class='flag-5'>通信</b><b class='flag-5'>过程</b>还可以这样理解

    逼真动画展示I2C、SPI、UART的通信过程

    到目前为止,I2C、SPI和UART等仍然是电子嵌入式设备中最常用的通信协议,本文,我们将剖析这三种协议,让大家清楚、直观的了解它们的功能、优点和局限性,并辅以GIF动图展示。I2C
    的头像 发表于 04-12 08:27 973次阅读
    逼真动画展示<b class='flag-5'>I2C</b>、SPI、UART的<b class='flag-5'>通信</b><b class='flag-5'>过程</b>

    PSOC6如何通过I2C与外围设备通信

    PSOC6 如何通过 I2C 与外围设备通信? 我不太明白这系列芯片 CAN 如何向上或向下拉动?我根据例程编写了个与
    发表于 01-31 06:08

    使用两片ADU360进行I2C通信,当与机进行通信时,机无法进入I2C中断是为什么?

    问题说明:使用两片ADU360进行I2C通信,主机使用IO口模拟方式,机使用内部外设 主机IO口模拟方式,确认是可行,当与机进行通信时,
    发表于 01-15 06:47

    【先楫HPM5361EVK开发板试用体验】RT-Thread I2C使用

    数据传输并产生时钟信号,设备主设备寻址,同时刻只允许有主设备。如下图所示:
    发表于 12-25 23:57