stm32 I2C通信协议(一)(基本知识和软件实现)

目录

stm32 I2C通信协议(一)(基本知识和软件实现)

一、I2C基础知识

1)I2C通信

  • I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)

2)I2C硬件电路

  • 所有I2C设备的SCL连接在一起,SDA连接在一起
  • 每个从机有一个7位地址,部分地址可以通过引脚灵活切换
  • 所有SCL和SDA都配置为开漏输出模式
    1. 防止电源短路,所有设备禁止强上拉模式
    2. 避免了输入输出的频繁切换
    3. 通过"线与"实现多主机模式下的时钟同步和总线仲裁
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

2)I2C时序基本单元

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

3)I2C完整时序

  • 指定地址写
  • 对于指定设备(Slave Address 0xD0),在指定地址(Reg Address 0x19)下,写入指定数据(Data 0xAA)
  • 当前地址读
  • 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
  • 读取操作会读取到上次主机读取的地址的下一位,所以要指定地址读的话就先进行指定地址写的操作,在主机写完后再次发送起始命令就可以直接进行读的操作了
  • 主机可以不应答,就是告诉从机不想要数据了,然后再结束

4)MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角(欧拉角),常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
  • 可配置的数字低通滤波器,是输出数据平缓
  • 可配置的时钟源
  • 可配置的采样分频,控制AD转换的速度
  • I2C从机地址:1101000(AD0=0) 1101001(AD0=1),不融入读写位为0x68,融入读写位为0xD0
  • 硬件电路,通过自测响应判断好坏,同时具有温度传感器,内部有电荷泵(用来升压 )
  • 其他资料详见手册

二、实验

1)软件I2C读写MPU6050

  • 可以把AD0引脚接高电平修改MPU的名称,改了后记得地址为0xD2

  • 关键代码:

    复制代码
    //写一个字节
    void MPU6050_WriteReg(u8 RegAddress, u8 Data){
    	MyI2C_Start();
    	MyI2C_SendByte(0xD0);
    	MyI2C_ReceiveAck();
    	MyI2C_SendByte(RegAddress);
    	MyI2C_ReceiveAck();
    	MyI2C_SendByte(Data);
    	MyI2C_ReceiveAck();
    	MyI2C_Stop();
    }
    
    //读一个字节
    u8 MPU6050_ReadReg(u8 RegAddress){
    	MyI2C_Start();
    	MyI2C_SendByte(0xD0);
    	MyI2C_ReceiveAck();
    	MyI2C_SendByte(RegAddress);
    	MyI2C_ReceiveAck();
    	
    	MyI2C_Start();
    	MyI2C_SendByte(0xD1);
    	MyI2C_ReceiveAck();
    	u8 Data = MyI2C_ReceiveByte();
    	MyI2C_SendAck(1);
    	MyI2C_Stop();
    	
    	return Data;
    }
    
    u8 MPU6050_GetID(void){
    	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
    }
    
    void MPU6050_Init(void){
    	MyI2C_Init();
    	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
    	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
    	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x00);
    	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
    	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
    	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18); 
    }
    
    void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t*AccZ, int16_t  *GyroX, int16_t *GyroY, int16_t *GyroZ){
    	
    	int16_t DataH, DataL;	
    						 
    	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
    	*AccX = DataH << 8 | DataL;
    						 
    	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
    	*AccY = DataH << 8 | DataL;
    						 
    	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
    	*AccZ = DataH << 8 | DataL;
    	
    	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
    	*GyroX = DataH << 8 | DataL;
    						 
    	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
    	*GyroY = DataH << 8 | DataL;
    						 
    	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
    	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
    	*GyroZ = DataH << 8 | DataL;
    }
完整代码见资源绑定

附学习参考网址

  1. STM32入门教程-2023版 细致讲解 中文字幕

欢迎大家有问题评论交流 (* ^ ω ^)

相关推荐
得单片机的运4 小时前
STM32的蓝牙通讯(HAL库)
stm32·单片机·嵌入式硬件·蓝牙
国科安芯5 小时前
抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
运维·网络·人工智能·单片机·自动化
weixin_452600696 小时前
GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制
stm32·单片机·嵌入式硬件·智能家居·音响·电动工具
Despacito0o9 小时前
STM32 I2C通信完整教程:从协议原理到硬件实现
stm32·单片机·嵌入式硬件
你好,奋斗者!9 小时前
小电流驱动大电流:原理、实现方式与应用前景
stm32·单片机·嵌入式硬件·电路设计
XINVRY-FPGA12 小时前
XCZU4EV-1FBVB900E Xilinx FPGA AMD Zynq UltraScale+ MPSoC EV(Embedded Vision)
arm开发·嵌入式硬件·计算机视觉·fpga开发·硬件架构·硬件工程·fpga
猫猫的小茶馆13 小时前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
学不动CV了13 小时前
单片机ADC采集机理层面详细分析(二)
c语言·arm开发·stm32·单片机·嵌入式硬件·开源·51单片机
学不动CV了13 小时前
51核和ARM核单片机OTA实战解析(二)
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
Yuroo zhou14 小时前
IMU的精度对无人机姿态控制意味着什么?
单片机·嵌入式硬件·算法·无人机·嵌入式实时数据库