stm32 模拟I2C

目录

简介

I2C 物理层

协议层

①②:起始信号和结束信号

③ 应答和非应答信号

④数据有效性

⑤数据传输

⑥空闲状态


简介

I2C 物理层

        一个 I2C 总线两条线组成,一个双向串行数据线SDA用来表示数据,一个串行时钟线SCL用于数据收发同步

        “总线”指多个设备共用的信号线,在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机

        多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线

       每个连接到总线的设备(主、从机)都有一个独立的地址,主机可通过该地址来访问不同设备

        总线通过上拉电阻接到电源,当挂在I2C中某设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平

        具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式,一般用快速模式
 

因为I²C协议比较简单,常常用GPIO来模拟I²C时序,这种方法称为模拟I²C。如果使用MCU的I²C控制器,设置好I²C控制器, I²C控制器就自动实现协议时序,这种方式称为硬件I²C。因为I²C设备的速率比较低,通常两种方式都可以,模拟I²C方便移植,硬件I²C工作效率相对较高

协议层

        协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环
节,这里主要讲起始、停止信号、发送、接收、应答、数据有效性、地址及数据

 ①②:起始信号和结束信号

        起始 (S) 和停止 (P) 信号是两种特殊的状态,表示开始通信和停止通信。当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始;当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

/*起始信号: 初始SCL\SDA 为高,然后SDA\SCL由高拉低开始,H高L低*/
void i2c_start(void)
{SDA_H();delay();SCL_H();delay();
/*必须先拉低SDA再拉低SCL*/SDA_L();delay();SCL_L();delay();
}
/*停止信号:初始 SCL 为高,然后SDA由低拉高结束*/
void i2c_stop(void)
{SDA_L();delay();SCL_H();delay();SDA_H();delay();
}

③ 应答和非应答信号

        I²C每次传输的8位数据后需要从机反馈一个应答位,以确认从机是否正常接收了数据。应答信号为低电平时,规定为有效应答位(ACK 简称应答位);应答信号为高电平时,规定为非应答位(NACK)。当设备 (无论主从机) 接收到 I2C 传输的一个字节数据或地址后,若希望对方继
续发送数据,则需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端
希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个
停止信号,结束信号传输。

        在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制SDA,若 SDA 为高电平,表示非应答信号 (NACK),低电平表示应答信号 (ACK)

/*I2C发出应答/非应答信号*/
void i2c_ack(uint8_t AckBit)
{if(1 == AckBit)SDA_H();/*表示不应答*/elseSDA_L();/*表示应答*/delay();SCL_H();/*读取应答*/delay();SCL_L();delay();
}

④数据有效性

        SDA为高电平表示“ 1”,低电平表示“0”;SCL为高电平时表示有效数据(读取SDA数据),为低电平时表示无效数据,等SDA会进行电平切换(可能是1可能是0),为下次数据表示做准备。

 ⑤数据传输

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

        I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址来查找从机,设备地址一般是7 位的地址应用比较广泛。地址之后紧跟的一个数据位用来表示数据传输方向,数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据;发送完之后从机就会等待主机的应答信号。

/*发送一个字节,data: 要发送的数据*/
void send_byte( unsigned char data)
{unsigned char i;for(i=0;i<8;i++){if(data & (0x80 >> i))/*每次移位获取对应的数据位判断SDA是发0还是发1*/{SDA_H();/*拉高,发1*/}else{SDA_L();/*拉低,发0*/}SCL_H();/*读取数据*/delay();   SCL_L();delay();     }}
/*I2C读出一个字节*/
unsigned char iic_read_byte(void)
{unsigned char i,data = 0x00;SDA_H();delay();for(i=0;i<8;i++){SCL_H();/*拉高开始读取数据*/delay();/*使用库函数去读取SDA的GPIO引脚电平,通过返回值进入循环*/if(/*读取SDA的电平 == 1*/){data |= (0x80 >> i);/*通过读取电平进行置1*/}/*如果是0就不用进入if语句,因为data初始位0000 0000,通过上面对对应的位置1即可*/SCL_L();/*等待读取数据*/dalay();}return data;
}
/*I2C等待从机的应答信号,应答信号SDA为低*/
uint8_t i2c_wait_ack(void)
{unsigned char  wait_time=0;/*发送完数据等待应答信号的状态*/SDA_H();/*释放SDA,让发送应答信号方控制*/delay();SCL_H();/*开始读出SDA*/delay();while(/*使用库函数去读取SDA的GPIO引脚电平,通过返回值进入循环*/)/*等待应答*/{/*如果读取引脚电平为高,即1,表示不应答*/wait_time++;/*等待时间*/if(wait_time > 250){/*认为从机没有发送应答信号*/SCL_L();return 1;/*表示接收失败*/}}/*没进入循环,表示SDA拉低了,表示应答*/SCL_L();return 0;
}

⑥空闲状态

        IIC 总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

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

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

相关文章

5个最流行的文本生成纹理AI工具

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 拥抱文本生成纹理AI模型改变游戏规则的力量&#xff0c;人工智能驱动的创新彻底改变了游戏开发中的资产创建。 这些出色的工具可将书面描述转换…

《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》阅读笔记

论文标题 《Generic Dynamic Graph Convolutional Network for traffic flow forecasting》 干什么活&#xff1a;交通流预测&#xff08;traffic flow forecasting &#xff09;方法&#xff1a;动态图卷积网络&#xff08;Dynamic Graph Convolutional Network&#xff09;…

Ubuntu 使用 nginx 搭建 https 文件服务器

Ubuntu 使用 nginx 搭建 https 文件服务器 搭建步骤安装 nginx生成证书修改 config重启 nginx 搭建步骤 安装 nginx生成证书修改 config重启 nginx 安装 nginx apt 安装&#xff1a; sudo apt-get install nginx生成证书 使用 openssl 生成证书&#xff1a; 到对应的路径…

【Mybatis-Plus】常见的@table类注解

目录 引入Mybatis-Plus依赖 TableName 当实体类的类名在转成小写后和数据库表名相同时 当实体类的类名在转成小写后和数据库表名不相同时 Tableld TableField 当数据库字段名与实体类成员不一致 成员变量名以is开头&#xff0c;且是布尔值 ​编辑 成员变量名与数据库关…

IDEA中application.properties文件中文乱码

现象&#xff1a; 原因&#xff1a; 项目编码格式与IDEA编码格式不一致导致的 解决办法&#xff1a; 在File->Settings->Editor->File Encodings选项中&#xff0c;将Global Encoding,Project Encoding,Default encoding for properties files这三个选项置为一致&a…

使用 Curl 和 DomCrawler 下载抖音视频链接并存储到指定文件夹

项目需求 假设我们需要从抖音平台上下载一些特定的视频&#xff0c;以便进行分析、编辑或其他用途。为了实现这个目标&#xff0c;我们需要编写一个爬虫程序来获取抖音视频的链接&#xff0c;并将其保存到本地文件夹中。 目标分析 在开始编写爬虫之前&#xff0c;我们需要了…

QQ文件怎么恢复?3个方法解决文件丢失问题!

无论是在学习还是工作中&#xff0c;我们都有可能需要接触到QQ这款软件。QQ传输文件十分方便&#xff0c;因此仍然有许多小伙伴喜欢用QQ来发送各种类型的文件。对于大家来说&#xff0c;最害怕的莫过于重要的文件出现丢失的情况。 当我们发现QQ文件意外删除或者过期时该怎么办…

k8s之集群调度

目录 调度 工作机制 调度过程 调度算法 优先级 指定调度节点 调度 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令…

【java学习—十】操作集合的工具类Collections(8)

文章目录 1. 操作集合的工具类&#xff1a; Collections2. 应用3. 查找、替换3.1. max 与 min3.2. 根据Comparator返回max(min) 3.3. frequency 与 replaceAll4. 同步控制 1. 操作集合的工具类&#xff1a; Collections Collections 是一个操作 Set 、List 和 Map 等集合的工具…

嵌入式Linux系统的闪存设备和文件系统学习纪要

嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下&#xff1a; NAND Flash 是一种非易失性存储器&#xff08;Non-Volatile Memory&#xff09;&#xff0c;常用于闪存设备和固态硬盘&#xff08;SSD&#xff09;中。以下是几种常见的 NAND Flash 种类&…

PTA 函数题(C语言)-- 阶乘计算升级版

题目title&#xff1a; 阶乘计算升级版 题目作者&#xff1a; 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义&#xff1a; void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过1000。如果N是非负整数&#…

C#Onnx模型信息查看工具

效果 Netron效果 项目 代码 using Microsoft.ML.OnnxRuntime; using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string…

VS2022 开发方式

使用 C# 在VS 2022 上开发时&#xff0c;发现有多种项目类型可以创建。这些类型放一起容易搞混&#xff0c;于是记录一下各种类型的区别。 这里主要介绍windows控制台程序、MFC程序、WPF程序、WinForm程序的特点。 创建哪种应用&#xff1f; 创建控制台应用 Windows控制台程序…

【数据挖掘 | 数据预处理】缺失值处理 重复值处理 文本处理 确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Centos虚拟机安装配置与MobaXterm工具及Linux常用命令

目录 一、Centos操作系统 1.1 Centos介绍 1.2 Centos虚拟机安装 1.3 配置centos的镜像 1.4 虚拟机开机初始设置 1.4.1 查看网络配置 1.4.2 编辑网络配置 二、MobaXterm工具 2.1 MobaXterm介绍 2.2 MobaXterm安装 2.3 切换国内源 三、Linux常用命令和模式 3.1 查看网络配置 …

“2024中国电子信息展会“百年历史展会,4月深圳,7月成都,11月上海

2024年中国电子信息博览会&#xff0c;将如一位游历全国的使者&#xff0c;跨越千山万水&#xff0c;让人们见证中国电子信息产业的辉煌成就。它的足迹将遍布全国多个地区&#xff0c;4月走进繁花似锦的深圳&#xff0c;7月拥抱历史悠久的成都&#xff0c;11月则落脚国际化的上…

CloudCompare 二次开发(20)——二次曲面拟合

目录 一、概述二、代码集成三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、概述 由CloudCompare——点云二次曲面拟合一文知:CloudCompare软件中的已经集成了二次曲面拟合功能,但是计算出来的拟合参数是不正确的。因此,本文在原有算法的基础上进行修改,…

LSF 概览——了解 LSF 是如何满足您的作业要求,并找到最佳资源来运行该作业的

LSF 概览 了解 LSF 是如何满足您的作业要求&#xff0c;并找到最佳资源来运行该作业的。 IBM Spectrum LSF ("LSF", load sharing facility 的简称) 软件是行业领先的企业级软件。LSF 将工作分散在现有的各种 IT 资源中&#xff0c;以创建共享的&#xff0c;可扩展…

Jupyter notebook如何加载torch环境

默认你已经安装了anaconda 和 pytorch 环境。 1&#xff0c;必须要以管理员身份打开 Anaconda prompt终端&#xff0c; 2&#xff0c;进入pytorch环境中&#xff1a; conda activate pytorch_393&#xff0c;安装必要插件&#xff1a; &#xff08;1&#xff09;conda inst…

前端如何不变形的渲染图片大小和图片上的内容

在做前端项目时可能经常会页面图片大小变形或者压缩的情况&#xff0c;一般情况就是height给100%&#xff0c;width给auto就可以了满足大部分使用情况了。有时候需要做一些比较复杂的功能&#xff0c;比如需要在图片上增加锚点&#xff0c;而且图片在适配各种屏幕大小时&#x…