STM32HAL库--IIC实验(速记版)

STM32 的普通 IO 口模拟 IIC 时序,可实现与 EEPROM 外设双向通信。

IIC 简介

        IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器以及其外围设备。

        IIC 是由数据线 SDA时钟线 SCL 构成的串行总线。

        IIC 总线有如下特点:

        ① 数据线用来传输数据,时钟线用来同步数据收发。

        ② 总线上每个器件都有唯一器件地址,只需知道器件地址,根据时序即可实现微控制器与器件之间的通信。

        ③ 数据线 SDA 和时钟线 SCL 都是双向线路空闲时都是 SDA 和 SCL 都是高电平

        ④ IIC 传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达 3.4Mbit/s。

        ⑤ IIC 总线支持多设备挂载在上面,同时支持多从机,连接到总线的接口数量只受总线电容 400pF 的限制。

IIC总线协议

IIC 时序是经典面试题。

起始信号。SCL 高电平期间,SDA 出现下降沿就表示起始位。

停止信号。SCL 高电平期间,SDA 出现上升沿就表示停止位。

应答信号。IIC 发送完 8 位数据以后会将 SDA 改成输入状态,等待 IIC 从机应答。从机会在主机提供的 SCL 时钟信号下将 SDA 拉低,代表成功应答。

数据有效性。在 SCL 高电平期间,SDA 必须保持稳定。因此 SCL 低电平期间, SDA 电平状态才允许变化。

数据传输。在 SCL 配合下, SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。

空闲状态。SCL 和 SDA 同时处于高电平时,总线处于空闲状态。

IIC 读写通讯过程

IIC 的读写通讯过程,包括写操作,即主机写数据到从机,读操作,主机从从机读取数据。

写时序的具体步骤:

1)、起始信号。 

2)、发送 I2C 设备地址,等应答。设备地址是 8 位数据,前 7 设备地址,最后位是读写位。

3)、重新发起始信号,发送要写写入数据的寄存器地址。等应答。

4)、发送要写入寄存器的数据。 等应答。

5)、停止信号。

读时序具体步骤:

1)、主机发送 START 信号

2)、主机发送要读取的 I2C 从设备地址+读写位。7 位设备地址,最后一位读写位。等应答。

3)、重新发送 START 信号。主机发送要读取的寄存器地址。等应答。

4)、重新发送 START 信号。重新发送要读取的 I2C 从设备地址+读写位。等应答。

5)、从 I2C 器件里面读取到数据。

6)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。

7)、主机发出 STOP 信号,停止 I2C 通信。

I2C 多字节读写时序:

        有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。

24C02 简介

        24C02 是一个 2K bit 的串行 EEPROM 存储器,内部含有 256 个字节。在 24C02 里面还有一个 8 字节的页写缓冲器。该设备的通信方式 IIC,通过其 SCL和 SDA与其他设备通信,芯片的引脚图如图 36.1.2.1 所示。

        图中 WP 是写保护引脚,接高电平只读,接地允许读和写,阿波罗板子上该引脚接地。         24C02 的设备地址是包括不可编程部分和可编程部分,可编程部分是根据上图的硬件引脚A0、A1 和 A2 所决定。设备地址最后一位用于设置数据的传输方向,即读操作/写操作,0 是写操作,1 是读操作,具体格式如下图 36.1.2.2 所示: 

        根据阿波罗板子的设计,A0、A1 和 A2 均接地处理,所以 24C02 设备的读操作地址为:0xA1;写操作地址为:0xA0。

IIC 访问 EEPROM 配置流程

1)使能 IIC 的 SCL 和 SDA 对应的 GPIO 时钟。SDA 线的 GPIO 模式使用开漏输出模式(硬件已接外部上拉电阻,也可以用内部的上拉电阻。SCL 线的 GPIO 模式使用推挽输出模式,通过函数 HAL_GPIO_Init 设置实现。

2)设置对应 GPIO 工作模式(SCL 推挽输出 SDA 开漏输出)。

3)参考 IIC 总线协议,编写信号函数(起始信号,停止信号,应答信号)
        起始信号:SCL 为高电平时,SDA 由高电平向低电平跳变。
        停止信号:SCL 为高电平时,SDA 由低电平向高电平跳变。
        应答信号:接收到 IC 数据后,向 IC 发出特定的低电平脉冲表示已接收到数据。

4)编写 IIC 的读写函数
        通过参考时序图,在一个时钟周期内发送 1bit 数据或者读取 1bit 数据。读写函数均以一字节数据进行操作。有了读和写函数,我们就可以对外设进行驱动了。

IIC 总线 I/O 扩展

PCF8574 简介

        PCF8574是飞利浦公司推出的一款带 IIC 总线,可使大多数 MCU实现远程 I/O 扩展。该器件包含一个 8 位准双向口和一个 IIC 总线接口。它还带有一条中断接线(INT)可与 MCU 的中断逻辑相连,通过 INT 发送中断信号,远端 I/O 口不必经过 IIC 总线通信就可通知 MCU 是否有数据从端口输入,这意味着 PCF8574 可以作为一个单被控器。

        阿波罗开发板使用的PCF8574采用SO16封装,总共16个脚,其中包括:8个准双向IO口(P0~P7)3 个地址线(A0~A2)、SCL、SDA、INT、VDD 和 VSS。每个 PCF8574T 只需要最少 2 个 IO口,就可以扩展 8 路 IO,且支持一个 IIC 总线上挂最多 8 个 PCF8574T,这样通过 2 个 IO,最多可以扩展 64 个 IO 口。

PCF8574 寻址:

        一个 IIC 总线上,最多可以挂 8 个 PCF8574T(通过 A0~A2 寻址),PCF8574T 的从机地址格式如图 37.1.1 所示:

        A0~A2 为 PCF8574T 的寻址信息,我们开发板上 A0~A2 都是接 GND 的,所以,PCF8574T 的地址为:0X40。最后一位是读/写信号。

写数据:

        发送 PCF8574T 的从机地址+写信号(R/W=0),然后等待 PCF8574 的应答信号,在应答成功后,发送数据(DATA1)给 PCF8574T 就可以了。

读数据:

        发送 PCF8574T 的从机地址+读信号(R/W=1),然后等待 PCF8574T 应答(注意:PCF8574T 在发送应答的同时,会锁存 P0~P7 的数据),然后读取 P0~P7 的数据。数据读取支持连续读取,在最后的时候发送 STOP 信号,即可完成读数据操作。

中断:

        PCF8574T中的中断引脚(INT)提供了一种高效的通知机制,使得微控制器(MCU)无需通过耗时的I²C总线通信就可以得知I/O端口状态的变化。当使用PCF8574T作为远程I/O扩展器时,其8个端口可以配置成输入或输出。当这些端口被配置为输入时,其中任意一个端口状态发生改变(比如从低电平变为高电平,或从高电平变为低电平),INT引脚就会产生一个中断信号,即INT引脚被拉低到低电平(平时 INT 为高,开漏,接了上拉电阻)。

        特别指出的是,当INT引脚产生中断后,MCU必须通过I²C总线对PCF8574T进行一次读取或写入操作,以清除中断标志(INT 恢复高电平),也就是所谓的中断复位。如果不这样做,INT引脚将保持在低电平状态,不会响应下一次的输入信号变化产生的中断请求。

IIC 访问 IO扩展配置步骤

例程功能:

        开机时检测 PCF8574T 是否存在,然后在主循环里面检测按键和 PCF8574T 的中断信号,当按键按下时,IIC 控制 PCF8574T 的 P0 口输出,从而控制蜂鸣器(连接在P0口)的开关;

        当检测到PCF8574T的 INT 引脚中断产生的低电平信号时,读取 EXIO(连接在PCF8574T的P4口)的状态,当 EXIO=0(即 P4=0)时,控制 LED1 的翻转。同时,LCD 模块显示相关信息,并用 DS0 提示程序正运行。

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

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

相关文章

在数据库领域是如何实现“多租户”的呢?

数据库多租技术介绍 随着云计算时代的到来,多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源,能够帮助用户节约硬件成本和运维成本,提高资源利用效率。同时,在实现的过程中,考虑到共享带来的安全…

three.js - matcap材质(MeshMatcapMaterial)

说一下matcap纹理 先总结:MeshMatcapMaterial材质,通过采样含有光照信息的贴图来模拟光照效果。这种材质特别适用于模拟静态光源下的光照,并且,因其简单性和快速性而被广泛应用于各种场景。但是,由于其性能考虑&#x…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中,我们通过系统思考仿真演练深入探索决策背后的动因。例如,我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”,这些都是麻省理工MBA学生的必修课。此外,还有更简洁的“红黑游戏”“收获季节”等模拟…

ElasticSearch索引架构与存储

关于ES官网的介绍: Elasticsearch provides near real-time search and analytics for all types of data. Whether you have structured or unstructured text, numerical data, or geospatial data, Elasticsearch can efficiently store and index it in a way that support…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区,创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建,本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www…

mid360配置lio-sam、point-lio和faster-lio(faster-lio未敢配置)

一、使用mid360配置lio-sam 1.首先从GitHub - nkymzsy/LIO-SAM-MID360 at Livox-ros-driver2 下载能支持mid360的lio-sam版本到 ws_livox/src中,直接编译,就可以成功。 2.使用 roslaunch lio_sam run6axis.launch以及播之前我才记得Mid360的包&#x…

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题,确保在高并发场景下对共享资源的访问是互斥的,避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

idea中maven新增的配置文件xx.xml没生效问题

项目场景: 因为公司使用自己的私服下载jar,则没有使用默认的settings.xml文件。而是新增了一个settingsold.xml文件 问题描述 公司项目有用自己的私服,Maven正常去私服下载jar包是没问题的。但是一直是去找的阿里云镜像,到导致阿里云镜像找不到相关的jar包报错!!!…

前端:Nuxt2 + Vuetify2

想要开发一个网站,并且支持SEO搜索,当然离不开我们的 Nuxt ,那通过本篇文章让我们一起了解一下。如果构建一个Nuxt项目 安装 Nuxt,创建项目 安装nuxt2, 需要node v16,大家记得查看自己的node版本。构建脚…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理,这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层,upperdir是可读写层,merged是合并层(挂载点),那么我们可以利用这个机…

.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据 目录 .NET C# 使用GDAL将mdb转换gdb数据1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.8.5 2 Nuget 3 Code FeatureExtension.cs public static class FeatureExtension {[DllImport("gdal.dll", EntryPoint &…

【权威主办|检索稳定】2024年法律、教育与社会发展国际会议 (LESD 2024)

2024年法律、教育与社会发展国际会议 (LESD 2024) International Conference on Law, Education and Social Development in 2024 【重要信息】 大会地点:成都 官网地址:http://www.iclesd.com 投稿邮箱:iclesdsub-conf.com 【注意&#xff1…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

Renesas MCU使用SCI_I2C驱动HS3003

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 认识HS3003 1.2.1 HS3003特性 1.2.2 HS3003寄存器 1.2.2.1 温湿度数据寄存器 1.2.2.2 参数寄存器 1.2.2.3 一个参数配置Demo 1.2.3 温湿度值转换 1.2.4 HS3003应用电路 1.2.4.1 PIN引脚定义 1.2.4.2 sensor 应用电路 …

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【探索响应式布局的奥秘:关键技术与实战代码示例】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论…

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式(Regular Expression,常简写为regex、regexp或RE)是一种强大的文本处理工具,它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

Shell 编程入门

优质博文&#xff1a;IT-BLOG-CN 【1】x.sh文件内容编写&#xff1a; 固定开头&#xff1a;#&#xff01;/bin/sh&#xff1b; 【2】学习的第一个命令就是echo输出的意思&#xff1b; 【3】其实shell脚本也就是在文件中写命令&#xff0c;但是我们要写的是绝对路径&#xff1a…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…