|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-2-13 11:32:27
|
显示全部楼层
js200300953 发表于 2013-2-8 22:47 ![](static/image/common/back.gif)
能贴出处理数据的代码吗?
//********************************************************
//I2C定义延时
//********************************************************
void IIC_Del()
{
int a;
for(a=0;a<50;a++) //7 IS 347kHz 29 IS 99.7KHz
_asm(NOP);
}
//***********************************************************************
//I2C起始信号
//***********************************************************************
void I2C_Start()
{
SDA = 1;
IIC_Del();
SCL = 1;
IIC_Del();
SDA = 0;
IIC_Del();
SCL = 0;
IIC_Del();
}
//***********************************************************************
//I2C停止信号
//***********************************************************************
void I2C_Stop()
{
SCL = 0;
IIC_Del();
SDA = 0;
IIC_Del();
SCL = 1;
IIC_Del();
SDA = 1;
IIC_Del();
}
//***********************************************************************
//向I2C总线发送一个字节数据
//***********************************************************************
uchar I2C_WriteByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
//if(dat & 0x01<<i)
if(dat & 0x80) //应该是先发送高位,但是不行
SDA=1;
else
SDA=0;
IIC_Del();
SCL = 1; //拉高时钟线
IIC_Del(); //延时
//IIC_Del(); //延时
SCL = 0; //拉低时钟线
IIC_Del(); //延时
//IIC_Del(); //延时
dat<<=1;
}
DDRA=0XFD;
i=50;
SCL=1;
while((i>2)&&(SDA==1))
i--;
//i=SDA;
DDRA=0XFF;
SCL=0;
IIC_Del(); //延时
if(i>2) return 0; // ok
else return 1; // exist = 0 so break
}
//********************************************************
//向I2C总线写地址信息
//********************************************************
void single_byte_write(uchar REG_Address,uchar REG_data)
{
uchar i;
i=0;
I2C_Start(); //起始信号
if(I2C_WriteByte(SlaveAddress)==1)i=1; //发送设备地址+写信号
if(I2C_WriteByte(REG_Address)==1) i=2; //内部寄存器地址,
if(I2C_WriteByte(REG_data)==1) i=3; //内部寄存器数据,
I2C_Stop(); //发送停止信号
IIC_Del();
//if(i>0)
//sci_send_uint(i,0x09,'i'); //_FEED_COP();// feeds the dog /
}
//********************************************************
//向I2C总线写地址信息
//********************************************************
void InitMPU6050()
{
single_byte_write(PWR_MGMT_1, 0x01); //解除休眠状态
single_byte_write(SMPLRT_DIV, 0x07);
single_byte_write(CONFIG, 0x06);
single_byte_write(GYRO_CONFIG, 0x18);
single_byte_write(ACCEL_CONFIG, 0x18); //bit = 000 A1A0 000
// single_byte_write(0x1c, 0xf0);
// single_byte_write(0x0d, 0x00);
// single_byte_write(0x10, 0x10);
}
//***********************************************************************
//向I2C总线发送一个字节数据
//***********************************************************************
char I2C_ReadByte(void)
{
char i,dat;
dat=0;
DDRA=0XFD;
for (i=0; i<8; i++) //8位计数器
{
SCL = 1; //拉高时钟线
IIC_Del(); //延时
if(SDA)
dat |= 0x01;
else
dat |= 0;
//IIC_Del(); //延时
SCL = 0; //拉低时钟线
IIC_Del(); //延时
//IIC_Del(); //延时
dat>>=1;
}
DDRA=0XFF;
SDA=1;
IIC_Del(); //延时
SCL=1;
IIC_Del(); //延时
SCL=0;
IIC_Del(); //延时
return dat; // exist = 0 so break
}
int Single_ReadI2C(uchar REG_Address)
{
int data;
char data_l,data_h;
uchar error;
data=0; // h is 0 l is +1
data_l=0;
data_h=0;
error=0;
I2C_Start(); //起始信号
error=I2C_WriteByte(SlaveAddress);
error=I2C_WriteByte(REG_Address);
I2C_Start(); //起始信号
error=I2C_WriteByte(SlaveAddress+1);
data_h = I2C_ReadByte();
I2C_Stop();
I2C_Start(); //起始信号
error=I2C_WriteByte(SlaveAddress);
error=I2C_WriteByte(REG_Address+1);
I2C_Start(); //起始信号
error=I2C_WriteByte(SlaveAddress+1);
data_l = I2C_ReadByte();
I2C_Stop();
//data = data_h<<8+data_l;
data = data_h<<8;
data +=data_l;
return data;
}
|
|