新手入门
- 积分
- 2
- 金钱
- 2
- 注册时间
- 2020-7-14
- 在线时间
- 0 小时
|
10金钱
本帖最后由 迈克老牛 于 2016-12-20 11:56 编辑
一般读取l3G4200d的数据是是分两次读取 低字节和高字节,现在想一次性读取两个字节。出现了问题,根据手册所写,只要读取地址的最高位为1就可以地址位自动+1。但是我照着改了还是不行。如果读取地址为028,可以正常读取该地址数据。但改为0xA8后读数就会出错。包括低位数据也不正常。读取函数如下:
short Word_Read(unsigned char SlaveAddress,unsigned char REG_Address)
{
u8 REG_data;
u8 REG_data2;
REG_Address=0xA8;
IIC_Start();
IIC_Send_Byte(SlaveAddress); //SlaveAddress:0xD2
IIC_Send_Byte((u8) REG_Addres); //
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
REG_data= IIC_Read_Byte();
IIC_Ack();
REG_data2= IIC_Read_Byte();
IIC_NAck();
IIC_Stop();
printf("%x %x\r\n",REG_data2,REG_data);
return REG_data;
}
现在如果REG_Address=0x28时,可以正常读取低位,REG_data2 和 REG_data 数值遇陀螺仪运动而正常变化只是数值相等,表示两者都可以正常读数只是读取的是同一地址下的数,而当REG_Address=0xA8时REG_data2 和 REG_data读出的数据是一组固定的不同的数值,表示读出的是不同地址的数据但是读数不正常。我看了网上类以的程序和我的步骤是一样的,不知是不是模拟IIC的程序有问题,我的程序如下:
void IIC_Start( )
{
SDA_OUT();
IIC_SCL()=1;
IIC_SDA()=1;
delay_us(1);
IIC_SDA()=0;
delay_us(1);
IIC_SCL()=0;//
}
void IIC_Stop()
{
SDA_OUT();//
delay_us(1);
IIC_SCL()=1;
IIC_SDA()=0;//
delay_us(1);
IIC_SDA()=1;//
void IIC_Wait_Ack()
{
u16 ucErrTime=0;
u8 RecAck;
SDA_IN();
IIC_SCL()=0;
IIC_SDA()=1;
delay_us(1);
IIC_SCL()=1;
delay_us(2);
while (READ_SDA())
{
ucErrTime++;
if (ucErrTime>=500)
{
IIC_Stop();
return;
}
}
IIC_SCL()=0;
delay_us(1);
return;
}
void IIC_Ack()
{
// IIC_SCL()=0;
SDA_OUT();
IIC_SDA()=0;
IIC_SCL()=0;
delay_us(1);
IIC_SCL()=1;
delay_us(1);
IIC_SCL()=0;
delay_us(1);
}
void IIC_NAck( )
{
SDA_OUT();
IIC_SCL()=0;
IIC_SDA()=1;
delay_us(1);
IIC_SCL()=1;
delay_us(1);
IIC_SCL()=0;
}
void IIC_Send_Byte(u8 txd )
{
u8 t;
SDA_OUT();
IIC_SCL()=0;
for(t=0;t<8;t++)
{
delay_us(1);
IIC_SDA() = (txd&0x80)>>7;
txd<<=1;
IIC_SCL()=1;
delay_us(2);
IIC_SCL()=0;
}
IIC_Wait_Ack();
}
u8 IIC_Read_Byte( )
{
unsigned char i,receive=0;
SDA_OUT();
IIC_SDA()=1;
SDA_IN();//
for(i=0;i<8;i++ )
{
IIC_SCL()=1;
delay_us(1);
receive<<=1;
if(READ_SDA())receive++;
IIC_SCL()=0;
delay_us(1);
}
return receive;
}
麻烦有没有大神指点一二。
|
|