RTT(RT-Thread)IIC设备

news2024/9/20 6:51:37

目录

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.coloradmin.cn/o/888471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

对axios封装是在main.js里面进行封装&#xff0c;因为main.js是一个vue项目的入口 步骤&#xff1a; 在1处创建一个axios实例为http&#xff0c;baseURL是基础地址&#xff08;根据自己的需求写&#xff09;&#xff0c;写了这个在vue界面调用后端接口时只用在post请求处写路由…

【Git】(三)回退版本

1、git reset命令 1.1 回退至上一个版本 git reset --hard HEAD^ 1.2 将本地的状态回退到和远程的一样 git reset --hard origin/master 注意&#xff1a;谨慎使用 –-hard 参数&#xff0c;它会删除回退点之前的所有信息。HEAD 说明&#xff1a;HEAD 表示当前版本HEAD^ 上…

深入探究Linux黑客渗透测试:方法、工具与防御

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 随着信息技术的迅…

【idea工具报错】程序包sun.misc不存在 的问题如何解决

【idea工具报错】程序包sun.misc不存在 的问题如何解决 idea工具出现下面这个报错 &#xff1a; java: 程序包sun.misc不存在 赤裸裸的报错&#xff0c;但是idea在编译代码 build的时候就报上面这个错误。 先说我的解决办法吧&#xff1a; 上面第3步这里全部改成jdk1.8的配置…

数据血缘深度透析

学习数据血缘也好几个月了&#xff0c;网上的资料也看了很多&#xff0c;有了一些自己的理解&#xff0c;所以归纳一下&#xff0c;分享 出来&#xff0c;欢迎批评指正&#xff01; 数据血缘是什么&#xff1f; 我觉得刚开始学习数据血缘肯定会有这样一个问题。比较官方、比较…

Java线程池的七个参数

线程池的构造函数有7个参数&#xff0c;分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。 一、corePoolSize 核心线程数&#xff0c;是指线程池中长期存活的线程数。int 类型。可以理解为长期存在的、“常驻的”线程。就好…

【OpenGauss源码学习 —— 列存储(创建表)】

列存储 什么是列存储&#xff1f;语法实现语法格式参数说明示例源码分析&#xff08;创建表&#xff09;语法层&#xff08;Gram.y&#xff09;子模块&#xff08;utility.cpp&#xff09; 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们…

设置Windows主机的浏览器为wls2的默认浏览器

1. 准备工作 wsl是可以使用Windows主机上安装的exe程序&#xff0c;出于安全考虑&#xff0c;默认情况下改功能是无法使用。要使用的话&#xff0c;终端需要以管理员权限启动。 我这里以Windows Terminal为例&#xff0c;介绍如何默认使用管理员权限打开终端&#xff0c;具体…

煤矿调度IP语音对讲广播模块一键求助对讲矿用调度通信系统SIP语音对讲求助终端

硬件接口描述 SV-2101VP/ SV-2103VP系列网络音频模块&#xff0c;所有外部连接采用端子&#xff0c;电源采用2.0mm的端子&#xff0c;网络采用标准RJ45连接器&#xff0c;其他都是1.25mm的连接器。 端口类型定义 P ———— 电源 AI ———— 模拟输入&#xff08;在这里是音…

diffusion model classifier-guided与classifier-free的区别

classifier-guided 训练阶段 diffusion model 和 classifier分开训练。 diffusion model的数据训练数据为 classifier的数据训练数据为 生成图片阶段 每一个时间步的降噪中会用当前时间步图片在classifier的类别梯度来调整均值。&#xff08;如上图所示&#xff09; 之前写…

智慧云实训室建设方案

一、智慧云系统概述 智慧云系统是一种基于云计算技术和虚拟化技术的系统&#xff0c;用于实现各种仿真和模拟任务。它可以提供强大的计算能力和资源管理&#xff0c;为用户提供灵活、高效、可扩展的仿真环境。 该系统通常由一组服务器、网络和存储设备组成&#xff0c;这些设备…

Vue轻量级富文本编辑器-Vue-Quill-Editor

效果图&#xff1a; 下载Vue-Quill-Editor npm install vue-quill-editor --save 下载quill&#xff08;Vue-Quill-Editor需要依赖&#xff09; npm install quill --save vue项目中使用代码 <template><div class"edit_container"><quill-edito…

linux系统安装nginx操作步骤

话不多说&#xff0c;直接上教程 一&#xff1a;安装依赖 输入命令&#xff1a;yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 二&#xff1a;下载nginx安装包 输入命令&#xff1a;wget http://nginx.org/download/nginx-1.24.0.tar.gz 用…

Flink内核源码解析

Flink内核源码 Flink RPC 网络通信框架Akka 以往&#xff0c;我们接触过非常多的大数据技术栈相关的框架&#xff0c;用的比较多的大数据相关组件&#xff0c;常用的RPC实现技术如下&#xff1a; 技术组件RPC实现HadoopNIO Protobuf (Protobuf即Protocol Buffers&#xff0…

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性&#xff0c;从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…

VS2019+Qt5.15.2 编译 QtWebEngine(带音视频解码)

前言 QtWebEngine 是 Qt 框架的一部分&#xff0c;用于构建现代 Web 浏览器功能。本篇教程将向您展示如何在 Visual Studio 2019 中编译 QtWebEngine 5.15.2 源码&#xff0c;并配置以支持音视频解码功能。 准备工作 1、源码下载 2、源码修改&#xff0c;参考Qt Code Review…

Docker基础入门:镜像、容器导入导出与私有仓库搭建

Docker基础入门&#xff1a;镜像导入导出与私有仓库搭建 一、 Docker镜像、容器的导入和导出1.1、Docker镜像的导出1.2、Docker镜像的载入1.3、Docker容器的导出1.4、Docker容器的导入 二、 镜像和容器导出和导入的区别:三、commit操作_本地镜像发布到阿里云3.1、commit操作有关…

【正点原子STM32连载】第十二章 串口通信实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第十…

在 Windows 11 上继续使用 Internet Explorer 的方法

为什么微软要淘汰IE&#xff1f; 微软在几年前积极的想要淘汰IE浏览器且用Edge来取代&#xff0c;像是Windows 11内建就没有IE浏览器&#xff0c;如果需要用到IE就必须得用Edge内的IE模式。IE缺乏现代浏览器的安全性。微软在2002年的时候&#xff0c;IE曾经占据了95%的浏览器市…

韦东山-电子量产工具项目:输入单元

所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 input_manager.h #ifndef _INPUT_MANAGER_H //防止头文件重复包含,只要右边的出现过&#xff0c;就不会再往下编译 #define _INPUT_MANAGER_H #include <sys/time.h>#define I…