STM32F1学习——硬件I2C通信

一、硬件I2C通信

        软件I2C只用随便两个GPIO口即可模拟I2C的通信协议,但他需要消耗CPU资源。而STM32中存在I2C的硬件电路,可以使用硬件自动化实现I2C,不消耗CPU资源同时速度更快,可靠性更高。

二、硬件I2C电路设计

1、SDA总线

        数据传输:在我们需要写入数据的时候只用把一个字节数据给DATA REGISTER寄存器,当移位寄存器没有数据移位的时候,数据寄存器就会将数据转运到数据移位寄存器中,这时候我们就可继续把要传输的数据给DATA REGISTER寄存器了。

         标志位:当数据从DATA REGISTER寄存器转到数据移位寄存器的时候,就会置起状态寄存器TXE位为1表示发送寄存器为空。当数据接收的时候一样,当数据移位寄存器中的数据转到DATA REGISTER寄存器时,会置起状态寄存器RXNE,表示状态寄存器非空,这时我们就可以读DATA REGISTER寄存器中的数据了。

        从机模式:当STM32如何要当从机被别人操作的时候,我们需要一个地址,这个地址就是自身地址寄存器。双地址寄存器不仅可以当做STM32的别名,还可以在一主多从或多主多从的时候使用。

        校验位:当我们发送一个多字节的数据帧时,实行CRC校验计算。

2、SCL时钟线路

        时钟控制:在时钟控制寄存器CCR中写入相应的位,电路就会执行相应的功能。

        逻辑控制:写入控制寄存器CR1和CR2可以对整个电路进行控制,读取状态寄存器可以得知电路的状态,当控制逻辑电路某些标志位置1的时候可以出现中断请求。同时在多字节收发时可以启动DMA响应,配合DMA来提供工作效率。

        这是简化后的逻辑框图。

三、硬件I2C的操作流程

1、主机发送

        在上电以后,STM32默认是从模式,为了产生起始条件,STM32需要写入控制寄存器CR1,只要在这一位写1,STM32会自动产生起始条件,并由硬件清0。

        在S发送后,发生EV5事件,状态寄存器SB=1代表起始条件已发送,当我们发送数据的时候,SB会自动清0。我们之后将把从机地址写入DATA REGISTER寄存器中,随后由移位寄存器通过SDA数据先发送数据,最后产生应答位。这次产生EV6事件,这个事件会导致ADDR=1,代表地址发送结束。同时会产生EV8_1事件,即TxE=1,代表移位寄存器为空,数据寄存器为空,等待数据输入到DATA REGISTER寄存器中。此时我们将数据1写入到DATA REGISTER寄存器中,他快速的去了移位寄存器中,所以这会又产生了EV8事件,移位寄存器非空,数据寄存器空,将新数据传入到到DATA REGISTER寄存器中等待,EV8消失。当发完最后一个字节时,移位寄存器中也没有数据,DATA REGISTER寄存器中也没数据,产生EV8_2时间,TxE=1、BTF=1 代表在发送数据的时候,该找DATA REGISTER寄存器要下一个数据, 但是数据寄存器没有数据,代表主机不想发了。所以当检测到EV8_2事件的时候,我们就准备发种终止条件了。此时再去操作控制寄存器CR1中的STOP位置1,则会在当前字节传输或在当前起始条件发出后产生停止条件。

        他的本质就是使用CR控制寄存器控制,写入DR传输数据,通过SR检测状态。

2、主机接收

        在接受中,我们先产生起始条件,等待EV5事件。之后寻址应答,产生EV6事件。当第一个数据数据传输中的时候,EV6_1事件产生。当整个数据接收完,应答后产生EV7事件。RxNE=1,代表着接收到一个数据,并转移到了DATA REGISTER寄存器中,当DATA REGISTER寄存器中数据被读走时EV7事件消失。在我们接收最后一位的时候,我们要设置应答位,和STOP请求,即是EV7_1事件。

三、代码

        本章实验使用了AS5600此编码器,通过硬件I2C来读取AS5600的角度。①开启I2C和GPIO的时钟。 ②配置并初始化I2C和GPIO ③开启I2C。

        为了节省文章篇幅,代码已经放在github仓库里了。hal库的暂未更新,请耐心等待。

STM32F103c8t6_learning/GPIO_std/STM32_std_I2C_hardware at main · Jiang-kun02/STM32F103c8t6_learning

四、参考

[10-4] I2C通信外设_哔哩哔哩_bilibili

[10-5] 硬件I2C读写MPU6050_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值