OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2673|回复: 1

l3g4200d 连续读多字节问题

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-7-14
在线时间
0 小时
发表于 2016-12-20 11:52:38 | 显示全部楼层 |阅读模式
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;
}

麻烦有没有大神指点一二。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-26 01:24:06 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 04:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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