最近在用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;
}
|