智能车制作

标题: K60 + L3G4200 LPLD 底层库 [打印本页]

作者: 寻,路者    时间: 2014-1-9 20:39
标题: K60 + L3G4200 LPLD 底层库
  1. #ifndef __DEV_L3G4200_H__
  2. #define __DEV_L3G4200_H__

  3. #include "common.h"
  4. #include "HW_I2C.h"

  5. /********用户可修改值 开始***********/
  6. //连接L3G4200用到的I2C通道
  7. #define L3G4200_I2CX (I2C1)

  8. //连接L3G4200用到的SCL引脚
  9. #define L3G4200_SCLPIN (PTC10)

  10. //连接L3G4200用到的SDA引脚
  11. #define L3G4200_SDAPIN (PTC11)
  12. /********用户可修改值 结束***********/

  13. //定义SCL Bus Speed取值,外设总线为50Mhz时的计算结果
  14. #define L3G4200_SCL_50KHZ (0x33)
  15. #define L3G4200_SCL_100KHZ (0x2B)
  16. #define L3G4200_SCL_150KHZ (0x28)
  17. #define L3G4200_SCL_200KHZ (0x23)
  18. #define L3G4200_SCL_250KHZ (0x21)
  19. #define L3G4200_SCL_300KHZ (0x20)
  20. #define L3G4200_SCL_400KHZ (0x17)

  21. //=========MMA8451 功能参数==================//
  22. #define L3G4200_DEV_ADDR 0x69 //定义器件地址,可根据硬件修改
  23. #define L3G4200_DEV_WRITE 0xD2
  24. #define L3G4200_DEV_READ 0xD3
  25. #define L3G4200_DEV_ID 0xD3 //设备ID

  26. //L3G4200 内部寄存器地址
  27. #define WHO_AM_I 0x0F
  28. #define CTRL_REG1 0x20
  29. #define CTRL_REG2 0x21
  30. #define CTRL_REG3 0x22
  31. #define CTRL_REG4 0x23
  32. #define CTRL_REG5 0x24
  33. #define REFERENCE 0x25
  34. #define OUT_TEMP 0x26
  35. #define STATUS_REG 0x27
  36. #define OUT_X_L 0x28
  37. #define OUT_X_H 0x29
  38. #define OUT_Y_L 0x2A
  39. #define OUT_Y_H 0x2B
  40. #define OUT_Z_L 0x2C
  41. #define OUT_Z_H 0x2D


  42. //=========L3G4200 STATUS寄存器 寄存器位==================//
  43. #define L3G4200_STATUS_X_READY 0x01
  44. #define L3G4200_STATUS_Y_READY 0x02
  45. #define L3G4200_STATUS_Z_READY 0x04
  46. #define L3G4200_STATUS_XYZ_READY 0x08
  47. #define L3G4200_STATUS_X_OW 0x10
  48. #define ML3G4200_STATUS_Y_OW 0x20
  49. #define L3G4200_STATUS_Z_OW 0x40
  50. #define L3G4200_STATUS_XYZ_OW 0x80

  51. //函数声明
  52. uint8 L3G4200_Init(void);
  53. void L3G4200_WriteReg(uint8, uint8);
  54. uint8 L3G4200_ReadReg(uint8);
  55. int16 L3G4200_GetResult(uint8, uint8);

  56. #endif

  57. #include "dev_l3g4200.h"

  58. static void L3G4200_Delay(void);

  59. uint8 L3G4200_Init(void)
  60. {
  61. I2C_InitTypeDef i2c_init_param;
  62. uint8 device_id=0;

  63. //初始化L3G4200_I2CX
  64. i2c_init_param.I2C_I2Cx = L3G4200_I2CX ; //在DEV_L3G4200.h中修改该值
  65. i2c_init_param.I2C_IntEnable = FALSE;
  66. i2c_init_param.I2C_ICR = L3G4200_SCL_200KHZ; //可根据实际电路更改SCL频率
  67. i2c_init_param.I2C_SclPin = L3G4200_SCLPIN; //在DEV_MMA8451.h中修改该值
  68. i2c_init_param.I2C_SdaPin = L3G4200_SDAPIN; //在DEV_MMA8451.h中修改该值
  69. i2c_init_param.I2C_Isr = NULL;

  70. LPLD_I2C_Init(i2c_init_param);

  71. //读取设备ID
  72. device_id = L3G4200_ReadReg(WHO_AM_I);

  73. //进行寄存器配置
  74. L3G4200_WriteReg(CTRL_REG1, 0x0f); //100hz 0xff(800hz)
  75. L3G4200_WriteReg(CTRL_REG2, 0x00);
  76. L3G4200_WriteReg(CTRL_REG3, 0x08);
  77. L3G4200_WriteReg(CTRL_REG4, 0x30); //+-2000dps , Data LSB @ lower address
  78. L3G4200_WriteReg(CTRL_REG5, 0x00);

  79. return device_id ;
  80. }

  81. /*
  82. * L3G4200_WriteReg
  83. * 该函数用于配置L3G4200的寄存器
  84. *
  85. * 参数:
  86. * RegisterAddress
  87. * |__ L3G4200寄存器地址
  88. * Data
  89. * |__ 具体写入的字节型数据
  90. */
  91. void L3G4200_WriteReg(uint8 RegisterAddress, uint8 Data)
  92. {
  93. //发送从机地址
  94. LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);
  95. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  96. //写L3G4200寄存器地址
  97. LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
  98. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  99. //向寄存器中写具体数据
  100. LPLD_I2C_WriteByte(L3G4200_I2CX, Data);
  101. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  102. LPLD_I2C_Stop(L3G4200_I2CX);

  103. L3G4200_Delay();
  104. }

  105. /*
  106. * L3G4200_ReadReg
  107. * 该函数用于读取L3G4200的数据
  108. *
  109. * 参数:
  110. * RegisterAddress
  111. * |__ MMA8451寄存器地址
  112. * 返回值
  113. * 加速传感器的测量值
  114. */
  115. uint8 L3G4200_ReadReg(uint8 RegisterAddress)
  116. {
  117. uint8 result=0;

  118. //发送从机地址
  119. LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);
  120. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  121. //写L3G4200_I2CX寄存器地址
  122. LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
  123. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  124. //再次产生开始信号
  125. LPLD_I2C_ReStart(L3G4200_I2CX);

  126. //发送从机地址和读取位
  127. LPLD_I2C_WriteByte(L3G4200_I2CX , L3G4200_DEV_READ);
  128. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  129. //转换主机模式为读
  130. LPLD_I2C_SetMasterWR(L3G4200_I2CX, I2C_MRSW);

  131. //关闭应答ACK
  132. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK

  133. // Dummy read 虚假读取
  134. result =LPLD_I2C_ReadByte(L3G4200_I2CX);
  135. LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  136. //发送停止信号
  137. LPLD_I2C_Stop(L3G4200_I2CX);

  138. //读IIC数据
  139. result = LPLD_I2C_ReadByte(L3G4200_I2CX);

  140. L3G4200_Delay();

  141. return result;
  142. }

  143. /*
  144. * 函数功能:读L3G4200加速度输出
  145. * 参数?
  146. * Status - 数据寄存器状态
  147. * Regs_Addr - 数据寄存器地址
  148. * 函数返回值:加速度值(int16)
  149. */
  150. int16 L3G4200_GetResult(uint8 Status, uint8 Regs_Addr)
  151. {
  152. uint8 ret=0;
  153. uint16 cnt=0;
  154. int16 result,temp;

  155. // 等待转换完成并取出值

  156. while(!(ret&Status))
  157. {
  158. ret = L3G4200_ReadReg( STATUS_REG);
  159. if(++cnt>500)
  160. // break;
  161. ;
  162. }


  163. temp= L3G4200_ReadReg( Regs_Addr); //低字节数据
  164. result = L3G4200_ReadReg( Regs_Addr+1); //高字节
  165. result=result<<8;
  166. result=result|temp;

  167. return result;
  168. }


  169. /*
  170. * 延时函数
  171. */
  172. static void L3G4200_Delay(void){
  173. int n;
  174. for(n=1;n<200;n++) {
  175. asm("nop");
  176. }
  177. }
复制代码

求助,为什么不管我读什么寄存器,读回来的都是0xff,
器件地址应该是没写错的

作者: loveme06    时间: 2014-1-10 09:32
你的cs 和sa0 怎么连接的,我也读不对。。
作者: 寻,路者    时间: 2014-1-10 13:00
loveme06 发表于 2014-1-10 09:32
你的cs 和sa0 怎么连接的,我也读不对。。

全部接高,芯片手册认认真真看了啊,
拿M3的板子,模拟IIc就可以读出数据来,证明器件是好的啊
为嘛,K60的硬件IIC读不了L3G4200出来,但是却可以读MMA8451

作者: 箫剑酒仙    时间: 2014-1-10 19:44
改成开漏试试
作者: 寻,路者    时间: 2014-1-11 13:06
箫剑酒仙 发表于 2014-1-10 19:44
改成开漏试试

管脚是开漏的啊
作者: 箫剑酒仙    时间: 2014-1-11 13:12
i2c_init_param.I2C_OpenDrainEnable = TRUE;
作者: 箫剑酒仙    时间: 2014-1-11 13:15
楼主会处理数据吗,就是用L3G4200和MMA7455算角度
作者: 寻,路者    时间: 2014-1-11 17:10
箫剑酒仙 发表于 2014-1-11 13:15
楼主会处理数据吗,就是用L3G4200和MMA7455算角度

数据都没有读出来额,怎么处理,现在先拿了个ENC03 试试 ,发现漂移好严重
作者: 寻,路者    时间: 2014-1-11 17:37
箫剑酒仙 发表于 2014-1-11 13:12
i2c_init_param.I2C_OpenDrainEnable = TRUE;

{:soso_e105:}{:soso_e105:},
终于弄好了,感谢你啊!!!

作者: ghw103    时间: 2014-4-19 10:49
楼主怎么弄好的,我的也是读出错的数据
作者: ghw103    时间: 2014-4-19 10:50
你们用的库是哪家的
作者: 寻,路者    时间: 2014-4-21 10:59
ghw103 发表于 2014-4-19 10:49
楼主怎么弄好的,我的也是读出错的数据

lpld
作者: z~boy    时间: 2015-5-11 14:40
读取数据与加速度计反馈数值进行角度拟合,发现陀螺仪值存在一定延迟,楼主有碰到么
作者: HuangTao    时间: 2016-2-28 17:00
虽然是很久之前的帖子了,但我想问一下,一开始不是宏定义了很多地址吗,我想知道设备ID和从属地址有什么区别啊




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2