IIC读取mpu6050数据不对

[复制链接]
1638|4
手机看帖
扫描二维码
随时随地手机跟帖
蒋博1026|  楼主 | 2019-4-16 17:43 | 显示全部楼层 |阅读模式
最近在用STM32F103C8T6读取mpu6050的数据,调试发现,不管是读取加速度计还是陀螺仪,三个轴的数据却只能读取到一个轴的数据,起始值始终是-256,也就是0xff;当动一下mpu6050的时候,数据会变,但是只会增,意思就是X轴的低八位一直是0xFF;不知咋回事了,求大佬指点
#define SDA_IN()    PBin(9)    //PB9输入模式
#define SDA_OUT()   PBout(9)   //PB9输出模式
#define IIC_SCL   PBout(8)
#define IIC_SDA   PBout(9)
#define READ_SDA    GPIOB->IDR  & GPIO_Pin_9

void IIC_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 普通输出模式  开漏输出  SCL
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //50Mhz
  GPIO_Init(GPIOB,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; // 普通输出模式  开漏输出
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //50Mhz
  GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**********************************************************
函数功能:起始信号
***********************************************************/
int I2C_soft_start(void)
{
  //SDA_OUT();
  IIC_SCL = 1;
  IIC_SDA = 1;
   delay_us(4);
   //if(!SDA_read)return 0; //如果SDA=0,返回0;如果SDA=1,继续执行。
   IIC_SDA = 0;
  delay_us(4);
   //if(SDA_read)return 0;   //如果SDA=1,返回0;如果SDA=0,继续执行。
  IIC_SCL = 0;
    delay_us(4);
   return 1;
}
/**********************************************************
函数功能:停止信号
***********************************************************/
void I2C_soft_stop(void)
{
   //SDA_OUT();
  IIC_SCL = 0;
   delay_us(4);
  IIC_SDA = 0;
  delay_us(4);
   IIC_SCL = 1;
  delay_us(4);
   IIC_SDA = 1;
  delay_us(4);
}
/**********************************************************
函数功能:应答信号
***********************************************************/
int I2C_soft_ask(void)
{
  int i=0;
  IIC_SCL = 0;
  delay_us(4);
  IIC_SDA = 1;
    delay_us(4);
    IIC_SCL = 1;
  delay_us(4);
   SDA_IN();
  while(READ_SDA)
  {
   i++;
   if(i>50)
   {
    I2C_soft_stop();
     return 1;
   }
  }
  SDA_OUT();
  IIC_SCL = 0;
  delay_us(4);
    return 0;
}
/**********************************************************
函数功能:写一个字节
***********************************************************/
void I2C_Send_Byte(u8 txd)
{
   int i=8;
  while(i--)
   {
     IIC_SCL = 0;
     delay_us(4);
    if(txd&0x80)
     IIC_SDA = 1;  
    else
     IIC_SDA = 0;
     txd<<=1;
     delay_us(4);
     IIC_SCL = 1;
     delay_us(4);
   }
   IIC_SCL = 0;
}
/**********************************************************
函数功能:不产生应答
***********************************************************/
void IIC_noAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**********************************************************
函数功能:产生应答
***********************************************************/
void IIC_ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**********************************************************
函数功能:读一个字节
ack=1时,发送ACK,ack=0,发送nACK
***********************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
   {
        IIC_SCL=0;
        delay_us(2);
      IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
      delay_us(2);
    }      
    if (!ack)
        IIC_noAck();//发送nACK
    else
        IIC_ack(); //发送ACK   
    return receive;
}


OSJ@0`B@N8EJJR(ZKVNH6AM.png

使用特权

评论回复

相关帖子

请叫我树人| | 2019-4-17 09:27 | 显示全部楼层
我也不太知道的啊!

使用特权

评论回复
yueguang3048| | 2019-4-17 09:53 | 显示全部楼层
先检查你的IIC通讯正常与否,比如读取chipID。没用过这个片子,你自己看看片子的DATAHSEET,是否有没有发现的“坑”。

使用特权

评论回复
Ketose| | 2019-4-17 12:04 | 显示全部楼层
用逻辑分析仪看下就知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1827

帖子

18

粉丝