IIC通信协议技术说明

IIC通信协议技术说明简介IICBus最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。网络拓扑SDA:串行数据线SCL:串行时钟线数据传输每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。当出现非响应NACK位:

大家好,又见面了,我是你们的朋友全栈君。

简介

IIC Bus 最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。

网络拓扑

在这里插入图片描述
SDA:串行数据线
SCL:串行时钟线

在这里插入图片描述

数据传输在这里插入图片描述

每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。
当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK。这种情况下,主机可以直接产生STOP条件,终止以后的数据传输或者重新START开始一个新的传输。
出现非响应NACK位:
1.接收机没有发送机响应的地址,接收端没有任何ACK发送给发射机
2.由于接收机正在忙碌处理实时程序导致无法接收或者发送
3.传输过程中,接收机识别不了发送机的数据和命令
4.主机接收完成读取数据后,要发送NACK结束告知从机

操作演示

1.主设备从从设备中写数据
2.主设备从设备中读数据
3.主设备往从设备写数据,然后重启起始条件,紧接着从从设备读取数据

  • 从设备中读流程
/* @brief @param1 器件slave address 地址 @param2 数据的地址 @param3 数据 */
uint8_t IIC_ReadOneByte(uint8_t addr, uint8_t reg, uint8_t* data)
{ 
   
    IIC_Start();                                           // 开始 调整SDA和CLK电平
    IIC_Send_Byte(addr << 1 | I2C_Direction_Transmitter);  // 确定数据传输方向
    if (IIC_Wait_Ack())                                    // 等待ACK反馈,此时SDA为输入口
	{ 
   
        IIC_Stop();
        return 0;
    }
    IIC_Send_Byte(reg);                                    // 发送数据的地址
    IIC_Wait_Ack();
	IIC_Start();
	IIC_Send_Byte(addr << 1 | I2C_Direction_Receiver);  // 确定数据传输方向
	IIC_Wait_Ack();
    *data = IIC_Read_Byte();          //读数据 
    IIC_NAck();
    IIC_Stop();
 }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136579.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • AutoreleasePool的那些事

    AutoreleasePool的那些事

    2021年6月6日
  • ArrayList底层实现原理「建议收藏」

    ArrayList底层实现原理「建议收藏」ArrayList简介ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。源码分析创建了一个大小为0的数组,在后面会用到。声明了一个数组。ArrayList的无参构造方法,将前面声明创建的大小为0的数组赋给elementData数组。这是ArrayList的有参构造方法,传入一个int类型的变量,相当于我们在使用arrayList的时候指定list的大小

    2022年8月8日
  • python autopep8_汽车auto出现错误8怎么解决

    python autopep8_汽车auto出现错误8怎么解决PEP8PEP8–StyleGuideforPythonCodePEPmeansPythonEnhancementProposals.可以理解为Python相关的规范性建议文档,深入学习Python必读。autopep8(github)AtoolthatautomaticallyformatsPythoncodetoconformtothePEP8styleguide.autopep8–in-place–aggressive–a..

    2022年9月12日
  • Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

    Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇目录环境准备新建项目pom.xml默认内容mysql数据库数据库CRUD全局配置文件默认数据源CRUD数据库PhoneController测试结果自动配置原理DataSourceConfiguration1、《SpringBoot数据库访问简介》中已经介绍,SpringBoot可以通过多种方式访问各种数据库,本文将介绍Spr…

    2022年6月23日
  • JAVAWEB酒店管理系统[通俗易懂]

    JAVAWEB酒店管理系统[通俗易懂]酒店管理系统分为前台和后台两个部分,其中后台供管理员管理系统之用,包括客房类型设置模块、客房设置模块以及操作员设置三个子模块,具体的功能模块如下。客房类型设置模块:该模块用来管理酒店的所有客房类型,包括新增客房类型、编辑已有客房类型、删除客房类型等功能。客房设置模块:该模块用来管理酒店的所有客房信息,包括新增客房、编辑已有客房、删除客房等功能。操作员设置模块:该模块用来管理酒店的操作员信息,包括新增操作员、编辑已有操作员信息、删除操作信息等功能。系统前台供酒店所有工作人员使用,包括入住登记模块、结账

    2022年9月23日
  • 限制普通域帐户将其他计算机加入域的方法!

    限制普通域帐户将其他计算机加入域的方法!

    2021年8月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号