stm32_iic的学习

文章介绍了I2C通信协议的基本概念,包括两根通信线SCL和SDA,同步半双工特性,以及起始和终止条件。内容涵盖IIC的时序单元,应答机制,以及硬件电路要求。同时,文章详细讨论了如何通过IIC与MPU6050六轴传感器进行数据交互,该传感器用于测量加速度和角速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

1.软件IIc

2.硬件IIc


学习内容:

IIC通信

1.I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线

2.两根通信线:SCL(Serial Clock)、SDA(Serial Data)

3.同步,半双工

4.带数据应答

5.支持总线挂载多设备(一主多从、多主多从)

硬件电路:

1.所有I2C设备的SCL连在一起,SDA连在一起

2.设备的SCL和SDA均要配置成开漏输出模式

3.SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

 IIC的时序单元

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

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

相当于起始位和停止位

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

主机接受一个字节

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

 应答机制

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

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

IIC时序

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

 

 

 发送到指定模块的内部

发送数据

 

 发送完成,停止

 当前地址读的时序

当读写操作后,地址指针会自动加+1;读的失手想要结束读,主机最后给个非应答。

 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

 显示模块地址+写 然后模块内部地址+重新开始+模块地址+读+指定地址的内容

MP6050

 MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景

3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

9轴(10轴)指3轴加速度,3轴角速度,3轴磁场强度,(1轴气压强度)

参数

16位ADC采集传感器的模拟信号,量化范围:-32768~32767

加速度计满量程选择:±2、±4、±8、±16(g)

陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)

可配置的数字低通滤波器

可配置的时钟源

可配置的采样分频 I2C从机地址:1101000(AD0=0)       

                                                     1101001(AD0=1)

软件iic读写MP6050(软件iic可以是gpio的任何两个引脚不一定非要是指定的)

1.写iic的初始化

 1)先将GPIO初始化

    模式设置为开漏模式

2.写iic的开始条件

void myiic_w_scl(uint8_t bitvalue)
{
    GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)bitvalue);//强转为bitaction类型
}

对scl操作进行封装

 将读写sda,写scl进行封装

 myiic_w_sda(byte&0x80);//取出最高位,用与的方法 

取出某一位,用与的方法。

可以用for循环与0x80>>i的方式

 

 

主机发送 是接受应答,主机接收,发送应答

对与两个8位数据转化为16位的方法

用移位和或的方法

int16_t *accx

uint8_t datah=mpu_readreg(MPU6050_ACCEL_XOUT_H);

 uint8_t datal=mpu_readreg(MPU6050_ACCEL_XOUT_L);

*accx=(datah<<8)|datal;

 对于需要多返回值的函数,我们可以使用用结构体打包的方法

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值