您的位置:首页 > 科技 > 能源 > 南京旅游网页设计_中国建筑工程网承包企业管理系统_太原seo建站_百度店铺怎么入驻

南京旅游网页设计_中国建筑工程网承包企业管理系统_太原seo建站_百度店铺怎么入驻

2025/4/18 18:59:17 来源:https://blog.csdn.net/qq_44764442/article/details/147162729  浏览:    关键词:南京旅游网页设计_中国建筑工程网承包企业管理系统_太原seo建站_百度店铺怎么入驻
南京旅游网页设计_中国建筑工程网承包企业管理系统_太原seo建站_百度店铺怎么入驻

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.04.12

STM32开发板学习——第34节: [10-4] I2C通信外设

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、I2C硬件外设
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
   原理图如下
1、开发板原理图
在这里插入图片描述
2、STM32F103C6和51对比
在这里插入图片描述
3、STM32F103C6核心板
在这里插入图片描述

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。

下图是实物图
在这里插入图片描述

引用

【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
在这里插入图片描述
数据手册
在这里插入图片描述

解答和科普

一、I2C硬件外设

这个通信协议的时序是一个很重要的东西,我们只要理解清楚了这个时序的意义,就可以按照协议的规定,去翻转通信引脚的高低电平,只要我们翻转产生的这个时序波形,满足了通信协议的规定,那通信双方就能理解并解析这个波形,这样通信自然而然就实现了,之前的课程使用的是软件I2C,手动拉低或释放时钟线,然后再手动对每个数据位进行判断,拉低或释放数据线,这样来产生这个的波形,这时软件I2C,由于I2C是同步时序,这每一位的持续时间要求不严格,某一位的时间长点短点 或者中间暂定一会,对时序影响都不大,所以I2C是比较容易用软件模拟的,在实际项目中,软件模拟的I2C也是非常常见的,但是作为一个协议标准,I2C通信,也是可以有硬件收发电路的,就像之前的串口通信一样,先讲了这个串口的时序波形,但是在程序中,我们并没有用软件去手动翻转电平来实现这个波形,只是因为串口是异步时序,每一位的时间要求严格,不能过长也不能过短,更不能中途暂定一会,所以串口时序虽然可以用软件模拟,但是操作起来比较困难,我们之前的课程也没讲过软件模拟的串口,另外由于串口的硬件收发器在单片机中的普及程度非常高,基本上每个单片机都有串口的硬件资源,而且硬件实现的串口使用起来还非常简单,所以串口通信,基本上都是借助硬件收发器来实现的,硬件串口的使用流程,首先配置USART外设,然后写入寄存器DR,这时硬件收发器就会自动生成波形发送出去,最后我们等待发送完成的标志位即可,这是硬件实现串口的方法。

I2C也可以有软件模拟和硬件收发器自动操作这两种实现方式,对于串口这样的异步时序,软件实现非常麻烦,硬件实现,非常简单,所以串口的实现基本是全都倒向硬件了,I2C同步时序,软件实现反而简单更加灵活,硬件实现,相比之下,却并不能完全让人省心,所以I2C的实现,软件模拟的情况还是非常多的,但是考虑到硬件I2C也有很多独有的优势,比如执行效率高,可以节省软件资源,功能比较强大,可以实现完整的多主机通信模型,时序波形规整,通信速率快,所以硬件I2C也是有相应的应用场景的。

在这里插入图片描述

STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担,有了I2C的硬件收发器之后,就可以由硬件自动执行时钟生成,起始终止条件生成,应答位收发,数据收发等功能,也就是由硬件电路来自动翻转引脚电平,软件,只需要写入控制寄存器CR和数据寄存器DR,就可以实现协议了,当然为了实时监控时序的状态,软件还得读取状态寄存器SR,来了解外设电路当前处于什么状态,写入控制寄存器CR,就像是踩油门、打方向盘,来控制汽车的运行,读取状态寄存器SR,就像是观看仪表盘,来了解汽车的运行状态,有了这些寄存器我们可以完全掌控外设电路的运行了。本次只要求掌握一主多从、7位地址的I2C.对于多主机模型、10位地址这些东西,只需要了解即可。
10位寻址,那第一个字节的前5位就必须是11110,所以就是10位寻址的。

在这里插入图片描述
首先,左侧是这个外设的通信引脚SDA和SCL, 这就是I2C通信的两个引脚,SMBALERT是SMBus用的,I2C用不到,像这种外设模块引出来的引脚,一般都是借用GPIO口的复用模式与外部世界相连的,具体是复用在了哪个GPIO口,查询这个引脚定义表,在复用功能这两栏找一下,比如这里,I2C2的SCL和SDA,就复用在了PB10和PB11,这两个端口,I2C1的SCL和SDA,就复用在了PB6和PB7,这两个端口;而且I2C1的引脚还可以重映射到PB8和PB9.因为内部电路设计的时候,这些引脚都是连接好的,所以你想使用硬件I2C,就只能使用它连接好的指定引脚。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面这一部分,是SDA,也就是数据控制部分,这里数据收发的核心部分,是这里的数据寄存器和数据移位寄存器,当我们需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会进一步,转到移位寄存器里,在移位的过程中,我们就可以直接把下一个数据放到数据寄存器里等着了,一旦前一个数据移位完成,下一个数据就可以无缝衔接,继续发送,当数据由数据寄存器转到移位寄存器时,就会置状态寄存器的TXE位为1,表示发送寄存器为空,这就是发送的流程,那在接收时,也是这一路,输入的数据,一位位地,从引脚移入到移位寄存器里,当一个字节的数据收齐后,数据就整体从移位寄存器转到数据寄存器,同时置标志位RXNE,表示接受寄存器非空,这时我们就可以把数据从数据寄存器读出来了,这个流程和之前串口哪里是不是一样,串口这里,数据收发也是由数据寄存器和移位寄存器两级实现的,只不过串口是全双工,这里数据收和发是分开的,在I2C这里,是半双工,所以数据收发是同一组数据寄存器移位寄存器,但是这个数据寄存器和移位寄存器的配合,设计思路都是异曲同工,那有了这一块,SDA的数据收发就可以完成了,至于什么时候收,什么时候发,需要我们写入控制器的对应位进行操作,对于起始条件、终止条件、应答位什么的,这里也都有控制电路可以完成,至于具体实现细节,这里也没详细画。

数据收发之后,下面这里还有两个功能,一个是比较器和自身地址寄存器、双地址寄存器、另一个是帧错误校验计算和帧错误校验寄存器,了解即可,STM32不进行通信的时候就是从机,既然作为从机,他就应该可以被别人召唤,想被别人召唤,它就应该有从机地址吧,从机地址是多少呢,就可以由这个自身地址寄存器指定,我们可以自定一个从机地址,写到这个寄存器,当STM32作为从机,在被寻址时,如果收到的寻址通过比较器判断,和自身地址相同,那STM32就作为从机,响应外部主机的召唤,并且这个STM32支持同时响应两个从机地址,所以就有自身地址寄存器和双地址寄存器,这一块,我们需要在多主机的模型下来理解,把角色转换一下,STM32作为从机,才需要有这一部分,当然我们只要求一主多从的模型,STM32不会作为从机,所以这一块就不需要用,然后右边这一块,也是进阶的内容,这时STM32设计的一个数据校验模块,当我们发送一个多字节的数据帧时,在这里硬件可以自动执行CRC校验计算。会得到一个字节的校验位,附加在这个数据帧后面,在接收到这一帧数据后,STM32的硬件也可以自动执行校验的判定。
SCL这部分,时钟控制,是用来控制SCL线的,控制细节没有画,在这个时钟控制寄存器写对应的位,电路就会执行对应的功能,然后控制逻辑电路,也是黑盒子,写入控制寄存器,可以对整个电路进行控制,读取状态寄存器,可以得知电路的工作状态,之后是中断,当内部有一些标志位置1之后,可能事件比较紧急,就可以申请中断,如果我们开启了这个中断,那当这个事件发生后,程序就可以跳转到中断函数来处理这个事件了,最后是DMA请求与响应,在进行很多字节的收发时,可以配合DMA来提高效率。
在这里插入图片描述

首先,移位寄存器和数据寄存器DR的配合,是通信的核心部分,这里因为I2C是高位先行,所以这个移位寄存器是向左移,在发送的时候,最高位先移出去,一个SCL时钟,移位一次,移位8次,这样就能把一个字节,由高位到低位,依次放到SDA线上了,那在接收的时候,数据通过GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了,之后GPIO口这里,使用硬件I2C的时候,这里个对应的GPIO口都要配置成复用开漏输出的模式,复用就是GPIO的状态是交由片上外设来控制的,开漏输出,这时I2C协议要求的端口配置,这里即使开漏输出模式,GPIO口也是可以进行输入的,SCL这里,时钟控制器通过GPIO去控制时钟线,这里简化成一主多从的模型了,所以时钟这里只画了输出的方向,实际上前面这里,如果是多主机的模型,时钟线也是会进行输入的,这个时钟的输入,可以先不管,SDA的部分,输出数据,通过GPIO口,输出到端口,输入数据,也是通过GPIO,输入到移位寄存器,那这两个箭头连接在GPIO的那个位置呢,

在这里插入图片描述
我们使用开漏输出,这个P-MOS是没有的,刚才看到移位寄存器输出的数据,通向GPIO就接再来这个位置,来自片上外设的复用功能输出,所以I2C外设的输出,就接到这里,之后控制这个N-MOS的通断,进而控制这个I/O引脚,是拉低到低电平还是释放悬空,然后对于输入部分,可以看到虽然是复用开漏输出,但是输入这一路任然有效,I/O引脚的高低电平,通过上面进行复用功能输入进入片上外设,来进行复用功能输入,所以I2C外设通向GPIO.
在这里插入图片描述
数据控制器没啥说的黑盒子;
最后还是有个开关控制,也就是I2C_Cmd,配置好了,就使能外设,外设就能正常工作了。
接下来,看一下硬件I2C的操作流程

在这里插入图片描述
主机发送,当STM32想要执行指定地址写的时候,就要按照主发送器传送序列图来进行, 这里有7为地址的主发送和10位地址的主发送,7位地址,起始条件后的第一个字节是寻址,十位地址,起始条件后的两个字节都是寻址,其中前一个字节,这里写的是帧头,内容是5位的标志位11110+2位地址+1位读写位,然后后一个字节,内容就是纯粹的8位地址了,两个字节加在一起,构成10位的寻址;
7为主发送的流程是:起始,从机地址,应答,后面是数据1,应答,数据2,应答等等;最后是P,停止。因为I2C协议只规定了起始之后必须是寻址,至于后面的字节,并没有明确的规定,这些数据可以由各个芯片厂家自己来规定。
首先,初始化之后,总线默认空闲状态,STM32默认是从模式,为了产生一个起始条件,
STM32需要写入控制寄存器,这个需要看一下手册的寄存器描述:
在这里插入图片描述
之后,STM32从模式转为主模式,也就是多主机模型下,STM32有数据要发,就要跳出来,这个意思,然后控制完硬件电路后,我们就要检查标志位,来看看硬件有没有达到想要的状态,在这里,起始条件之后,会发生EV5事件, 这个EV5事件,你就可以把它当成是标志位,这个手册这里都是用EVX这个事件来代替标志位,为什么是是EV几,而不说产生什么标志位呢,这是因为,有的状态会同时产生多个标志位,所以这个EVx事件,就是组合了多个标志位的一个大标志位,在库函数中也有对应的,检查EVx事件是否发生的函数,所以就当成一个大标志位来理解,EV5事件就是SB=1,SB是状态寄存器的一个位,表示了硬件的状态,在SR1寄存器中,写寄存器DR会自动清除该位,所以按照正常流程这个状态寄存器不需要手动清除的,当我们检测起始条件已经发送时,就可以发送一个字节的从机地址了,从机地址需要写到数据寄存器DR中,写入DR之后,硬件电路就会自动把这一个字节,转到移位寄存器里,再把这一个字节发送到I2C总线上,之后硬件会自动接收应答并判断,如果没有应答,硬件就会置应答失败的标志位,然后这个标志位可以申请中断来提醒我们,当寻址完成后,会发生EV6事件,就是ADDR=1,EV8_1事件就是TXE=1,移位寄存器空,数据寄存器空,需要我们写入DR寄存器进行数据发送,一但写入DR后,因为移位寄存器也是空,所以DR会立刻转移到移位寄存器进行发送,这时就是EV8事件,移位寄存器非空,数据寄存器空,这时就是移位寄存器正在发数据的状态,所以流程这里,数据1的时序就产生了,这个数寄存器和移位寄存器的配和,要把前面这个结构记好,就是发送的时候,数据先写入数据寄存器,如果移位寄存器没有数据,再转到移位寄存器进行发送,EV8事件没有了,对应下面这里,写入DR将清除该事件,随意按理说,这个位置应该是写入下一个数据,也就是后面这个数据2,在这个时刻就写入到数据寄存器等这里,然后接收应答位之后,数据2就转入移位寄存器进行发送,此时的状态是移位寄存器非空,数据寄存器空,所以这个时候,EV8事件又发生了,这个时候数据2正在发送,但此时下一个数据,已经被写到数据寄存器等着了, 所以这个时候EV8事件消失,之后应答产生EV8事件,写入数据寄存器,EV8事件消失,按照这个流程来,一旦我们检测到EV8事件,就可以写入下一个数据了,最后当我们想要发送的数据写完之后,这时就没有新的数据可以写入到数据寄存器了,当移位寄存器当前的数据移位完成时, 此时就是移位寄存器空,数据寄存器也空的状态,这个事件就是EV8_2,下面解释EV8_2是TXE=1,也就是数据寄存器空,BTF=1,这个是字节发送结束标志位。
在这里插入图片描述
这个意思就是;当前的移位寄存器已经移完了,该找下一个数据寄存器要下一个数据了,但是一看,数据寄存器没有数据,这就说明主机不想发了,这时就代表字节发送结束了,是时候停止了,所以在这里检测到EV8_2时,就可以产生终止条件了,产生终止条件,显然,应该在控制寄存器里有相应的位可以控制。
在这里插入图片描述
到这里一个完整的时序就发送完成了,这整个过程看上去可能比较复杂,操作和事件都比较多,写入控制寄存器CR或者数据寄存器DR,可以控制时序单元的发生,比如产生起始条件,发送一个字节数据,时序单元发生后,检查相应的EV事件,起始就是检查状态寄存器SR,来等待时序单元发送完成,然后依次按照这个流程,操作,等待,操作,等待,等等等,这样就能实现时序了,当然在程序中,我们有库函数,不需要实际去配置寄存器。
这就是主机发送的流程。

在这里插入图片描述
流程是:起始,从机地址+读,接收应答,接收数据,发送应答,接收数据,发送应答,最后一个数据给非应答,之后终止,可以看出这个时序是当前地址读的时序,指定地址读的符合格式,这里没有给,得需要自己组合一下。
首先,写入控制寄存器的START位,产生起始条件,然后等待EV5事件,EV5事件就代表起始事件已发送,之后是寻址,接收应答,结束后产生EV6事件,EV6事件代表,寻址已完成,之后数据1这一块,代表数据正在通过移位寄存器进行输入,EV6_1事件,下面解释是,没有对应的事件标志,只适用于接收一个字节的情况,可以看到,数据1起始还在移位, 还没收到呢,所以这个事件就没有标志位,之后当这个时序单元完成时,硬件会自动根据我们的配置,把应答位发送出去,如何配置是否要给应答呢,也是看手册,控制CR1里,

在这里插入图片描述
现在说明移位寄存器就已经成功移入一个字节的数据1了,这时,移入的一个字节就整体转移到数据寄存器,同时置RxNE标志位,表示数据寄存器非空,也就是收到了一个字节的数据,这个状态就是EV7事件,RxNE=1,数据寄存器非空,读DR寄存器清除该位,也就是收到数据了,当我们把数据读走之后,这个事件就没有了,上面这里EV7事件没有了,说明此时数据1被读走,当然数据1没有被读走的时候,数据2就可以直接移入移位寄存器了,之后,数据2移位完成,收到数据2,产生EV7事件,读走数据2,EV7事件没有了,然后按照这个流程,就可以一直接收数据了,最后当我们不需要继续接收时,需要在最后一个时序单元发生时,提前把刚才说的应答位控制寄存器ACK置0;并且设置终止条件请求,这就是EV7_1事件,下面解释个EV7一样,后面加了一句,设置ACK=0和STOP请求,也就是我们想要结束了,之后在这个时序完成后,由于设置了ACK=0,所以这里就会给出非应答,最后由于设置STOP位,所以产生终止条件,这样接受一个字节的时序就完成了,整体上,流程和刚才差不多,写入控制寄存器CR和读取数据寄存器DR,产生时序单元,然后等待响应的事件,来确保时序单元完成,这就是主机接收的时序流程。
在这里插入图片描述
首先,从引脚电平变化趋势上看,这两个波形都是一样的,对应的数据也是一样的;然后从时钟线的规整程度上看,硬件I2C的波形会更加规整,这里硬件I2C,每个时钟的周期、占空比都非常一致,而软件I2C这里,由于操作引脚之后都加了延迟,这个延时有时候假的多,有时候加的少,所以软件时序的时钟周期、占空比可能不规整。还有就是,SCL低电平写,高电平读,虽然真个电平的任意时候都可以读写,但是一般要求保证尽早的原则,所以可以认为是SCL下降沿写,上升沿读,这里看一下,软件I2C,在下降沿之后,因为操作端口之后有一些延迟,所以这里等了一会,才进行写入操作,后面的写入也是等了一会,但在硬件这里,数据写入,都是紧贴下降沿的,这里SCL下降沿,SDA立马就切换数据了;读的时刻,也是紧贴上升沿。应答结束,从机在SCL下降沿立刻释放了SDA,但是软件I2C的主机,过了一会儿才变换数据,所以这里就出现了一个短暂的高电平,下面的硬件I2C呢,应答结束后,SCL下降沿,从机立刻释放SDA,同时主机也立刻拉低SDA,所以这里就出现了一个小尖峰。硬件操作的I2C,包括上面这后面,有些是从机的硬件操作的,这些SDA的数据变化都是在SCL下降沿进行的,而这些软件操作的I2C,波形可能就不是那么标准了,当然好似是因为I2C同步时序的原因,这些不标准的波形也完全不影响通信,这也正是同步时序的好处。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题

总结

本节课主要是I2C的硬件外设,内部硬件如何设置的,硬件的真个工作流程,主要是主机发送和主机接收模式。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com