战舰的MPU6050源程序移植到F103C8的板子上,使用PB6,B7两个口做SCL,SDA中出现,各种值显示均为零。

2019-07-21 00:58发布

    我用的STM32F103C8的板子,用PB6,7作为SCL,SDA连接到MPU,MPU也连接了VCC和GND,MPU6050在其他的板子试过,是好的。 刚开始我对源程序做了如下修改 [mw_shl_code=c,true]void MPU_IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6PB7输出高 }[/mw_shl_code]
原来的战舰的好像是PA10,11来着。 后来我用做了下面的修改: [mw_shl_code=c,true]//IO方向设置 #define MPU_SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//10(上下拉输入) 00(模式 输入) #define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//00(推免输出) 11(模式 输出) //IO操作函数 #define MPU_IIC_SCL PBout(6) //SCL #define MPU_IIC_SDA PBout(7) //SDA #define MPU_READ_SDA PBin(7) //输入SDA [/mw_shl_code]

因为我用的是PB7,所以我把CRH改为了CRL,移位和清零都做了相应的修改。然后MPU_Init函数我也注释了前面的一部分,如下。 移植就到了这里,芯片参数什么的我都改好了。 接下来描述我的问题。。。。。 ---------------------------------------------------- [mw_shl_code=c,true]u8 MPU_Init(void) { u8 res; // GPIO_InitTypeDef GPIO_InitStructure; // // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外设IO PORTA时钟 // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz // GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!! //MPU_AD0_CTRL=0; //控制MPU6050的AD0脚为低电平,从机地址为:0X68 MPU_IIC_Init();//初始化IIC总线 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050 delay_ms(100); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050 MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps MPU_Set_Accel_Fsr(0); //加速度传感器,±2g MPU_Set_Rate(50); //设置采样率50Hz MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断 MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭 MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效 res=MPU_Read_Byte(MPU_DEVICE_ID_REG); //这里读出来的是FF,正常应该是0X68的。 if(res==MPU_ADDR)//器件ID正确 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作 MPU_Set_Rate(50); //设置采样率为50Hz }else return 1; return 0; }[/mw_shl_code]
就是上面那个res的值老是错的,我用红 {MOD}的注释出来了! 也就是
MPU_Read_Byte(MPU_DEVICE_ID_REG)这个函数出来东西有问题 而:#define MPU_DEVICE_ID_REG  0X75 //器件ID寄存器 这个是没有问题的,我们来看这个函数: [mw_shl_code=c,true]u8 MPU_Read_Byte(u8 reg) { u8 res; MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令 MPU_IIC_Wait_Ack(); //等待应答 MPU_IIC_Send_Byte(reg); //写寄存器地址 MPU_IIC_Wait_Ack(); //等待应答 MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令 MPU_IIC_Wait_Ack(); //等待应答 res=MPU_IIC_Read_Byte(0);//读取数据,发送nACK MPU_IIC_Stop(); //产生一个停止条件 return res; }[/mw_shl_code]
里面RES是调用了MPU_IIC_Read_Byte(0)来给它赋值! 我们再继续往下看这个函数 [mw_shl_code=c,true]//读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 MPU_IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; MPU_SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { MPU_IIC_SCL=0; MPU_IIC_Delay(); MPU_IIC_SCL=1; receive<<=1; if(MPU_READ_SDA)receive++; MPU_IIC_Delay(); } if (!ack) MPU_IIC_NAck();//发送nACK else MPU_IIC_Ack(); //发送ACK return receive; }[/mw_shl_code]
我至此就实在不知道移植中哪个环节出了问题,为什么就一直没有数据。求助大神!!!! 所有程序都是原子资料里战舰版MPU6050的原版,大家随时可以查看源码。 说白了,其实就是我把芯片换成了STMF103C8,引脚改为了PB6,7,应该做哪些修改?我错在那里?求助!! 求助!!! 求助!!! 已经弄了几天了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。