移植原子哥407板子上的MPU6050程序到MINI板子上DMP初始化出错,求教。

2019-07-21 09:02发布

 我把MPU6050的程序一直到了MINI板子上,mpu_dmp_init()这一步出错,返回值是8,IIC正常,aacx,aacy,aacz,gyrox,gyroy,gyroz值都能读出来了,求大神指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
hun
1楼-- · 2019-07-21 11:47
业余爱好者,硬件IIC终于成功了,之前也是自检不过,可以说明自检不过很有可能是读写时序问题。可能之后也就不做了,但还是分享出来吧,谢谢各位的分享[mw_shl_code=c,true]void Init_I2C1(){
        GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE );
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                                 //配置串口接收端口挂接到9端口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;                           //复用功能输出OD
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                   //配置端口速度为50M                                  
  GPIO_Init(GPIOB, &GPIO_InitStructure);                                           //根据参数初始化GPIOB寄存器       
       
        I2C_DeInit(I2C1);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 50000;
  I2C_Init(I2C1, &I2C_InitStructure);
  I2C_Cmd(I2C1, ENABLE);       
}

u8 MPU_Write_Byte(u8 reg,u8 data){
        u16 i;
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_SendData(I2C1,reg);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_SendData(I2C1,data);
        I2C_GenerateSTOP(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }

        return 0;
}

u8 MPU_Read_Byte(u8 reg){
        u8 reg_data;
        u16 i=0;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_SendData(I2C1,reg);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Receiver);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_AcknowledgeConfig(I2C1,DISABLE);
        I2C_GenerateSTOP(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        reg_data = I2C_ReceiveData(I2C1);
        return reg_data;       
}

u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf){
        u8 n;
  u16 i;       
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_SendData(I2C1,reg);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        for(n=0;n<len;n++){
                I2C_SendData(I2C1,buf[n]);
                i=0;
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                  i++;
                  if(i>2000)
                          return 1;
                        if(n>=(len-1))
                                I2C_GenerateSTOP(I2C1,ENABLE);
          }
        }   
           
        return 0;       
}

u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf){
  u16 i;       
        i=0;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((addr<<1)|0),I2C_Direction_Transmitter);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_SendData(I2C1,reg);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_GenerateSTART(I2C1,ENABLE);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_Send7bitAddress(I2C1,((addr<<1)|0),I2C_Direction_Receiver);
        i=0;
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)&&(i<2100)){
                i++;
                if(i>2000)
                        return 1;
        }
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        while(len){
                i=0;
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)&&(i<2100)){
                  i++;
                  if(i>2000)
                          return 1;
          }      
                if(len<=2){
                         I2C_AcknowledgeConfig(I2C1,DISABLE);
             I2C_GenerateSTOP(I2C1,ENABLE);
           }
                *buf = I2C_ReceiveData(I2C1);        //读数据,发送ACK                       
           len--;
           buf++;                 
        }   
        return 0;       
}
[/mw_shl_code]
Director_Liu
2楼-- · 2019-07-21 12:38
默默自顶、、、
正点原子
3楼-- · 2019-07-21 17:30
 精彩回答 2  元偷偷看……
Director_Liu
4楼-- · 2019-07-21 20:29
回复【3楼】正点原子:
---------------------------------
原子哥,407板子上MPU6050程序中mpu_dmp_init()返回值8代表的是什么。。。?
正点原子
5楼-- · 2019-07-21 23:31
回复【4楼】Director_Liu:
---------------------------------
看代码.
hun
6楼-- · 2019-07-22 03:13
注释没改

一周热门 更多>