stm32F103 模拟I2C mpu6050收到数据全为0,或者地址为209,104,0x68,0xD0的一些解决办法总结

stm32F103 模拟I2C mpu6050收到数据全为0,或者地址为209,104,0x68,0xD0的一些解决办法总结:

  • 最近在学习模拟I2C,硬件有两套stm32F103C8T6和stm32F103RBT6,网上买的mpu6050套件。用stm32F103RBT6正常读到数据,可是换stm32F103C8T6读到的全是0,读who am I 按道理应该是104 (0x68)。但是读到的有时候 全为0 甚至209,或者255等等。

解决办法

  • 1 首先看能否读到who am i 读不到或者读的不正确就,对mpu6050进行一下复位:
    IICwriteBit(devAddr,MPU6050_RA_PWR_MGMT_1,7,1);
    delay_ms(30);
    IICwriteBit(devAddr,MPU6050_RA_PWR_MGMT_1,7,0);

2 狗日的甚至我用不同的线缆读的却都不一样。更不说不同的板子了。不能的板子在keil编译的时候最好选择相应的配置。
3 读不到who am i 也有可能是挂了一个以上的I2C设备,于是我就手工割掉了一个。

4 顺便说个问题 在I2C的时候 PB67 成功了PB56成功了,但是PB45 却一直有问题,最后多亏一位大神相助,STM32的PB

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
1. 设置I2C的时钟频率和GPIO引脚。可以使用STM32 HAL库提供的函数或者直接操作寄存器来设置。 2. 初始化I2C,包括配置I2C的工作模式,使能I2C,以及设置I2C地址等。 3. 发送起始信号(Start)和设备地址。发送时需要判断设备是否响应,如果没有响应则重试或者退出。 4. 发送要读取的寄存器地址,根据MPU6050数据手册可以得知要读取的寄存器地址。 5. 发送重复起始信号(Repeated Start)和设备地址,并设置I2C接收模式。 6. 读取数据,并发送停止信号(Stop)。 7. 处理读取到的数据,可以根据MPU6050数据手册来解析数据。 8. 如果需要连续读取多个寄存器,可以重复第四步和第五步。 9. 关闭I2C。 下面是一个简单的示例代码: ``` // 设置I2C的时钟频率和GPIO引脚 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; GPIOB->MODER |= GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1; GPIOB->AFR[0] |= (4 << GPIO_AFRL_AFSEL6_Pos) | (4 << GPIO_AFRL_AFSEL7_Pos); GPIOB->OTYPER |= GPIO_OTYPER_OT6 | GPIO_OTYPER_OT7; GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED6 | GPIO_OSPEEDR_OSPEED7; GPIOB->PUPDR |= GPIO_PUPDR_PUPD6_0 | GPIO_PUPDR_PUPD7_0; // 初始化I2C I2C1->CR1 &= ~I2C_CR1_PE; I2C1->CR2 &= ~I2C_CR2_FREQ; I2C1->CR2 |= 42; // 设置I2C的时钟频率为42MHz I2C1->CCR &= ~I2C_CCR_FS; I2C1->CCR |= 210; // 设置I2C的时钟频率为100kHz I2C1->TRISE |= 43; // 设置I2C的上升时间 I2C1->CR1 |= I2C_CR1_PE; I2C1->OAR1 &= ~I2C_OAR1_ADD7; I2C1->OAR1 |= (0x68 << 1); // 设置I2C地址 // 发送起始信号和设备地址 I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = 0xD0; // 发送设备地址 while (!(I2C1->SR1 & I2C_SR1_ADDR)); I2C1->SR2; // 发送要读取的寄存器地址 I2C1->DR = 0x3B; // 发送寄存器地址 while (!(I2C1->SR1 & I2C_SR1_TXE)); I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = 0xD1; // 发送设备地址,进入接收模式 while (!(I2C1->SR1 & I2C_SR1_ADDR)); I2C1->SR2; // 读取数据 uint8_t data = 0; I2C1->CR1 &= ~I2C_CR1_ACK; while (!(I2C1->SR1 & I2C_SR1_RXNE)); data = I2C1->DR; I2C1->CR1 |= I2C_CR1_STOP; // 处理数据 // ... // 关闭I2C I2C1->CR1 &= ~I2C_CR1_PE; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值