小马哥四轴代码解读-I2C-mpu6050篇

Posted dengqiangjiayou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小马哥四轴代码解读-I2C-mpu6050篇相关的知识,希望对你有一定的参考价值。

小马哥四轴代码解读-I2C-mup6050篇

I2C通信

I2C通信可以一主多从也可以多主多重(这个还不是很了解),一主多从,首先你得知道从机的地址,然后主机带着从机的地址在总线上广播,who is 这个地址,这个地址的从机就会响应





小马哥的四轴代码中用的是IO模拟的I2C通信,但是芯片中是有硬件方式的I2C通信,但是据说有bug。通信的大致过程如下:先拿到mpu6050的地址0x68,先发地址找到主机之后在发mpu6050的寄存器地址进行数据的读获写操作

  1. 初始化SCL SDA引脚,SCL配置为推我输出,SDA有输入(浮空输入)也有输出(推挽输出)
  2. 接着看时序图写起始信号和停止信号,每一个电平跳变都要延迟4us,这就和按键消抖一样,电平不可能一下子从高到低
  3. 然后就是各自的ACK阶段,就是你来我往,从机已经收到主机发来的数据 了,就发一条ACK给主机已确认收到了。主机发送数据给从机,从机同样要有ACK
  4. 接下来就是发送一个字节的数据和接收一个字节的数据
  5. 接下来就是写从指定的寄存器中读取或写入一个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

STM32CubeMX配置工程移植dmp库配合匿名四轴上位机三维动态显示测试

如何用STM32做四轴飞控?

自己写四轴飞控难度有多大?

四轴飞行器基础介绍篇

从零开始的四轴飞行器-概念理论篇