智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5247|回复: 13
打印 上一主题 下一主题

K60 + L3G4200 LPLD 底层库

[复制链接]

16

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1390
威望
676
贡献
390
兑换币
411
注册时间
2013-10-7
在线时间
162 小时
毕业学校
湖北工业大学
跳转到指定楼层
1#
发表于 2014-1-9 20:39:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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,
器件地址应该是没写错的

25

主题

1474

帖子

0

精华

常驻嘉宾

freefly

Rank: 8Rank: 8

积分
5459

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
2762
贡献
1277
兑换币
1323
注册时间
2013-4-28
在线时间
710 小时
2#
发表于 2014-1-10 09:32:10 | 只看该作者
你的cs 和sa0 怎么连接的,我也读不对。。
回复 支持 反对

使用道具 举报

16

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1390
威望
676
贡献
390
兑换币
411
注册时间
2013-10-7
在线时间
162 小时
毕业学校
湖北工业大学
3#
 楼主| 发表于 2014-1-10 13:00:04 | 只看该作者
loveme06 发表于 2014-1-10 09:32
你的cs 和sa0 怎么连接的,我也读不对。。

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

使用道具 举报

5

主题

279

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2873

活跃会员奖章优秀会员奖章

威望
1009
贡献
680
兑换币
656
注册时间
2013-8-29
在线时间
592 小时
4#
发表于 2014-1-10 19:44:27 | 只看该作者
改成开漏试试
回复 支持 反对

使用道具 举报

16

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1390
威望
676
贡献
390
兑换币
411
注册时间
2013-10-7
在线时间
162 小时
毕业学校
湖北工业大学
5#
 楼主| 发表于 2014-1-11 13:06:53 | 只看该作者
箫剑酒仙 发表于 2014-1-10 19:44
改成开漏试试

管脚是开漏的啊
回复 支持 反对

使用道具 举报

5

主题

279

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2873

活跃会员奖章优秀会员奖章

威望
1009
贡献
680
兑换币
656
注册时间
2013-8-29
在线时间
592 小时
6#
发表于 2014-1-11 13:12:56 | 只看该作者
i2c_init_param.I2C_OpenDrainEnable = TRUE;
回复 支持 反对

使用道具 举报

5

主题

279

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2873

活跃会员奖章优秀会员奖章

威望
1009
贡献
680
兑换币
656
注册时间
2013-8-29
在线时间
592 小时
7#
发表于 2014-1-11 13:15:58 | 只看该作者
楼主会处理数据吗,就是用L3G4200和MMA7455算角度
回复 支持 反对

使用道具 举报

16

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1390
威望
676
贡献
390
兑换币
411
注册时间
2013-10-7
在线时间
162 小时
毕业学校
湖北工业大学
8#
 楼主| 发表于 2014-1-11 17:10:22 | 只看该作者
箫剑酒仙 发表于 2014-1-11 13:15
楼主会处理数据吗,就是用L3G4200和MMA7455算角度

数据都没有读出来额,怎么处理,现在先拿了个ENC03 试试 ,发现漂移好严重
回复 支持 反对

使用道具 举报

16

主题

49

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1390
威望
676
贡献
390
兑换币
411
注册时间
2013-10-7
在线时间
162 小时
毕业学校
湖北工业大学
9#
 楼主| 发表于 2014-1-11 17:37:56 | 只看该作者
箫剑酒仙 发表于 2014-1-11 13:12
i2c_init_param.I2C_OpenDrainEnable = TRUE;

{:soso_e105:}{:soso_e105:},
终于弄好了,感谢你啊!!!
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
威望
243
贡献
139
兑换币
160
注册时间
2013-4-7
在线时间
23 小时
毕业学校
曲靖师范
10#
发表于 2014-4-19 10:49:31 | 只看该作者
楼主怎么弄好的,我的也是读出错的数据
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-6 15:29 , Processed in 0.105827 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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