stm32学习笔记:I2C通信外设原理(未完)

 软件实现和硬件实现

串口通信为异步时序,用软件实现很麻烦,基本上用硬件实现
而I2C协议通信为同步时序,软件实现简单且灵活,硬件实现比较麻烦,故软件比较常用
但I2C硬件实现功能比较大,执行效率高,节省软件资源,可以实现完整的多主机通信模型,时序波形归整,通信速率快
故I2C软件实现用于简单环境,若性能要求高,则硬件实现

 

I2C外设简介  

1.(软件只需要写入控制寄存器CR和数据寄存器DR,就可以实现协议,为了实现实时监控时序的状态,软件要读取状态寄存器SR

2.支持多主机模型(固定多主机和可变多主机(stm32,谁要做主机,主机就得跳出来)) 

3.本实验依旧是7位、一个主机(一主多从)

 4.STM32F103C8T6 硬件 I2C 资源: I2C1 、 I2C2(两个独立I2C,硬件只有俩路I2C总线,而软件I2C只要代码存的下,想开几路就开几路) 

I2C的功能图

(1)数据控制部分

1 数据收发的核心部分:数据寄存器和数据移位寄存器 
2 发送数据时,将数据放在数据寄存器,当没有移位时候,数据从数据寄存器转运到移位寄存器,同时,下一个数据送到数据寄存器,然后移位寄存器将数据给SDA,数据寄存器中的数据给移位寄存器,如此往复
3 当数据寄存器转到移位寄存器时,就会置状态寄存器的TXE位为1,表示发送寄存器为空

接收数据

  •  接收数据时,从SDA转到移位寄存器,再转到数据寄存器,同时置标志位RXNE,表示接受寄存器非空,这时候可以把数据从数据寄存器读出来
  • 比较器和地址寄存器时从机模式使用(即再stm32不进行通信的时候,这个stm32支持同时响应两个从机地址
SCL部分 

时钟控制:控制SCL线
时钟控制寄存器(CCR):写对应的位,电路就会执行对应的功能
控制逻辑电路:写入控制寄存器(CR1/CR2),就可以对整个电路进行控制
读取状态寄存器,可以得知电路的工作状态
中断:当内部有一些标志位置1后,可能事件比较紧急,就可以申请中断
如果开启中断,当事件发生后,程序可以跳转到中断函数处理事件

I2C基本结构 

发送数据(从数据控制器到SDA):因为I2C是高位先行,所以移位寄存器是向左移位,在发送和的时候,最高位先移出去,然后是次高位,一次SCL时钟移位一次,移动8次,就把一个字节由高位到低位,一次放到SDA线上
接收数据:数据从SDA经GPIO口,从右边一次移进来,最终移动8次,一个字节就接收完成
使用硬件I2C:两个GPIO口,都要配置成复用开漏输出模式
复用就是GPIO的状态由片上外设来控制
开漏输出:时I2C协议要求的端口配置(GPIO口依旧可以输入)

 主机发送

7位主发送的过程

TxE=1表示数据寄存器空,BTF字节发送结束标志位
SB=1,表示起始条件已经发送
(1)初始化之后:总线默认空闲状态,stm32默认是从模式
(2)stm32需要写入控制寄存器产生起始条件:
控制寄存器CR1中,有个START位,写1,可以产生起始条件,起始条件发生后,这一位由硬件清除,不需要手动侵清除
之后stm32从从模式转换成主模式
(3)检查标志位
EV5事件:SB(start bit)=1,表示起始条件已经发送
(4)发送从机地址:需要写到数据寄存器DR中,写入后,硬件自动把这个字节转到移位寄存器中,再把这个字节发送到IIC总线上
之后硬件会自动接收应答并判断,若没有应答,硬件会置应答失败的标志位,标志位可以申请中断来提醒我们
(5)寻址完成之后,会发生EV6事件,ADDR=1,代表在主模式下发送结束
(6)EV8_1事件:TxE=1,移位寄存器和数据寄存器为空,写入数据寄存器DR进行数据发送,一旦写入DR,因为
移位寄存器也是空的,所以DR会立刻转到移位寄存器进行发送
(7)EV8事件:TxE=1,移位寄存器非空,数据寄存器空,这移位寄存器正在发数据的状态,故数据1的时序产生
一旦检测到EV8事件,就可以写入下一个数据
(8)EV8_2事件:写完后,没有数据可以写了

 主机接收

这里是当前地址读的模式

(1)首先写入start位,产生起始条件,等EV5事件,EV5事件代表起始条件已经发送,

(2)之后是寻址,接收应答,结束后产生EV6事件,代表寻址已经完成

(3)数据1这块,代表数据正在通过移位寄存器进行输入,EV6-1事件,从上图可以看出,数据正在移位,还没收到,所以事件没有标志位,当这个时序单元完成时,硬件会自动根据我们的配置,把应答位发送出去(ACK应答使能,写1,在接收到一个字节后就返回一个应答,写0不给应答),当时序单元完成后,表示移位寄存器已经成功移入一个字节的数据1,这时,移入的一个字节就整体转移到数据寄存器中,同时置RxNE标志位,表示数据寄存器非空,也就是收到一个字节的数据,这个状态就是EV7事件、

(4)当把数据读走后,EV7事件就没有了

(5)EV7_1:结束

(6)由于设置了ACK=0,所以会给出非应答,最后由于设置STOP位,所以产生终止条件

 软件和硬件之间的比较

 (1)硬件IIC的波形比较规整,软件IIC由于添加了延时,时钟周期、占空比可能不规整

SCL低电平写,高电平读(默认下降沿写,上升沿读,硬件IIC数据写入,都是紧贴着下降沿,SCL下降沿,SDA立马切换数据)

(2)在硬件中,应答结束后,从机立刻释放SDA,同时主机立刻拉低SDA,故出现尖锋

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序,没有打包过,经过九牛二虎之力终于打包出来,在此感谢那些热于分享的前辈! 本篇只讲打包运行和出现的问题 一、准备工作:提前下载相关资源包,否则在国内环境下可能因为网络问题…

python+django_vue旅游酒店预订出行订票系统pycharm项目lw

a.由于对管理信息方面的内容了解尚浅且没有足够的经验,因而很难对数据庞大的线上旅行信息管理系统建立完善的数据库。 b.线上旅行信息管理系统拥有很大的信息量,其中包括数据库的前期开发和后期更新,因此对数据库的安全性,一致性和…

【Java】CAP理论以及它的实际应用案例

目录 简介 不是所谓的“3 选 2” CAP 实际应用案例 总结 CAP 理论/定理起源于 2000年,由加州大学伯克利分校的Eric Brewer教授在分布式计算原理研讨会(PODC)上提出,因此 CAP定理又被称作 布鲁尔定理(Brewer’s the…

html标签之表格标签,程序员必看

突破困境: 1. 提升学历 前端找工作,学历重要吗? 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧,本科够用,硕士占优,大专以下找到工作靠运气和 戳这里领取完整开源项目:【一线大…

嵌入式面试

1.关键字static的作用是什么?为什么static变量只初始化一次? 1)修饰局部变量:使得变量变成静态变量,存储在静态区,存储在静态区的数据周期和程序相同, 在main函数开始前初始化,在退…

HTML入门:05HTML多媒体

HTML入门:05HTML多媒体 1 video标签1.1 控制按钮:controls1.2 宽度和高度:width和heightt1.3 预载:preload1.4 静音:muted1.5 自动播放:autoplay1.6 无限循环:loop1.7 poster 2 audio标签 在早期…

从零学习Linux操作系统 第三十二部分 ansible中剧本的应用

一、什么是playbook及playbook的组成 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 play就是一个个模块用列表的方式体现出来 playbook的语法是用YAML的预防进行书写的 2.YAML 简介 是一种表达资料序列的格式,类似XM…

ShardingSphere-SQL 解析 Issue 处理流程

ShardingSphere-SQL 解析 Issue 处理流程 这是之前给社区写的 SQL 解析 Issue 的处理流程,可以帮助社区用户快速参与到 ShardingSphere-SQL 解析任务当中。 ShardingSphere SQL 解析 issue 列表 Issue 背景说明 当前 Issue 使用自定义的爬虫脚本从对应的数据库官…

php采集类snoopy2.0使用说明

我们经常采集一些网站数据时会被识别为机器人被网页被拒绝访问,类似这种: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden网宿云安全平台检测到您当前的访问行为存在异常,请稍后重试... 云安全平台检测到您当前的访问…

【Azure 架构师学习笔记】- Azure Service Endpoint

本文属于【Azure 架构师学习笔记】系列。 前言 在做Azure 架构时,经常会被问到Service Endpoint这个点,那么这篇文章来介绍一下Service Endpoint(SE)。 Azure Service Endpoint 首先它是一个专用通道,在Azure 资源之…

Kosmos-2: 在多模态大语言模型中引入基准和指代能力

Kosmos-2: 在多模态大语言模型中引入基准和指代能力 FesianXu 20240304 at Baidu Search Team 前言 之前笔者在博文中介绍过kosmos-1模型 [1],该模型脱胎于MetaLM采用『因果语言模型作为通用任务接口』的思想,采用了多种形式的多模态数据进行训练得到。…

GIS之深度学习07:CUDNN教程(CUDA12.1配套)

CUDNN(CUDA Deep Neural Network library)是NVIDIA专门针对深度学习应用开发的GPU加速库。它提供了一系列高效的深度学习算法的实现,包括卷积神经网络(CNN)、循环神经网络(RNN)等常用网络结构的…

flutter开发文档,靠着这份面试题跟答案

1、知道它是什么、有什么用 相信很多人在学习的时候,一开始都会在网上找一整套资料或者买一本书来学习,结果就是内容太多,学了记不住或者学到一半感觉很难,便放弃了,更别提写代码了,根本无从入手。 而更好…

echarts柱状图可鼠标左击出现自定义弹框,右击隐藏弹框并阻止默认右击事件

每项x轴数据对应有两条柱图和一条阴影效果是学习其它博客得到的效果,这个是学习的原文链接:echarts两个合并柱体(普通柱状图象形柱图)共享一个柱体阴影 因为这次情况比较特殊,不仅需要自定义弹框内容,而且…

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…

【PowerMockito:编写单元测试过程中原方法没有注入的属性在跑单元测试时出现空指针】

出错场景 下面这一步报空指针,但是因为没有注入,在测试类中无法使用Mock 解决 在执行方法前,加入以下代码 MemberModifier.field(ResourceServiceImpl.class,"zero").set(resourceService,"0");

在Vue中搭建Three.js环境(超详细、保姆级),创建场景、相机、渲染器《一》

目录 Three.js简介创建vue项目引入Three.js实际操作环节文件目录创建初始化场景、相机 Three.js简介 Three.js 是一款基于 WebGL的 JavaScript 3D 库,它封装了 WebGL API,为开发者提供了简单易用的 API 来在 Web 浏览器中展示 3D 图形。Three.js 提供了…

【字符串】【括号匹配】【广度优先】301. 删除无效的括号

作者推荐 【二分查找】【C算法】378. 有序矩阵中第 K 小的元素 本文涉及知识点 字符串 括号匹配 广度优先 LeetCode301 删除无效的括号 给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。 返回所有可能的结果…

Linux Watchdog 机制是什么

当涉及到Linux操作系统的稳定性和可靠性时,Linux Watchdog机制是一个至关重要的议题。该机制旨在监控系统状态,确保在出现问题时采取适当的措施以维持系统的正常运行。本文将深入探讨Linux Watchdog机制的工作原理、应用范围以及如何配置和使用该机制来提…

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建 卷II 一. 拓扑图 二.有线网络配置 三.无线网络配置 四.出口网络配置 二、有线配置 S1.txt S1#show running-config Building configuration... Current configuration : 5008 bytes! version RGOS 10…