注册 登录
查看: 464|回复: 5

山外哥的库硬件IIC使用L3G4200D模块问题

[复制链接]
发表于 2014-12-4 22:16:55 | 显示全部楼层 |阅读模式
本帖最后由 CP19940613 于 2014-12-4 22:18 编辑

各位大神,小弟今天用L3G4200D的时候发现K60硬件IIC读取数据有点问题,如果陀螺仪不动,读取值的会有一些波动,如果晃动陀螺仪读出来的值就全1成65535了,不知道有没有用L3G4200D的亲,你们的L3G4200D有没有这个情况啊?
我把我的代码贴出来希望用过L3G4200D的大神看看有什么问题
。h
  1. #ifndef __L3G4200D_H__
  2. #define __L3G4200D_H__


  3. #define     L3G4200D_DEVICE          I2C0        //定义L3G4200D 所用的接口 为 I2C1
  4. #define     L3G4200D_ADRESS          (0x69)      /*L3G4200D_Device Address*/
  5. //**********L3G4200D内部寄存器地址*********
  6. #define WHO_AM_I 0x0F//设备识别寄存器
  7. #define CTRL_REG1 0x20
  8. #define CTRL_REG2 0x21
  9. #define CTRL_REG3 0x22
  10. #define CTRL_REG4 0x23
  11. #define CTRL_REG5 0x24
  12. #define REFERENCE 0x25
  13. #define OUT_TEMP 0x26
  14. #define STATUS_REG 0x27
  15. #define OUT_X_L 0x28
  16. #define OUT_X_H 0x29
  17. #define OUT_Y_L 0x2A
  18. #define OUT_Y_H 0x2B
  19. #define OUT_Z_L 0x2C
  20. #define OUT_Z_H 0x2D
  21. #define FIFO_CTRL_REG 0x2E
  22. #define FIFO_SRC_REG 0x2F
  23. #define INT1_CFG 0x30
  24. #define INT1_SRC 0x31
  25. #define INT1_TSH_XH 0x32
  26. #define INT1_TSH_XL 0x33
  27. #define INT1_TSH_YH 0x34
  28. #define INT1_TSH_YL 0x35
  29. #define INT1_TSH_ZH 0x36
  30. #define INT1_TSH_ZL 0x37
  31. #define INT1_DURATION 0x38

  32. extern void L3G4200D_Init(void);                        //初始化L3G4200D
  33. extern void L3G4200D_ReadData(void);               //读L3G4200D寄存器
  34. extern int16 L3G4200D_ReadData_X(void);               
  35. extern int16 L3G4200D_ReadData_Y(void);               
  36. extern int16 L3G4200D_ReadData_Z(void);               


  37. #endif  //__L3G4200D_H__
。c
  1. #include "common.h"
  2. #include "MK60_i2c.h"
  3. #include "L3G4200D.h"

  4. //宏定义调用底层的I2C接口
  5. #define L3G4200D_INIT(baud)      i2c_init(L3G4200D_DEVICE,baud)
  6. #define L3G4200D_WR(reg,Data)    i2c_write_reg(L3G4200D_DEVICE,L3G4200D_ADRESS,reg,Data)  //L3G4200D 写寄存器
  7. #define L3G4200D_RD(reg)         i2c_read_reg(L3G4200D_DEVICE,L3G4200D_ADRESS,reg)             //L3G4200D 读寄存器

  8. int8 BUF[6] = {0};
  9. int16 T_X,T_Y,T_Z;

  10. void L3G4200D_Init(void)
  11. {
  12.    L3G4200D_INIT(400*1000);//初始化L3G4200D接口,设置波特率 400k
  13.    
  14.    L3G4200D_WR(CTRL_REG1, 0x0f);// 数据输出频率400Hz,低通110Hz     //0xff(800hz)   
  15.    L3G4200D_WR(CTRL_REG2, 0x00); // 高通0.2Hz
  16.    L3G4200D_WR(CTRL_REG3, 0x08);
  17.    L3G4200D_WR(CTRL_REG4, 0x30);//+-500dps 0x10   +-2000dps 0x30  //选择量程  满量程选择(默认 00)(00:250dps)
  18.    L3G4200D_WR(CTRL_REG5, 0x00);//FIFO使能,高通滤波使能    默认全0
  19. }

  20. void L3G4200D_ReadData(void)
  21. {
  22.    BUF[0]=L3G4200D_RD(OUT_X_L);
  23.    BUF[1]=L3G4200D_RD(OUT_X_H);
  24.    T_X=  (BUF[1]<<8)|BUF[0];

  25.    BUF[2]=L3G4200D_RD(OUT_Y_L);
  26.    BUF[3]=L3G4200D_RD(OUT_Y_H);
  27.    T_Y=  (BUF[3]<<8)|BUF[2];
  28.   
  29.    BUF[4]=L3G4200D_RD(OUT_Z_L);
  30.    BUF[5]=L3G4200D_RD(OUT_Z_H);
  31.    T_Z=  (BUF[5]<<8)|BUF[4];
  32. }

  33. int16 L3G4200D_ReadData_X(void)
  34. {
  35.    BUF[0]=L3G4200D_RD(OUT_X_L);
  36.    BUF[1]=L3G4200D_RD(OUT_X_H);
  37.    T_X=  (BUF[1]<<8)|BUF[0];
  38.    return T_X;
  39. }

  40. int16 L3G4200D_ReadData_Y(void)
  41. {
  42.    BUF[2]=L3G4200D_RD(OUT_Y_L);
  43.    BUF[3]=L3G4200D_RD(OUT_Y_H);
  44.    T_Y=  (BUF[3]<<8)|BUF[2];
  45.    return T_Y;
  46. }

  47. int16 L3G4200D_ReadData_Z(void)
  48. {
  49.    BUF[4]=L3G4200D_RD(OUT_Z_L);
  50.    BUF[5]=L3G4200D_RD(OUT_Z_H);
  51.    T_Z=  (BUF[5]<<8)|BUF[4];
  52.    return T_Z;
  53. }














回复

使用道具 举报

发表于 2014-12-4 22:19:50 | 显示全部楼层
I2C 的管脚,底层 初始化的时候,改成开漏输出。
另外降低一下I2C的波特率看看。

还有检查意思是不是接触不良导致的。这问题很坑爹。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 22:24:50 | 显示全部楼层
sestpqwnkm 发表于 2014-12-4 22:19
I2C 的管脚,底层 初始化的时候,改成开漏输出。
另外降低一下I2C的波特率看看。

降低波特率有时候反而程序卡在IIC了,只能400k
我用的是最新的库,应该开漏了
接触不良的话就不知道了,我都弄一周了,还是解决不了,郁闷啊,都不想做了
回复 支持 反对

使用道具 举报

发表于 2014-12-4 22:27:12 | 显示全部楼层
CP19940613 发表于 2014-12-4 22:24
降低波特率有时候反而程序卡在IIC了,只能400k
我用的是最新的库,应该开漏了
接触不良的 ...

那就改成用软件I2C 吧。
飞思卡尔的硬件I2C,跟STM32的硬件I2C一样,让人操心啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-4 22:28:28 | 显示全部楼层
sestpqwnkm 发表于 2014-12-4 22:27
那就改成用软件I2C 吧。
飞思卡尔的硬件I2C,跟STM32的硬件I2C一样,让人操心啊。

哦,好吧,我再弄弄,谢谢了
回复 支持 反对

使用道具 举报

发表于 2014-12-4 22:56:04 | 显示全部楼层
实在不行就自己模拟吧。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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