STM32_10(I2C)

发布时间 2023-05-16 18:54:40作者: 烟儿公主

I2C通信

  • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)
  • 使用同步时序可以极大降低单片机对硬件电路的依赖

 

硬件电路

  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏输出模式
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

任何时候都是主机完全掌握SCL,在空闲状态下,主机可以主动发起对SDA的控制。只有从机在发送数据和从机应答的时候,主机才会把SDA的控制权交给从机。

把SDA和SCL想象成一根杆子,并且让所有人都不能往上拉,只能往下拉或松手,之后我们外置一根弹簧到这根杆子上,输出低电平就往下拽,输出高电平就放手,这是一个弱上拉的高电平,完全不影响数据传输。

 

I2C时序基本单元

起始条件:SCL高电平期间,SDA从高电平切换到低电平

终止条件:SCL高电平期间,SDA从低电平切换到高电平

 

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。低电平主机放数据,高电平从机读数据。

 

起始条件后,第一个字节必须为主机发送。如果主机想发送0,则让拉低SDA到低电平。如果发送1,则放手让SDA回弹到高低电平。在SCL低电平期间,允许改变SDA电平,在SCL高电平期间,不允许改变SDA的电平,并且是从机读取SDA的时候,从机必须尽快读取SDA,一般在上升沿时刻就读取完数据。主机放手SCL一段时间后,继续拉低SCL传输下一位,主机也需要在SCL下降沿之后尽快把数据放在SDA上,但主机掌握着时钟的主导权,所以在低电平的任意时刻把数据放在SDA上即可。

 

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。低电平从机放数据,高电平主机读数据。

实线是主机控制部分,虚线是从机控制部分。

 

发送应答信号:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答信号:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

主机释放SDA的时候,从机就应该把SDA拉下来,在SCL高电平期间,主机读取应答位,应答位为0,说明从机确实收到了。

发送应答位目的是告诉从机,是不是要继续发,如果从机发送一个数据后,得到主机的应答,说明要继续发送,如果主机没有应答则从机停止发送,交出SDA的控制权。

 

I2C时序

指定地址写;对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)。

这个数据帧的目的式在指定从机地址1101000的设备,在其内部0x19地址的寄存器下,写入0xAA数据。

在起始条件后,紧跟着的时序必须是发送一个字节的时序,字节的内容必须是从机地址+读写位。从机地址为7位,读写位为1位,加起来正好8位。发送从机地址就是确定通信的对象,发送读写位就是确定接下来是写入还是读出。紧跟着的单元式接受从机的应答位。

 

指定地址读;对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)。

在Sr前面就是指定地址写,后面就是当前地址读。

先起始写入地址,停止,因为写入的地址会存在地址指针里,所以这个地址不会因为时序停止而消失,我们可以再起始,读当前位置,停止。

 

MPU6050

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
  • 加速度计具有静态稳定性,不具有动态稳定性

 

MUP6050参数

  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g)(如果测量的物体运动非常剧烈,可以把满量程选择大一些。反之同理)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)(满量程选得越小,测量分辨率越高)
  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频
  • I2C从机地址:1101000(AD0=0) 1101001(AD0=1)

如果认为0x68是从地址,在发送第一个字节需要把0x68左移一位,再按位或上读写位。  

把0x68左移一位后的数据当作从机地址,左移一位是0xD0。在实际发送第一个字节的时候,如果需要写就直接把0xD0当作第一个字节,如果需要读则把0xD0或0x01,即0xD1当作第一个字节。这种操作方式是读写位融入到从机地址中。0xD0是写地址,0xD1是读地址。

 

硬件电路

   

XDA和XCL通常用于外接磁力计或气压计,当接上之后,MPU6050主机接口可以直接访问扩展芯片的数据。

 

MPU6050框图

Self test(自测模块):先使能Self test测得X Accel数据,再失能Self test测X Acce数据,测出来的数据两个进行相减,再根据手册里面数据进行对比,看是否在这个区间内,在能正常使用。

Interrupt Status Register(中断状态寄存器):控制内部事件到中断引脚的输出。

FIFO(先入先出寄存器):对数据流进行缓存。

Config Registers(配置寄存器):对内部的各个电路进行配置。

Sensor Registers(传感器寄存器或数据寄存器):存储各个传感器的数据。

Serial Interface Bypass Mux(接口旁路选择器):如果拨到上面,辅助的I2C引脚和正常的I2C引脚接在一起,两路总线结合在一起,STM32能控制所有设备。如果拨到下面辅助的I2C引脚就由MPU6050控制,这时STM32是MPU6050大哥,MPU6050是扩展芯片的大哥。