小马哥四轴代码解读-I2C-mpu6050篇
Posted dengqiangjiayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小马哥四轴代码解读-I2C-mpu6050篇相关的知识,希望对你有一定的参考价值。
小马哥四轴代码解读-I2C-mup6050篇
I2C通信
I2C通信可以一主多从也可以多主多重(这个还不是很了解),一主多从,首先你得知道从机的地址,然后主机带着从机的地址在总线上广播,who is 这个地址,这个地址的从机就会响应
小马哥的四轴代码中用的是IO模拟的I2C通信,但是芯片中是有硬件方式的I2C通信,但是据说有bug。通信的大致过程如下:先拿到mpu6050的地址0x68,先发地址找到主机之后在发mpu6050的寄存器地址进行数据的读获写操作 。
- 初始化SCL SDA引脚,SCL配置为推我输出,SDA有输入(浮空输入)也有输出(推挽输出)
- 接着看时序图写起始信号和停止信号,每一个电平跳变都要延迟4us,这就和按键消抖一样,电平不可能一下子从高到低
- 然后就是各自的ACK阶段,就是你来我往,从机已经收到主机发来的数据 了,就发一条ACK给主机已确认收到了。主机发送数据给从机,从机同样要有ACK
- 接下来就是发送一个字节的数据和接收一个字节的数据
- 接下来就是写从指定的寄存器中读取或写入一个uint8_t data的数据
/***************************************************************************************
* 函 数:uint8_t IICreadBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data)
* 功 能:读取指定设备 指定寄存器的 length个值
* 参 数:dev 目标设备地址
reg 寄存器地址
length 要读的字节数
*data 读出的数据将要存放的指针
* 返回值:1成功 0失败
* 备 注:无
***************************************************************************************/
uint8_t IIC_ReadMultByteFromSlave(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data)
uint8_t count = 0;
uint8_t temp;
IIC_Start();
IIC_SendByte(dev); //发送从机地址
if(IIC_WaitAck())
IIC_Stop();
return 1; //从机地址写入失败
IIC_SendByte(reg); //发送寄存器地址
IIC_WaitAck();
IIC_Start();
IIC_SendByte(dev+1); //进入接收模式
IIC_WaitAck();
for(count=0;count<length;count++)
if(count!=(length-1))
temp = IIC_ReadByte(1); //带ACK的读数据
else
temp = IIC_ReadByte(0); //最后一个字节NACK
data[count] = temp;
IIC_Stop(); //产生一个停止条件
return 0;
/****************************************************************************************
* 函 数:uint8_t IICwriteBytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
* 功 能:将多个字节写入指定设备 指定寄存器
* 参 数:dev 目标设备地址
reg 寄存器地址
length 要写的字节数
*data 要写入的数据将要存放的指针
* 返回值:1成功 0失败
* 备 注:无
****************************************************************************************/
uint8_t IIC_WriteMultByteToSlave(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
uint8_t count = 0;
IIC_Start();
IIC_SendByte(dev); //发送从机地址
if(IIC_WaitAck())
IIC_Stop();
return 1; //从机地址写入失败
IIC_SendByte(reg); //发送寄存器地址
IIC_WaitAck();
for(count=0;count<length;count++)
IIC_SendByte(data[count]);
if(IIC_WaitAck()) //每一个字节都要等从机应答
IIC_Stop();
return 1; //数据写入失败
IIC_Stop(); //产生一个停止条件
return 0;
mpu6050先不写啦
以上是关于小马哥四轴代码解读-I2C-mpu6050篇的主要内容,如果未能解决你的问题,请参考以下文章
基于Arduino平台dmp库+匿名四轴上位机测试MPU6050