IIC通讯协议

这篇具有很好参考价值的文章主要介绍了IIC通讯协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

IIC(Inter-integerted Circuit)集成电路总线,该通信协议由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场景下使用,传输距离短,任意时刻只能有一个主机的特性。

二、物理层

  1. IIC通信要求需要两条线路完成数据传输,一条是串行时钟线SCL和一条串行数据线SDA

使用线路:
时钟线 – SCL
数据线 – SDA
(IIC为半双工通信)

  1. 每个连接到总线上的设备都可以通过唯一的地址和其他器件通信,主机/从机角色和地址可以配置,主机可以作为主机发送器和主机接收器

三、协议内容

IIC通信协议把信息分为两种类型的帧

  1. 地址帧:用于Master指明信息该发往哪个Slave。(从设备地址)

  2. 数据帧:由Master发往Slave的数据或是Master接收到来自于Slave的数据(一次读写单位为8bit,高位先发)

四、数据传输状态

(1)数据为有效性规定

  1. 时钟信号为高电平(High)期间,数据线上的数据必须保持稳定

  2. 时钟信号为低电平(Low)期间,数据线上方才允许变化

即:数据在时钟线SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须保持稳定

(2)空闲状态

逻辑解析:当IIC总线的数据线SDA和时钟信号当IIC总线的数据线SDA和时钟线SCL同时处于高电平(High)时,规定总线为空闲状态

此时各个器件输出及场效均处在截至状态

即:由两条信号线的上拉电阻把电平拉高

(3)起始信号

逻辑解析:时钟线SCL为高电平期间(High),数据线SDA由高电平向低电平变化(下降沿)表示起始信号
(在时钟线SCL为高电平时,拉低数据线SDA)
iic通信协议,STM32,单片机,嵌入式硬件

程序逻辑实现:

void IIC_Start(void)
{
	IIC_SDA_OUT();
	IIC_SDA = 1;
	IIC_SCL = 1;
	delay_us(5);
	IIC_SDA = 0;	// Start:在SCL为高电平时拉低SDA
	delay_us(5);
	IIC_SCL = 0;
}

(4)终止信号

逻辑解析:时钟线SCL为高电平期间(High),数据线SDA由低电平向高电平变化(上升沿) 表示终止信号
(在时钟线SCL为高电平时,拉高数据线SDA)
iic通信协议,STM32,单片机,嵌入式硬件

程序逻辑实现:

void IIC_Stop(void)
{
	IIC_SDA_OUT();
	SCL = 0;
	SDA = 0;
	delay_us(5);
	SCL = 1;
	delay_us(5);
	SDA = 1;	// Stop:在SCL为高电平时,拉高SDA
	delay_us(5);
}

(5)应答信号

逻辑解析:发送器每发送一个字节(8bit),就在第 9个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。

  1. 应答位为低电平(Low Level)时,规定为有效应答位(ACK,简称应答位)

表示接收器已经成功接收了该字节数据

  1. 应答位为高电平(High Level)时,规定为无效应答位(nACK)

一般表示接收器没有接收成功该字节数据

对反馈有效应答信号的ACK的要求是:

  1. 接收器在第9个时钟脉冲之前的时钟线SCL低电平期间将数据线SDA拉低(Low),并且确保在该时钟的高电平期间为稳定的低电平(Low Level)

  2. 如果接收器是Master,则在它收到最后一个字节后发送一个nACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控制器发送一个停止信号

程序逻辑实现:

// 1、Master接收ACK信号
uint8_t IIC_MasterWaitACK(void)
{
	uint8_t uErrTime = 0;
	IIC_SDA_OUT();
	IIC_SDA = 1;
	delay_us(2);
	IIC_SCL = 1;
	delay_us(2);
	IIC_SDA_IN();
	while(IIC_SDAin)
	{
		uErrTime++;
		if(uErrTime > 300)
		{
			IIC_SDA_OUT();
			IIC_Stop();
			return 1;	// 应答失败
		}
	}
	IIC_SDA_OUT();
	IIC_SCL = 0;
	return 0;	// 应答成功
}

// 2、Master发送ACK信号
void Master_SendAck(void)
{
	IIC_SCL=0;
	IIC_SDA_OUT();
	IIC_SDA=0;
    delay_us(2);
	IIC_SCL=1;
    delay_us(2);
	IIC_SCL=0;
}

// 3、Master不发送ACK信号
void Master_SendnAck(void)
{
	IIC_SCL = 0;
	IIC_SDA_OUT();
	IIC_SDA = 1;
    delay_us(2);
	IIC_SCL = 1;
    delay_us(2);
	IIC_SCL = 0;
}			

(6)数据传输格式

字节传输与应答

  1. 每一个字节必须保证是8bit长度

  2. 数据传送时先传最高位(MSB)

  3. 每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据共9bit)

在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制)

即:在时钟线SCL串行时钟的配合下,在数据线SDA上逐位的串行传送每一位数据

数据位传输是边沿触发

(7)总线寻址

IIC协议采用7bit的寻址字节(寻址字节是起始信号的第一个字节)

数据位定义:

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |

D7 ~ D1位:从机地址
D0位:数据传输方向(读写位)

  0:表示主机向从机写数据
  1:表示主机向从机读数据

主机向从设备中写寄存器(数据格式)

iic通信协议,STM32,单片机,嵌入式硬件

主机向从设备中读寄存器值(数据格式)

iic通信协议,STM32,单片机,嵌入式硬件

(8)数据收发

使用IIC通讯协议进行数据的接收与发送逻辑(单字节实现)文章来源地址https://www.toymoban.com/news/detail-625909.html

程序逻辑实现

void IIC_SendByte(uint8_t Data)
{
	uint8_t i;
	IIC_SDA_OUT();
	IIC_SCL = 0;
	for(i=0; i<8; i++)
	{
		IIC_SDA = ((Data&0x80)==0x80)?1:0;
		Data <<= 1;
		delay_us(2);
		IIC_SCL = 1;
		delay_us(5);
		IIC_SCL = 0;
		delay_us(2);
	}
}

uint8_t IIC_ReadByte(uint8_t ack)
{
	uint8_t i,receive=0;

	IIC_SDA_IN();
	
	for(i=0; i<8; i++)
	{ 
		IIC_SCL = 0; 
		delay_us(2);        
		IIC_SCL   = 1;	 
		receive <<= 1;
		if(IIC_SDAin)
          receive |= 0x01; 
		delay_us(2);		
	}	  
  
	if(!ack)
		Master_nAckCTP();
	else
		Master_AckCTP();

	IIC_SDA_OUT();
	
	return receive;
}

到了这里,关于IIC通讯协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模拟IIC通讯协议(stm32)(硬件iic后面在补)

            1、IIC通讯需要两条线就可以,SCL、SDA。         2、IIC的数据传输的速率,不同的ic是不同的,根据电平维持的延时函数的时间来确定IIC数据传输的速率.         3、IIC的延时函数可以使用延时函数,延时函数一般使用系统滴答时钟产生延时,也是在Sysclk频率总线的

    2024年04月15日
    浏览(58)
  • 【51单片机】EEPROM-IIC实验(按键控制数码管)

    目录   🎁I2C总线 ​编辑 🎁代码 🏳️‍🌈main.c 🏳️‍🌈i2.c 🎆代码分析   I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线,一根 数据线SDA 用于收发数据,一根 时钟线SCL 用于通信

    2024年02月11日
    浏览(50)
  • stm32之IIC通讯(详细图解附代码)

    目录 I2C硬件实现协议: 硬件I2C: 引脚选择:PB6 --SCL ;PB7 --SDA I2C 初始化结构体: I2C配置代码: I2C作为主设备发送数据:  I2C发送(写)数据代码: I2C软件模拟协议: I2C软件通信: 1、空闲状态: 2、开始信号: 3、停止信号: 4、应答信号: 5、数据的有效性: 各个信号产生

    2024年01月16日
    浏览(33)
  • STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(二)STM32F103与ESP-01s的Usart通信,实现STM32连接上网上云

    单片机:STM32F103c8t6 WiFi模块:ESP8266-01s EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本  USB TO TTL模块:CH340 因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电           本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了

    2024年02月16日
    浏览(52)
  • stm32 IIC通信

    IIC总线是一种通用数据总线,有两根通信线(SCL(串行时钟总线),SDA(串行数据总线))。 特点:同步,半双工,带数据应答,支持总线挂载多设备 所有IIC设备的SCL连在一起,SDA连在一起。 SCL与SDA均配置成开漏输出模式 SCL与SDA各添加一个上拉电阻,阻值一般为4.7千欧左右。

    2024年02月15日
    浏览(54)
  • 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域。 在本项目中,使用了51单片机作为主

    2024年02月13日
    浏览(43)
  • 两块stm32单片机串口通信讲解

    本篇文章记录了如何使用stm32f103zet6核心板(下位机)通过串口向stm32f103zet6学习板(上位机)发送数据,stm32f103zet6学习板完成接收,并将接收到的数据显示在LCD显示屏上。 正点原子精英STM32F103ZET6学习板一块(带2.8寸显示屏) STM32F103ZET6核心板一块 电源适配器、数据线以及杜

    2024年02月16日
    浏览(105)
  • stm32之IIC协议

    主要通过两个层面来讲: 物理层、协议层。 I IC 是一个同步半双工串行总线协议。 一、物理层(通信模型) 1、最早是 飞利浦 公司开发的这个协议,最早应用到其产品上去。 2、两线制(两根信号线) 其中SCL为时钟线,SDA为数据线。   3、挂载在IIC总线上的设备有主从之分

    2024年02月10日
    浏览(34)
  • STM32 IIC协议基础概念

    本篇文章将带大家学习IIC通信协议的一些基础概念和使用。 I2C(Inter-Integrated Circuit),通常也称为IIC(Inter-IC),是一种串行通信协议,用于在集成电路之间进行数据传输。它是由飞利浦半导体(现在的恩智浦半导体)开发的,并且在各种芯片和模块中被广泛采用。I2C协议的

    2024年03月18日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包