当前位置: 首页 > news >正文

【自学嵌入式:stm32单片机】I2C通信外设

目录
  • I2C通信外设
    • I2C通信外设介绍
    • I2C框图
      • 引脚复用
      • SDA
        • 数据发送
        • 数据接收
        • 比较器、自身地址寄存器、双地址寄存器、帧错误校验计算和帧错误校验寄存器
      • SCL
    • I2C基本结构
    • 主机发送
    • 主机接收
    • 软件I2C与硬件I2C波形对比
      • 软件I2C波形
      • 硬件I2C波形

I2C通信外设

I2C通信外设介绍

  • STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担

  • 支持多主机模型

  • 支持7位/10位地址模式,11110是10位地址开始的标志位

  • 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)

  • 支持DMA

  • 兼容SMBus协议

  • STM32F103C8T6 硬件I2C资源:I2C1、I2C2

I2C框图

image
SMBALERT是SMBus用的,I2C用不到

引脚复用

image

硬件I2C2的SCL复用在了PB10引脚,SDA复用在了PB11引脚
image

硬件I2C2的SCL复用在了PB6引脚,SDA复用在了PB7引脚,I2C1的引脚还有重映射的机会,可以重映射在PB8和PB9两个引脚

SDA

数据发送

image
如上图,红圈部分是SDA,这里数据收发的核心部分是数据寄存器DATA REGISTER和数据移位寄存器,当我们需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会进一步转到移位寄存器里,在移位的过程中,我们就可以直接把下一个数据放到数据寄存器里等着了,一旦前一个数据移位完成,数据可以无缝衔接,继续发送,当数据由数据寄存器转到移位寄存器时,就会置状态寄存器的TXE位为1,表示发送寄存器为空。

数据接收

image

接收的时候,输入的数据一位一位地从引脚移入到移位寄存器里,当一个字节的数据收齐之后,数据就整体从移位寄存器转到数据寄存器,同时置标志位RXNE,表示接收寄存器非空,这时我们就可以把数据从数据寄存器中读出来了,由于I2C是半双工通信,所以和硬件USART串口通信不一样的是,硬件I2C只有一组数据寄存器和移位寄存器,但是这两个寄存器配合的设计思路异曲同工,至于什么时候收什么时候发数据,需要写入控制寄存器的对应位进行操作,对于起始条件、终止条件、应答位什么的都由控制电路来完成。

比较器、自身地址寄存器、双地址寄存器、帧错误校验计算和帧错误校验寄存器

image
比较器、自身地址寄存器和双地址寄存器是从机模式使用的,STM32的硬件I2C通信是基于可变多主机模式设计的,STM32不进行通信的时候就是从机,从机地址可以借助这几个寄存器设置。
帧错误校验计算和帧错误校验寄存器是STM32设计的一个数据校验模块,当我们发送一个多字节的数据帧时,在这里,硬件可以自动执行CRC校验计算,校验数据是否出错。

SCL

image
在时钟控制寄存器写对应的位,电路就会执行对应的功能对时钟进行控制,写入控制寄存器,可以对整个电路进行控制,读取状态寄存器,可以得知电路的工作状态,之后是中断,当内部有一些标志位置1之后,可能事情比较紧急,就可以申请中断,如果开启了这个中断,那当这个事情发生后,程序就可以跳到中断函数来处理这个事件,最后是DMA请求与响应,在进行很多字节的收发时,可以配合DMA来提高效率。

I2C基本结构

image

主机发送

image
如上图,有7位地址的主发送和10位地址的主发送,它们的区别就是,7位地址,起始条件后的一个字节是寻址;10位地址,起始条件后的两个字节都是寻址,其中前一个字节,这里写的是帧头,内容是5位的标志位11110+2位地址+1位读写位,后一个字节内容就是纯粹的8位地址了,两个字节拼在一起构成10位的寻址,后面数据的用途要看从机设备的怎么规定,比如MPU6050规定就是寻址之后,数据1为指定寄存器地址,数据2为指定寄存器地址下的数据,之后的数据N,就是从指定寄存器地址开始,依次往后写。
image

如上图,在控制器CR1中,START位写1,就可以产生起始条件了,当起始条件发出后,这一位可以由硬件清除,之后STM32由从模式转为主模式,然后就如同最开始的图,起始条件后,发生EV5事件,类似标志位,用事件表示是因为有的事件能产生多个标志位,在库函数中也会有对应的,检查EV几事件是否发生的函数。
image

EV5事件,SB位为1,状态寄存器的位,表示了硬件的状态,其他见最开始的图,当检测到起始条件已发送时,就可以发送从机地址了,从机地址需要写到数据寄存器DR中,写入DR之后,硬件电路就会自动把这一个字节转到移位寄存器里,再把这一个字节发送到I2C总线上,之后硬件会自动接收应答并判断,如果没有应答,硬件会置应答失败的标志位,然后这个标志位可以申请中断来提醒开发者。
image

在寻址完成后,会发生EV6事件,ADDR标志位为1,代表主机模式状态下,从机地址发送结束。
EV6事件结束后,是EV8_1事件,就是TxE标志位为1,移位寄存器空,数据寄存器空,这时候我们要将发送的一个字节写入DR寄存器进行发送了,一旦写入DR之后,因为移位寄存器也是空的,所以DR会立刻转到移位寄存器进行发送,这时就进入EV8事件,TxE为1,移位寄存器非空,数据寄存器空,这时就是移位寄存器正在发数据的状态,所以这里,数据1的时序就产生了,发送的时候,数据先写入数据寄存器,如果移位寄存器没有数据,再转到移位寄存器进行发送,EV8事件没有了,对应着写入DR寄存器将清除该事件。
image

所以按理说,这个位置应该是写入了下一个数据,也就是后面这个数据2,在这个时刻就被写入到数据寄存器里等着了,然后接收应答位之后,数据2就转入移位寄存器进行发送,此时的状态是移位寄存器非空,数据寄存器空,所以这时,这个EV8事件就又发生了,数据2还正在移位发送,但此时下一个数据,已经被写到数据寄存器等着了,所以这时候EV8事件消失,之后应答,产生EV8事件,写入数据寄存器,EV8事件消失,按照这个流程来,一旦我们检测到EV8事件,就可以写入下一个数据了。
image

最后,当我们想要发送的数据写完之后,这时就没有新的数据可以写入到数据寄存器了,当移位寄存器当前的数据移位完成时,此时就是移位寄存器空,数据寄存器也空的状态,这个事件就是EV8_2,下面解释,EV8_2是TxE=1,也就是数据寄存器空。
image

BTF(ByteTransfer Finished),这个是字节发送结束标志位,这里,字节发送结束,在发送时,当一个新数据将被发送且数据寄存器还未被写入新的数据时,BTF标志位置1,这个意思就是,当前的移位寄存器已移完,该找数据寄存器要下一个数据了,但是一看,数据寄存器没有数据,这就说明主机不想发了,这时就代表字节发送结束,当检测到EV8_2事件时,就可以产生终止条件了,在控制寄存器里有相应的位可以控制,如下:
image

主机接收

image
EV5事件和刚才发送一样,代表起始条件已发送,之后是寻址,接收应答,结束后产生EV6事件,和刚才发送一样,EV6事件代表寻址已完成,之后数据1这一块代表数据正在通过移位寄存器进行输入,EV6_1事件,下面解释是没有对应的事件标志,只适于接收1个字节的情况,这个EV6_1,可以看到,数据1其实还正在移位,还没收到,所以这个事件就没有标志位,之后当这个时序单元完成时,硬件会自动根据我们的配置,把应答位发送出去,如何配置是否要给应答呢,看手册控制寄存器CR1里,这里有一位ACK,应答使能:
image

image
如上图,当这个时序单元结束后,就说明移位寄存器就已经成功移入一个字节的数据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位,所以产生终止条件,这样接收一个字节的时序就完成了。

软件I2C与硬件I2C波形对比

软件I2C波形

image

硬件I2C波形

image
硬件I2C波形更规整,每个时钟的周期、占空比都非常一致,而软件I2C这里,由于操作引脚之后,都加了延时,这个延时有时候加的多,有时候加的少,所以软件时序的时钟周期,占空比可能不规整,不过由于I2C是同步时序,这些不规整也没有影响,

http://www.sczhlp.com/news/27479/

相关文章:

  • 如何优雅统计知识库文件个数与子集下不同文件夹文件个数
  • AWS Builder Center:开发者社区新家园,一站式技术资源与协作平台
  • 计数练习
  • 大连市中小企业做网站政府补贴黄页推广平台有哪些
  • 专门做搜索种子的网站泉州百度竞价推广
  • 泉州企业网站建设搜索引擎营销优化策略有哪些
  • pytest入门
  • 微软行业案例:英格兰足球超级联赛(Premier League) - 教程
  • 高压差分探头:高压电子测量的精准利器
  • 阿里云ecs,云控制台磁盘扩容,需在服务器执行命令
  • 最常用的规划网站郑州网络推广服务
  • 深圳网站建设服务清单win7最好的优化软件
  • 杭州网企业网站建设公司官网制作开发
  • 个人建网站西安seo服务
  • 做纺织机械的网站域名福州百度快照优化
  • 住房和城乡建设厅官网查询seo有哪些优缺点?
  • 手机网站建设万网百度指数查询平台
  • 有做网站设计的吗网站优化seo怎么做
  • 网站建设与开发英文文献免费推广的平台
  • 漳州做网站建设公司自己制作一个网页
  • 网站建设与管理 吴振峰网站建设策划
  • 网站建设图书推荐可以免费发帖的网站
  • 微网站建设开发工具江苏seo团队
  • 个人网站制作步骤免费合作推广
  • 行业网站排行榜百度搜索风云榜排行榜
  • 大语言模型中常用的tokenizer算法
  • 模板索引:数据结构
  • 贵州建设厅考试网站网上互联网推广
  • 鄂州北京网站建设今日新闻头条新闻今天
  • 购物车功能网站怎么做的什么是全网营销推广