项目场景:
探索者STM32F407开发板与独立惯导MPU6050配置,采用正点原子例程
问题描述:
正点原子例程中采用的是内置惯导,引脚分别为 PB8 与 PB9
在实验过程中,遇到了如下问题:
(1)直接使用 PB8 与 PB9 与惯导的 SCL 与 SDA 相连:
问题:无法识别到独立惯导,数据显示为内置惯导
由于源程序在开发板上直接运行是没有问题的,因此应该是开发板内部连接问题,使得 PB8 与 PB9 不能继续使用。
(2) 改写程序中的 IIC 部分,采用其他引脚(PB6 和 PB7):
改写的内容主要包括 IIC.h 和 IIC.c 两个文件,对照 stm32f4 官方手册:
//myiic.c
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//修改GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;//修改引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);//修改GPIOB
IIC_SCL=1;
IIC_SDA=1;
}
//myiic.h
#define SDA_IN() {GPIOC->MODER&=~(3<<(9*2));GPIOC->MODER|=0<<9*2;} //修改
#define SDA_OUT() {GPIOC->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
#define IIC_SCL PBout(8) //SCL 修改
#define IIC_SDA PBout(9) //SDA 修改
#define READ_SDA PBin(9) //修改
@Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget(); }
结果开发板显示为无数据,查看源码发现这种情况是 MPU 已经正常初始化了,但没有得到数据,原因是函数mpu_dmp_get_data(&pitch,&roll,&yaw)返回值不为0,因此通过串口打印查看了函数的返回值,发现为1,继续深入查找,也在网上看了很多类似的情况,主要有以下几类:
- FIFO 没有使能:原子例程中指明不需要使能
- MPU 供电电压选错:选成 5V 模块不早就烧坏了吗?感觉这个也不对
- IIC 读取速度太慢
总之,上面的各种情况我都一一查看了,都不是造成我的这种情况的原因。
(3)考虑开发板内部接线复杂,选择了较为稳妥的串口2的引脚( PA2 和 PA3)
结果:数据正常显示
原因分析:
开发板内部接线使得某些引脚不可用
解决方案:
使用串口 2
vcc-3.3v
gnd-gnd
scl-pa2
sda-pa3
ad0-gnd
int-pc0