RTT(RT-Thread)IIC设备

目录

IIC设备

IIC介绍

电气连接

IIC总线时序

IIC协议

读协议

写协议

访问I2C总线设备

查找 I2C 总线设备

I2C数据读写(数据传输)

配置IIC步骤


 

IIC设备

IIC介绍

I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。而我们之前的串口设备属于全双工通信,一般使用异步功能。

I2C 总线传输数据时只需两根信号线:

  • 双向数据线 SDA
  • 双向时钟线 SCL

电气连接

在一个IIC总线上,可以挂在多个主机,也可以挂在多个从机。也就是说在IIC总线上,可以支持多主多从的模式。对于多个主机,IIC采用仲裁的方式来确定到底哪个主机在通信,对于从机的访问是根据协议里面从机的地址来确定到底跟哪一个从机设备通信。

一般我们使用IIC总线采用一主一从或者一主多从的方式。

IIC总线时序

IIC的时序图如下

在IIC通信的时候,需要主机去发送一个起始条件,然后从机才会响应,当主机主动发出停止条件,双方才会结束通信。

起始条件:时钟线在高电平的时候,数据线由高到低产生负跳变。

停止条件:在时钟线的高电平期间,数据线由低到高产生正跳变。

在时钟线的高电平期间,进行数据线的读取。在时钟线的低电平期间,发生数据线的跳变。

在IIC通信中除了基本的读取写入数据,还包括应答。

应答:在通信的时候,主机发送数据或命令给从机的时候,从机需要产生应答信号,数据线为低电平表示发送应答信号,电平拉高表示非应答信号。

IIC协议

读协议

单字节读:

首先主机发送一个起始信号,一旦主机发送起始信号之后,挂载在总线上的所有从机设备都能接收到。因此紧接着会发送一个字节其中包括了目标从机的地址和写命令(一共是0-7八个位,1-7位代表设备地址,0位代表读写方向)。

相应从机接收到命令就会产生一共应答信号。然后主机接着发送一个字节(存储目标寄存器的地址),接着等待从机应答。接着再发送一个字节,其中再次指定目的从机地址和读命令,表示从机想要从机的寄存器中读取数据了。从机再次发送一个应答,并将相应寄存器中的数据发送给主机。

最后主机接收完数据产生一个非应答信号,并发出停止信号。

多字节读:

对于多字节读,步骤前面与单字节读一样。但是在主机接收到从机发送的数据之后,产生的是一个应答信号。那么从机就会继续发送数据,然后手机继续产生应答信号,从机继续发送,直到主机发送一个非应答加停止信号以后才结束通信。

写协议

单字节写:

首先主机发送一个起始信号;接着发送一个字节命令,其中包括从机的地址和写方向;从机产生应答;主机继续发送一个字节,指明了要写入到从机的寄存器地址;从机产生应答;主机发送数据;从机产生应答;主机发送停止信号,通信结束。

多字节写:

多字节写与单字节写相同,只要主机不主动发出停止信号,从机就一直对主机写入数据产生应答,直到主机发送停止信号,才结束通信。

访问I2C总线设备

查找 I2C 总线设备

#define AHT10_I2C_BUS_NAME "i2c1" /*传感器连接的I2C总线设备名称*/
struct rt_i2c_bus_device *i2c_bus; /*I2C总线设备句柄*//*for i2c bus driver*/
struct rt_i2c_bus_device
{struct rt_device parent;const struct rt_i2c_bus_device_ops *ops;rt_uint16_t  flags;rt_uint16_t  addr;struct rt_mutex lock;rt_uint32_t  timeout;rt_uint32_t  retries;void *priv;
};/*查找I2C总线设备,获取I2C总线设备句柄*/
i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name);rt_device_t rt_device_find(const char *name);

I2C数据读写(数据传输)

该函数既可以实现写数据,也可以进行读数据

参数1:I2C设备句柄

参数2:要发送获接收的数据包(定义一个结构体数组)

参数3:数据包的个数

#define RT_I2C_WR 0x0000    
#define RT_I2C_RD (1u << 0)struct rt_i2c_msg
{rt_uint16_t addr;rt_uint16_t flags;rt_uint16_t len;rt_uint8_t  *buf;
};
rt_size_t rt_i2c_transfer(structrt_i2c_bus_device *bus,structrt_i2c_msg      msgs[],rt_uint32_t      num)

对于rt_i2c_msg结构体的成员解释:

  • addr为从机的地址
  • flags为读写的标志,读为1,写为0
  • len为要发送获读取的数据长度
  • buf指向读写数据的空间首地址

配置IIC步骤

/** if you want to use i2c bus(soft simulate) you can use the following instructions.** STEP 1, open i2c driver framework(soft simulate) support in the RT-Thread Settings file** STEP 2, define macro related to the i2c bus*                 such as     #define BSP_USING_I2C1** STEP 3, according to the corresponding pin of i2c port, modify the related i2c port and pin information*                 such as     #define BSP_I2C1_SCL_PIN    GET_PIN(port, pin)   ->   GET_PIN(C, 11)*                             #define BSP_I2C1_SDA_PIN    GET_PIN(port, pin)   ->   GET_PIN(C, 12)*/

步骤一:在驱动框架中开启对IIC设备的支持

步骤二:在board.h中宏定义使用IIC

步骤三:指定IIC使用哪写引脚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70268.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot案例-部门管理-新增

根据页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 接口文档链接如下&#xff1a; 【腾讯文档】SpringBoot案例所需文档 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 前端在输入要新增的部门名称后&#xff0c;会以JSON格式将数据传入至后端&#xf…

2023年国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

leader-line相关配置问题

安装完两个插件都是教去改config // configureWebpack: config > {// let path require(path)// config.module.rules.push({// test: path.resolve(__dirname, node_modules/leader-line/),// use: [// {// loader: skeleton-loader,// …

开源低代码平台Openblocks

网友 HankMeng 想看低代码工具&#xff0c;正好手上有一个&#xff1b; 什么是 Openblocks &#xff1f; Openblocks 是一个开发人员友好的开源低代码平台&#xff0c;可在几分钟内构建内部应用程序。 传统上&#xff0c;构建内部应用程序需要复杂的前端和后端交互&#xff0c;…

使用GraphQL在Postman中进行API测试

GraphQL 是一种用于API的开源数据查询和操作语言&#xff0c;用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求&#xff0c;并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。 Postman 是一款用于API开发的强大工具&#xff0c;它支持REST和Gra…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

电脑提示数据错误循环冗余检查怎么办?

有些时候&#xff0c;我们尝试在磁盘上创建分区或清理硬盘时&#xff0c;还可能会遇到这个问题&#xff1a;数据错误循环冗余检查。这是如何导致的呢&#xff1f;我们又该如何解决这个问题呢&#xff1f;下面我们就来了解一下。 导致冗余检查错误的原因有哪些&#xff1f; 数据…

利用HTTP代理实现请求路由

嘿&#xff0c;大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我知道构建一个高效的分布式爬虫系统是一个相当复杂的任务。在这个过程中&#xff0c;实现请求的路由是非常关键的。今天&#xff0c;我将和大家分享一些关于如何利用HTTP代理实现请求路由的实用技巧&…

【制作npm包5】npm包制作完整教程,我的第一个npm包

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

算法:双指针解决数组划分和数组分块问题

文章目录 实现原理实现思路典型例题移动0复写0快乐数盛最多水的容器有效三角形的个数三数之和四数之和 总结 在快速排序或者是其他和数组有关的题目中&#xff0c;有很经典的一类题目是关于数组划分的&#xff0c;数组划分就是把数组按照一定的规则划分为不同的区间&#xff0c…

JLSX 模版指令导出Excel

1. 官方相关链接 官网&#xff1a;https://jxls.sourceforge.net/reference/if_command.html JxlsAPI&#xff1a; https://jxls.sourceforge.net/javadoc/jxls/index.html Jxls POI&#xff1a; https://jxls.sourceforge.net/javadoc/jxls/index.html Jxls JExcel&#xff1…

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…