小马哥四轴代码解读-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先不写啦
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值