|
楼主 |
发表于 2016-7-14 21:41:22
|
显示全部楼层
void I2C_Start(void)
{
I2C_SDA_0;
Delay(I2C_Delay);
I2C_SCL_0;
Delay(I2C_Delay);
}
////////////////////////////////////////
void I2C_W_8Bit(u8 WriteData)
{
u8 i,j;
j = WriteData;
for(i=0; i<8; ++i)
{
if((j&0x80)==0)
{
I2C_SDA_0;
}
else
{
I2C_SDA_1;
}
j <<= 1;
Delay(I2C_Delay);
I2C_SCL_1;
Delay(I2C_Delay);
I2C_SCL_0;
Delay(I2C_Delay);
}
}
////////////////////////////////////////
u8 I2C_Check_ACK(void)
{
u8 Ack_Max;
Ack_Max = 0;
//输入模式
Set_I2C_SDA_IN;
I2C_SDA_1;
I2C_SCL_1; //拉高
Delay(I2C_Delay);
//应答位
while( I2C_SDA_CaiJi_1 ) //
{
if(Ack_Max < 3 ) //
{
++Ack_Max; //
}
else
{
Set_I2C_SDA_OUT;
Delay(I2C_Delay);
I2C_Stop();
return U_DEFEAT; //返回
}
}
I2C_SCL_0;
Set_I2C_SDA_OUT;
return U_SUCCEED; //返回
}
////////////////////////////////////////
u8 I2C_R_8Bit(void)
{
u8 i;
u8 TempData;
TempData = 0;
//输入
Set_I2C_SDA_IN; //输入
for(i=0; i<8; i++) //一个字节
{
I2C_SCL_1;
Delay(I2C_Delay);
TempData <<= 1;
if( I2C_SDA_CaiJi_0 ) //如果“1”,则加“1”
{
}
else
{
TempData++; //自加“1”
}
I2C_SCL_0;
Delay(I2C_Delay);
}
Set_I2C_SDA_OUT; //输出模式
return(TempData); //返回数据
}
////////////////////////////////////////
void I2C_Ack(void)
{
I2C_SDA_0; //
Delay(I2C_Delay);
I2C_SCL_1; //
Delay(I2C_Delay);
I2C_SCL_0; //
Delay(I2C_Delay);
}
void I2C_NoAck(void)
{
I2C_SDA_1;
Delay(I2C_Delay);
I2C_SCL_1;
Delay(I2C_Delay);
I2C_SCL_0; //
Delay(I2C_Delay);
}
void I2C_Stop(void)
{
I2C_SDA_0; //
Delay(I2C_Delay);
I2C_SCL_1; //
Delay(I2C_Delay);
I2C_SDA_1; //
Delay(I2C_Delay);
}
////////////////////////////////////////
u8 MPU6050_R_Data(
u8 I2C_Device_No,
u8 Start_Addr,
u8 *Array_Data,
)
{
u8 temp_Addr1;
u8 temp_I2C_Device; //
temp_Addr1 = Start_Addr;
I2C_Start();
temp_I2C_Device = (I2C_Device_No&I2C_W); //写
I2C_W_8Bit( temp_I2C_Device ); //
if(I2C_Check_ACK() == U_DEFEAT) //应答位
{
return U_DEFEAT; //返回
}
I2C_W_8Bit( temp_Addr1 ); //
if(I2C_Check_ACK() == U_DEFEAT) //应答位
{
return U_DEFEAT; //返回
}
I2C_Start();
I2C_W_8Bit( I2C_Device_No|I2C_R ); //读
if(I2C_Check_ACK() == U_DEFEAT)
{
return U_DEFEAT; //返回
}
//接收8位
*Array_Data = I2C_R_8Bit(); //数据
I2C_NoAck(); //非应答
I2C_Stop();
return U_SUCCEED; //返回
}
////////////////////////////////////////
u8 MPU6050_W_Byte(
u8 I2C_A012_No,
u8 Start_Addr,
u8 *Array_Data
)
{
I2C_Start();
temp_I2C_Device = (I2C_Device_No&I2C_W); //写
I2C_W_8Bit( temp_I2C_Device ); //
if(I2C_Check_ACK() == U_DEFEAT) //应答位
{
return U_DEFEAT; //返回
}
I2C_W_8Bit( temp_Addr1 ); //
if(I2C_Check_ACK() == U_DEFEAT) //应答位
{
return U_DEFEAT; //返回
}
//写1个字节
I2C_W_8Bit( *Array_Data ); //
if(I2C_Check_ACK() == U_DEFEAT)
{
return U_DEFEAT; //返回
}
I2C_Stop();
return U_SUCCEED; //返回
}
////////////////////////////////////////
u8 Init_MPU6050(void)
{
u8 temp;
//复位MPU6050
temp = 0x80;
MPU6050_W_Byte(MPU6050_No,PWR_MGMT_1,&temp); //
// Delay_M(150);
// Delay_M(100);
Delay_M(20); //NOP延时实现,时间足够长。
//写入解除休眠状态
temp = 0x00;
MPU6050_W_Byte(MPU6050_No,PWR_MGMT_1,&temp); // 解除休眠状态
// Delay_M(150);
// Delay_M(100);
Delay_M(30);
// 陀螺仪采样率设置(125HZ)
temp = 0x07;
MPU6050_W_Byte(MPU6050_No,SMPLRT_DIV,&temp); // 陀螺仪采样率设置(125HZ)
Delay_K(10);
// 低通滤波器频率设置(5HZ)
temp = 0x06;
MPU6050_W_Byte(MPU6050_No,CONFIG,&temp); // 低通滤波器频率设置(5HZ)
Delay_K(10);
// 陀螺仪自检及检测范围设置
temp = 0x18;
MPU6050_W_Byte(MPU6050_No,GYRO_CONFIG,&temp); // (不自检,16.4LSB/DBS/S)
Delay_K(10);
temp = 0x01;
MPU6050_W_Byte(MPU6050_No,ACCEL_CONFIG,&temp)
Delay_K(10);
}
////////////////////////////////////////
u8 MPU6050_ID(void)
{
u8 temp;
//检查MPU6050
if(MPU6050_R_Data(MPU6050_No,WHO_AM_I,&temp) == U_DEFEAT) //应答
{
return U_DEFEAT; //返回
}
//检查MPU6050的ID
if( temp != 0x68) //检查MPU6050的ID是否正常
{
return U_DEFEAT; //返回
}
return U_SUCCEED; //返回
} |
|