|
本帖最后由 FreeStyler 于 2014-11-22 13:46 编辑
第一次学做四轴,用的新唐的M0516单片机,软件模拟I2C,读MPU6050的WHO AM I 寄存器用串口发送得到的数据总是00,感觉是MPU6050一直没有给主机ACK信号引起的问题,请问应该怎么解决?以下是程序代码,请大家多多指教!
void I2C_delay(void)
{
unsigned int i=5000;
while(i!=0)
{
i--;
}
}
void delay5ms(void)
{
int i=5000;
while(i!=0)
{
i--;
}
}
void I2C_Start(void)
{
SDA=1;
I2C_delay();
SCL=1;
I2C_delay();
SDA=0;
I2C_delay();
SCL=0;
I2C_delay();
}
void I2C_Stop(void)
{
SCL=0;
I2C_delay();
SDA = 0;
I2C_delay();
SCL = 1;
I2C_delay();
SDA = 1;
I2C_delay();
}
void I2C_Ack(void)
{
SCL=0;
I2C_delay();
SDA=0;
I2C_delay();
SCL=1;
I2C_delay();
SCL=0;
I2C_delay();
}
void I2C_NoAck(void)
{
SCL=0;
I2C_delay();
SDA=1;
I2C_delay();
SCL=1;
I2C_delay();
SCL=0;
I2C_delay();
}
unsigned char I2C_WaitAck(void)
{
unsigned char errtime=0;
SDA=1;
I2C_delay();
SCL=1;
I2C_delay();
while(SDA==1)
{
errtime++;
if(errtime>250)
{
I2C_Stop();
return 0;
}
}
SCL=0;
I2C_delay();
return 1;
}
void I2C_SendByte(unsigned char SendByte)
{
unsigned char i;
SCL=0;
for(i=0;i<8;i++)
{
if(SendByte & (0x80)==1)
SDA=1;
else
SDA=0;
SendByte<<=1;
I2C_delay();
SCL=1;
I2C_delay();
SCL=0;
I2C_delay();
}
}
unsigned char I2C_ReadByte(void)
{
unsigned char i;
unsigned char ReceiveByte=0;
SDA=1;
for(i=0;i<8;i++)
{
ReceiveByte<<=1;
SCL=0;
I2C_delay();
SCL=1;
I2C_delay();
if(SDA==1)
{
ReceiveByte|=0x01;
}
SCL=0;
I2C_delay();
}
return ReceiveByte;
}
unsigned char Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)
{
I2C_Start();
I2C_SendByte(SlaveAddress)
if(I2C_WaitAck()==0)
{
I2C_Stop();
return 0;
}
I2C_SendByte(REG_Address);
I2C_WaitAck();
I2C_SendByte(REG_data);
I2C_WaitAck();
I2C_Stop();
delay5ms();
return 1;
}
unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
{
unsigned char REG_data;
I2C_Start();
I2C_SendByte(SlaveAddress)
I2C_WaitAck();
if(I2C_WaitAck()==0)
{
I2C_Stop();
test=1;
return 0;
}
I2C_SendByte(REG_Address);
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1);
I2C_WaitAck();
REG_data= I2C_ReadByte();
I2C_NoAck();
I2C_Stop();
return REG_data;
}
void Init_MPU6050(void)
{
Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x80);
delay5ms();
delay5ms();
delay5ms();
delay5ms();
delay5ms();
Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);
delay5ms();
delay5ms();
delay5ms();
Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);
Single_Write(MPU6050_Addr,CONFIG, 0x06);
Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x18);
Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x01);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|