在将2C通信外设之前,我们先捋一捋,串口的相关特点来和I2C进行一个对北比。
首先:
1,大部分单片机,设计的PCB板均带有串口通信的引脚(也就是通信基本都借助硬件收发器来实现)
2.对于串口的异步时序,软件实现起来就异常麻烦。硬件实现非常简单。所以串口的实现基本就全倒向了硬件。
右边的图片中的串口时序就可以看出来软件模拟的复杂性
其次:II2C是同步时序,软件实现简单灵活,(在前面讲过的I2C时序,明显就简单的多)
硬件实现,相比之下,去并不能让人完全省心。
所以I2c的实现,软件模拟的情况是非常多的.
但是考虑到硬件I2C也有很多独有的优势,比如执行效率比较高,可以节省软件资源。
功能比较强大,可以实现完整的多主机通信模型,时序波形规整,通信速率快等等。
所以硬件I2C也有相应的应用场景。
现在我们就来学习一下关于I2C通信外设。也就是硬件实现I2C通信。
硬件资源:STM32内部的I2C外设
4.支持不同的通讯速度,标准速度(高达100kHz),快速(高达400kHz)
5.支持DMA(多字节传输,可以提高传输效率)
6.兼容SMBust协议(了解即可)
7.STM32F103C8T6硬件2C资源:I2C1、I2C2(硬件资源有限,软件就无限了)
硬件2C的引脚都是固定在对应的引脚上。(参考引脚定义表)
这里提一句,STM32参考手册中2C描述的多主机模型,如果对12C没学过基本是看不懂的。
只有先简单的学习过一主多从模型,再去看手册才比较容易理解。
STM32的硬件12C采用的就是多主机模型中的可变多主机,所以就必须按照该模型进行操作
当需要通信的时候,
1.第一步要将该从机先跳出来,变成主机。
2第二步指定要通信的从机
数据收发的核心部分:如下图红框中
发送的流程:
- 可以把一个字节写到数据寄存器DR
- 当移位寄存器没有数据移位时,会将数据寄存器中的数据移到移位寄存器中
- 在移位的过程中,我们就会把下一个数据写到数据寄存器中。
- 连续循环。
- 当数据寄存器的值移到移位寄存器中时,状态寄存器的TXE位为1,表示发送寄存器为空
接收的流程:
- 输入的数据一位一位的动引脚移位到移位寄存器里
- 当一个字节的数据收齐以后,数据就整体从移位寄存器转到数据寄存器·
- 同时置标志位RXNE,表示接收寄存器非空。
- 这个时候我们就可以把数据从数据寄存器读出来了
至于什么时候收,什么时候发?
我们就必须借助控制寄存器。起始,应答,停止,均是由控制电路完成。
I2C内部外设结构图
I2C基本结构
主机发送