STM32CubeMX(5)——IIC读写24c02

0.序

我用的一个PCA9536老是出问题,怀疑是IIC应答或者停止位出问题了,所以特地来仔细看看IIC的原理和操作。

1. IIC简介   

IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接 微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。 在 CPU 与被控 IC 之间、IC IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。目前大部分 MCU 都带有 IIC 总线接口,STM32F1 也不例外。

但是这里我们不使用 STM32F1 的硬件 IIC 来读写 24C02,而是通过软件模拟ST 为了规避飞利浦 IIC 专利问题,将 STM32 的硬件 IIC 设计的比较复杂,而且稳定性不怎么好,所以这里我们不推荐使用。有兴趣的读者可以研究一下 STM32F1 的硬件 IIC

用软件模拟 IIC,最大的好处就是方便移植,同一个代码兼容所有 MCU,任何一个单片机只要有 IO 口,就可以很快的移植过去,而且不需要特定的 IO 口。而硬件 IIC,则换一款 MCU, 基本上就得重新搞一次,移植是比较麻烦的,这也是推荐使用软件模拟 IIC 的另外一个原因。

2. 三种信号

器件不同对应的IIC时序不同,因此信号可能稍有差异。本文使用的是24C02,时序如下图所示。

STM32CubeMX(5)——IIC读写24c02_第1张图片

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲, 表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

在原子的参考手册里有这样一句话,"这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要",具体情况我不清楚,但是我用的一个PCA9536老是出问题,怀疑是IIC应答或者停止位出问题了,所以特地来仔细看看IIC的原理和操作。

3. 硬件端口

我用的是正点原子精英板子,型号是F103ZET6,板子24C02硬件接口如下

STM32CubeMX(5)——IIC读写24c02_第2张图片

我以为是任意IO口模拟IIC

没想到使用CubeMX中选了IIC之后,自动就出来PB6,PB7,看来他用的还是IIC特定的IO口

STM32CubeMX(5)——IIC读写24c02_第3张图片

4. 硬件资料——时序

如图,直接看24C02的datasheet,下图是时序图

STM32CubeMX(5)——IIC读写24c02_第4张图片

下图是起止信号和应答信号

STM32CubeMX(5)——IIC读写24c02_第5张图片

5. 硬件资料——地址

对于IIC,在代码层面,我们主要关注的就是他的设备地址,还有读写指令,如下图示设备地址,这里我用的是24C02,也就是2k的这个。

可以看出,前4位是1010,也就是十六进制的A。

STM32CubeMX(5)——IIC读写24c02_第6张图片

再看看A2,A1,A0三位,我查了资料说是用来做多个IIC设备挂在一个IIC总线上,用来区分地址的。我们这里只用1个24C02把这三个都置0就可以了。

最后一位是读写操作,读的话置1,写的话置0。

STM32CubeMX(5)——IIC读写24c02_第7张图片

STM32CubeMX(5)——IIC读写24c02_第8张图片

如下图是某位同学使用的多IIC设备,不过他貌似遇到了点问题

STM32CubeMX(5)——IIC读写24c02_第9张图片

6. 硬件资料——读写操作

写步骤:

起始信号——发送设备地址——收到应答——发送写地址——收到应答——写一个字节——收到应答——停止信号

STM32CubeMX(5)——IIC读写24c02_第10张图片

 

读步骤:

起始信号——发送设备地址——收到应答——收到一个字节——单片机主机应答——停止信号

STM32CubeMX(5)——IIC读写24c02_第11张图片

 

7. 软件设计——开始信号

 

 

 

 

你可能感兴趣的:(-------嵌入式STM32,stm32)