stm32学习笔记--I2C通信外设

之前我们使用软件模拟I2C,但对于比如串口通信之类的对时间精度要求比较高的外设使用软件模拟还是比较容易出现问题(比如信号被打断),所以串口最好是用硬件实现(流程:配置USART外设 -> 写入数据寄存器DR -> 硬件收发器自动生成波形发送出去 -> 等待发送完成的标志位)

同时还有一个问题,串口时序是异步的,所以软件实现非常麻烦,由于I2C一来是同步时序,二来接收数据对时间精度要求不高,所以软件实现相比硬件反而简单且灵活,但硬件I2C执行效率高,更节省软件资源,功能也更强大,可以实现完整的多主机通信模型,波形也更准确,速度也更快

如果要使用硬件I2C,需要控制CR,DR,SR寄存器,但这里我们使用标准库的库函数, 更加方便。

STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担 支持多主机模型 支持7位/10位地址模式 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz) 支持DMA 兼容SMBus协议 STM32F103C8T6 硬件I2C资源:I2C1、I2C2

固定多主机和可变多主机:

        固定多主机就如同一个教室有多个老师(主机)和多个学生(从机)

        主机可以控制从机但从机不能控制主机

        主机之间冲突就会发生总线仲裁

        可变多主机如同在教室里只有学生没有老师,学生(从机)会充当老师(主机)管理,当管理(通信)完成后主机又退回到从机的位置

        当多个主机出现时就会发生总线仲裁

 7位/10位地址:

        7位地址+读写位,只有128种情况,如果设备非常多就不够用了,由于很多地址是厂商设定的所以会有冲突,一般可以配置后四位

        10位则有1024种可能

 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz):
        分为两种可能

支持DMA:

        这个在多字节传输的时候可以提高传输效率,比如指定地址读多字节或写多字节的时序,如果我想要连续读或写非常多的字节,那用一下DMA自动帮我们转运数据,这个过程的效率就会大大提升

兼容SMBus协议:

        基于I2C改进的协议

硬件资源一般都是非常有限的,但可以代替软件提高速度,软件资源则相比更加海量,但速度慢精度差

仍然是老朋友SDA和SCL,查一下这个外设的复用引脚

 

 也可以重映射到这两个引脚

 1.由于I2C是半双工,所以数据收发只有一组数据寄存器和移位寄存器

有了这一块,SDA的数据收发就可以靠这一组寄存器来完成了

至于什么时候收什么时候发,需要控制CR来操作

2.STM32的I2C是基于可变多主机设计的,作为从机可由自身地址寄存器自定一个从机地址,如果从数据移位寄存器收到的数据与自身地址相 同,那stm32就作为从机响应外部主机,但我们这里先基于一主多从模型讲解,故不考虑

3.  用CRC校验算法,当传输数据错误硬件就会置校验错误标志位

4.在时钟控制寄存器写对应的位,电路就会执行对应的功能

5.写入控制寄存器。可以对整个电路进行控制

读取状态寄存器。可以得知电路的工作状态

6.当内部有些标志位置1时,可能事件比较紧急,就可以申请中断

7.可用DMA提高效率

8.总结一下基本结构就是

 

9.正如我们前面的结构,CR控制这两个寄存器,可收可发,看电路就可以理解这里的逻辑

 

 10.时钟控制器通过GPIO控制时钟线

11记得打开开关

12.

13 首先是起始,操作I2C_CR1/2寄存器的位8

14. 然后是EVx事件,用EAx来代替标志位

EV5的SB=1是I2C_SRx(状态寄存器)中的位0,这一位为1代表起始条件已发送,为0代表未发送

15.检测到起始条件发送时,就可以发送一个字节的从机地址了,发送完成后硬件自动接收应答位,应答失败就会置失败的应答位

16.寻址完成就会发送EV6事件也就是ADDR=1,ADDR是I2C_SRX(状态寄存器)的位1,在主模式中,1代表地址发送结束,0代表地址发送未结束

        读SR1

17.一旦检测到EV8事件,就可以写入下一个数据了,EV8_2是TxE = 1,也就是数据寄存器空

18.

19.流程就是起始->从机地址读->接收应答->(接收数据->发送应答)xn -> 给非应答->终止

20.对比软硬波形

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值