5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1211|回复: 1
打印 上一主题 下一主题

与角速率传感器ITG3200通信不知道对不对啊?

[复制链接]
跳转到指定楼层
楼主
发表于 2011-7-26 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的与角速率传感器能够通信,但是我不知道是什么回事的,读回来的数据显示的很是有问题。。。已经检查很久,不知道是什么问题,在此虚心的向大家请教了。。。00003
00009
00002
00000
65536
00000
00000
65536
65536
00009
65536
00000
00000
00000
00000
00002
00000
00002
65536
65536
00000
65536
00002
00000
00000
这个采集回来的数据,显示达到最大值,不知道是这么回事啊????
这个是对寄存器进行配置
WriteITG3200Byte(0x80,PWR_M_AD); //reset to deaults
WriteITG3200Byte(0x04,SMPL_AD); //DIV 4
WriteITG3200Byte(0x12,DLPF_AD); //Reserved ,1KHz,98Hz
WriteITG3200Byte(0x05,INT_C_AD);
WriteITG3200Byte(0x00,PWR_M_AD);
/***********************IIC通信*****************

#include "includes.h"
/***************************************************************************
初始化IIC
***************************************************************************/
void InitIIC()
{
IIC_DIR |= IIC_SCL; //SCL管脚为输出
IIC_DIR &= ~IIC_SDA; //SDA管脚为输入
C_SCL;
Stop();
}
/***************************************************************************
进行短暂的延时,原因速度比较快。
***************************************************************************/
void delay()
{
unsigned char q0;
for(q0=0;q0<20;q0++)
{
_NOP();
}
}

/***************************************************************************
启动IIC总线
***************************************************************************/
void Start()
{
SDA_OUT;
S_SDA;
delay();
S_SCL;
delay();
C_SDA;
delay();
C_SCL;
delay();
}

/***************************************************************************
停止操作,释放IIC总线
***************************************************************************/
void Stop()
{
SDA_OUT;
C_SCL;
delay();
C_SDA;
delay();
S_SCL;
delay();
S_SDA;
delay();
}

/***************************************************************************
IIC总线应答
***************************************************************************/
void Ack()
{
SDA_OUT;
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
S_SDA;
}

/***************************************************************************
IIC总线无应答
***************************************************************************/
void NoAck()
{
SDA_OUT;
S_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
}

/***************************************************************************
IIC总线检验应答
返回值:IIC应答位的值0:应答 1:无应答
***************************************************************************/
unsigned char TestAck()
{
unsigned char ack;

S_SCL;
delay();
SDA_IN;
delay();
ack=READ_SDA;
delay();
C_SCL;
delay();
return(ack);
}

/***************************************************************************
IIC总线写8位数据
input:要写的8位数据
***************************************************************************/
void Write8Bit(unsigned char input)
{
unsigned char temp,q0;
SDA_OUT;
for(temp=8;temp!=0;temp--)
{
q0=input&0x80;
if(q0==0x80)
S_SDA;
else
C_SDA;
delay();
S_SCL;
delay();
C_SCL;
delay();
input=input<<1;
}
}

/***************************************************************************
IIC总线读8位数据
返回值:读出的8位数据
***************************************************************************/
unsigned char Read8Bit()
{
unsigned char temp,q0,rbyte=0;
SDA_IN;
for(temp=8;temp!=0;temp--)
{
S_SCL;
delay();
rbyte=rbyte<<1;
SDA_IN;
q0=READ_SDA;
if(q0==IIC_SDA)
rbyte=rbyte|0x1;
delay();
C_SCL;
delay();
}
return(rbyte);
}
/***************************************************************************
向ITG3200中写一个字节
wdata:要写入的数据
adr:ITG3200中要写入数据的首地址
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char WriteITG3200Byte(unsigned char wdata,unsigned char adr)
{
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写ITG3200的芯片地址以及确定下面执行写操作
if(TestAck()==1) //检验应答
return 1; //若应答错误,则退出函数,返回错误
Write8Bit(adr); //写对ITG3200操作的地址
if(TestAck()==1)
return 1;

Write8Bit(wdata); //向ITG3200中写数据
if(TestAck()==1)
return 1;
Stop(); //停止IIC总线
DelayMs(10); //写入延时,等待完成内部写入

return 0;
}
/***************************************************************************
从ITG3200中读一个字节
adr:ITG3200中要读出数据的地址
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char ReadITG3200Byte(unsigned char adr)
{
uchar temp;
Start(); //启动IIC总线
Write8Bit(W_DEVICE_ADR); //写ITG3200的芯片地址以及确定下面执行写操作
if(TestAck()==1)
return 1;
Write8Bit(adr); //写对ITG3200操作的地址
if(TestAck()==1)
return 1;

Start(); //再次启动IIC总线
Write8Bit(R_DEVICE_ADR); //写ITG3200的芯片地址以及确定下面执行读操作
if(TestAck()==1)
return 1;
temp=Read8Bit(); //从ITG3200中读数据
NoAck(); //IIC无应答操作
Stop(); //停止IIC总线

return temp;
}

欢迎继续阅读楼主其他信息

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
沙发
发表于 2011-7-26 11:42 | 只看该作者
等RAW_DATA_RDY标志置位后,再读,置位之前读出的数据不可靠,具体你需要贴完整的代码出来才能分析。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表