22、江科大stm32视频学习笔记——I2C通信外设原理

目录

1、软件实现和硬件实现

2、I2C外设简介 

3、硬件I2C外设引脚和GPIO复用关系

4、I2C的功能图

(1)数据控制部分

(2)SCL部分

5、I2C基本结构

6、主机发送

(1)7位主发送的过程

(2)其他知识点

7、主机接收

8、软件和硬件之间的比较


1、软件实现和硬件实现

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

2、I2C外设简介 

STM32 内部集成了硬件 I2C 收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
(软件只需要写入控制寄存器CR和数据寄存器DR,就可以实现协议,为了实现实时监控时序的状态,软件要读取状态寄存器SR
支持多主机模型(固定多主机和可变多主机(stm32,谁要做主机,主机就得跳出来))
支持 7 /10位地址模式
支持不同的通讯速度,标准速度 ( 高达 100 kHz) ,快速 ( 高达 400 kHz)
支持 DMA(多字节传输时,提高效率)
兼容 SMBus 协议
STM32F103C8T6 硬件 I2C 资源: I2C1 I2C2(两个独立I2C,硬件只有俩路I2C总线,而软件I2C只要代码存的下,想开几路就开几路)
本实验依旧是7位、一个主机 

3、硬件I2C外设引脚和GPIO复用关系

 4、I2C的功能图

(1)数据控制部分

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

 接收数据

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

(2)SCL部分

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

 5、I2C基本结构

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

6、主机发送

(1)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事件:写完后,没有数据可以写了

(2)其他知识点

  • 起始位-地址-应答-数据位-应答-.......-终止位
  • I2C只规定起始位后面时地址,后面数据的用途没有明确的规定(由芯片厂商自己规定)
  • 比如MPU6050规定:寻址之后,数据1为指定寄存器地址,数据2为指定寄存器下的数据,之后的数据n,就是从指定寄存器的地址之后依次往后写

7、主机接收

 这里是当前地址读的模式

(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位,所以产生终止条件

8、软件和硬件之间的比较


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

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

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

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
科大STM32笔记是关于STM32单片机学习笔记,其中涵盖了一些关于按键初始化和按键读取的代码示例。在这些代码中,通过引用中的Key_Init函数来对按键进行初始化,然后通过引用中的Key_GetNum函数来获取按键按下的键码值。代码中使用了STM32的GPIO模块来配置引脚的工作模式和读取引脚的电平状态。此外,引用中提到STM32内部集成了硬件收发电路,可以通过写入控制寄存器CR和数据寄存器DR来实现与外设通信,并通过读取状态寄存器SR来了解外设电路的当前状态。这些寄存器的使用可以实现对外设的控制和监测,减轻CPU的负担。因此,科大STM32笔记主要是介绍了STM32单片机的相关知识和编程技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32学习笔记 -- I2C科大)](https://blog.csdn.net/weixin_61244109/article/details/131002266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32科大学习笔记](https://blog.csdn.net/weixin_38647099/article/details/128337708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值