I2C通信

I2C简介

I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
两根通信线:SCL(Serial Clock)、SDA(Serial Data)
同步,半双工
带数据应答
支持总线挂载多设备(一主多从、多主多从)
I2C通信_第1张图片
注意:SDA和SCL均添加了上拉电阻,默认状态下电阻有弱上拉作用!

I2C时序基本单元:

起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
I2C通信_第2张图片
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
I2C通信_第3张图片
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
I2C通信_第4张图片
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

I2C通信_第5张图片
I2C时序:
I2C通信_第6张图片
I2C通信_第7张图片对从机里面的哪个寄存器进行读写,由一个特定指针操控,指定地址写前两个步骤指定了一个具体的丛机以及丛机寄存器的地址,每次写入与读取双操作完后,指针会自动移动到下一位!当前地址读没有指定寄存器功能,所以少用!
I2C通信_第8张图片

MPU6050器件简介

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
I2C通信_第9张图片
MPU6050参数:
I2C通信_第10张图片

软件I2C

用软件对GPIO口进行取反以及置高置地模拟I2C通信

模拟I2C基本时序单元:
I2C通信_第11张图片
对时序基本单元进行封装——指定地址写或读
I2C通信_第12张图片

STM硬件I2C外设

STM单片机I2C外设简介:

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

STM32F103C8T6 硬件I2C资源:I2C1、I2C2

i2C框图:
I2C通信_第13张图片
I2C通信_第14张图片
主机发送:
I2C通信_第15张图片
代码展示:
I2C通信_第16张图片
主机接收:
I2C通信_第17张图片
代码展示:
注意:应该在接收最后一个字节之前提前将应答失能以及提前申请停止条件!并且接受完数据后将应答恢复为使能,不影响后续可能产生的读取多字节操作!
解释:因为在数据接收到后应答位已经发送出去了,所以要提前应答失能,不然就慢了!提前产生申请停止条件不会立即截止当前字节接收,会等待当前字节接收完成后再产生终止条件的波形!
I2C通信_第18张图片
初始化以及MPU6050寄存器初始化:
I2C通信_第19张图片

硬件I2C常用函数

I2C通信_第20张图片
监控标志位(最常用):
I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
确认事件是否发生
使用例子:
I2C通信_第21张图片

你可能感兴趣的:(STM32单片机标准库,单片机,stm32,c语言,嵌入式硬件,学习)