STM32F03C8T6 MPU6050 标准库

本文档介绍了如何将基于HAL库的MPU-6050读取参数代码移植到STM32F103C8T6上,使用标准库完成I2C通信。移植过程中遇到的问题包括未在接收倒数第二个字节时取消ACK,以及在发送单字节时的总线Busy状态。解决方案和关键代码片段也在文中给出。
摘要由CSDN通过智能技术生成

STM32 读取 MPU-6050 参数

1、摘要

整体代码是建立在野火的MPU-6050 的代码之上,原版是使用hal 库做的
原版的地址:

https://doc.embedfire.com/module/module_tutorial/zh/latest/Module_Manual/iic_class/mpu6050.html

我将代码移植到STM32F103C8T6 上, 上层应用完全照搬, 只是重写了
下面这两个函数, 使用标准库完成。

u8 Sensors_I2C_WriteRegister(unsigned char slave_addr,
                                unsigned char reg_addr,
                                unsigned short len,
                                const unsigned char *data_ptr)


u8 Sensors_I2C_ReadRegister(unsigned char slave_addr,
                               unsigned char reg_addr,
                               unsigned short len,
                               unsigned char *data_ptr)

代码实现 就在下面的 iic.c 中。

2、移植过程中的问题

1、 是因为没有在接收倒数第二个字节是取消ACK, 就是这一句, 导致总线一致处于Busy 状态, 复位也不能解决, 只能断电。

if (i == len - 2) {
   
	I2C_AcknowledgeConfig(I2Cx, DISABLE);
}	

2、 在第一个问题上,忽略了发送一个字节的情况, 导致发送一个字节还是会卡住, 因为总线处于Busy 状态。 所以加了这一句。

if (len == 1) {
   
		I2C_AcknowledgeConfig(I2Cx, DISABLE);
	}

在这里插入图片描述
注意EV7_1, NA 是通过 I2C_AcknowledgeConfig 实现, 取消后, 在程序最后还要使能,避免后续程序出问题。

3、主函数:

    if (MPU6050ReadID() == 1) {
             // 读取一个字节的情况, 问题2解决的
          while (1) {
   
			  delay_s(1);
			  printf("1\r\n");
              MPU6050ReadAcc(Acel);       // 读取多个字节情况, 问题1 解决的
			  printf("1\r\n");
              printf("加速度: %8d  %8d  %8d\r\n",Acel[
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值