搜索
bottom↓
回复: 20

K60 + L3G4200 LPLD的库(已解决)

[复制链接]

出0入0汤圆

发表于 2014-1-10 13:14:12 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZJJ 于 2014-1-20 13:08 编辑
  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.   
  64.   //初始化L3G4200_I2CX
  65.   i2c_init_param.I2C_I2Cx = L3G4200_I2CX ;       //在DEV_L3G4200.h中修改该值
  66.   i2c_init_param.I2C_IntEnable = FALSE;
  67.   i2c_init_param.I2C_ICR = L3G4200_SCL_200KHZ;  //可根据实际电路更改SCL频率
  68.   i2c_init_param.I2C_SclPin = L3G4200_SCLPIN;   //在DEV_MMA8451.h中修改该值
  69.   i2c_init_param.I2C_SdaPin = L3G4200_SDAPIN;   //在DEV_MMA8451.h中修改该值
  70.   i2c_init_param.I2C_Isr = NULL;
  71.   
  72.   LPLD_I2C_Init(i2c_init_param);
  73.   
  74.     //读取设备ID
  75.   device_id = L3G4200_ReadReg(WHO_AM_I);
  76.   
  77.   //进行寄存器配置
  78.   L3G4200_WriteReg(CTRL_REG1, 0x0f);   //100hz    0xff(800hz)
  79.   L3G4200_WriteReg(CTRL_REG2, 0x00);   
  80.   L3G4200_WriteReg(CTRL_REG3, 0x08);
  81.   L3G4200_WriteReg(CTRL_REG4, 0x30);  //+-2000dps , Data LSB @ lower address
  82.   L3G4200_WriteReg(CTRL_REG5, 0x00);  
  83.   
  84.   return device_id ;
  85. }

  86. /*
  87. *   L3G4200_WriteReg
  88. *   该函数用于配置L3G4200的寄存器
  89. *
  90. *   参数:
  91. *   RegisterAddress
  92. *    |__ L3G4200寄存器地址
  93. *   Data
  94. *    |__ 具体写入的字节型数据
  95. */
  96. void  L3G4200_WriteReg(uint8 RegisterAddress, uint8 Data)
  97. {
  98.    //发送从机地址
  99.   LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);
  100.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);
  101.   
  102.   //写L3G4200寄存器地址
  103.   LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
  104.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);
  105.   
  106.   //向寄存器中写具体数据
  107.   LPLD_I2C_WriteByte(L3G4200_I2CX, Data);
  108.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  109.   LPLD_I2C_Stop(L3G4200_I2CX);
  110.    
  111.   L3G4200_Delay();
  112. }

  113. /*
  114. *   L3G4200_ReadReg
  115. *   该函数用于读取L3G4200的数据
  116. *
  117. *   参数:
  118. *     RegisterAddress
  119. *        |__ MMA8451寄存器地址
  120. *   返回值
  121. *      加速传感器的测量值
  122. */
  123. uint8 L3G4200_ReadReg(uint8 RegisterAddress)
  124. {
  125.   uint8 result=0;

  126.   //发送从机地址
  127.   LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);
  128.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  129.   //写L3G4200_I2CX寄存器地址
  130.   LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
  131.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  132.   //再次产生开始信号
  133.   LPLD_I2C_ReStart(L3G4200_I2CX);

  134.   //发送从机地址和读取位
  135.   LPLD_I2C_WriteByte(L3G4200_I2CX , L3G4200_DEV_READ);
  136.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

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

  139.   //关闭应答ACK
  140.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK

  141.   // Dummy read 虚假读取
  142.   result =LPLD_I2C_ReadByte(L3G4200_I2CX);  
  143.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  144.   //发送停止信号
  145.   LPLD_I2C_Stop(L3G4200_I2CX);

  146.   //读IIC数据
  147.   result = LPLD_I2C_ReadByte(L3G4200_I2CX);
  148.   
  149.   L3G4200_Delay();

  150.   return result;
  151. }

  152. /*
  153. * 函数功能:读L3G4200加速度输出
  154. * 参数
  155. *       Status - 数据寄存器状态
  156. *       Regs_Addr - 数据寄存器地址
  157. * 函数返回值:加速度值(int16)
  158. */   
  159. int16 L3G4200_GetResult(uint8 Status, uint8 Regs_Addr)
  160. {
  161.   uint8 ret=0;
  162.   uint16 cnt=0;
  163.   int16 result,temp;
  164.    
  165.   // 等待转换完成并取出值

  166.   while(!(ret&Status))
  167.   {
  168.     ret = L3G4200_ReadReg( STATUS_REG);
  169.     if(++cnt>500)
  170.     //  break;
  171.       ;
  172.   }

  173.   
  174.   temp= L3G4200_ReadReg( Regs_Addr);        //低字节数据
  175.   result  = L3G4200_ReadReg( Regs_Addr+1);  //高字节
  176.   result=result<<8;
  177.   result=result|temp;
  178.   
  179.   return result;
  180. }


  181. /*
  182. * 延时函数
  183. */
  184. static void L3G4200_Delay(void){
  185.   int n;
  186.   for(n=1;n<200;n++) {
  187.     asm("nop");
  188.   }
  189. }
复制代码










求救啊,为嘛我读出来的数据,全是0xFF ,
器件地址应该是对啊,LPLD 底层库有进行移位操作啊,器件也是好的
CS 和SA 都接的高
为嘛我读MMA8451可以读出来,读L3G4200 就读不出来

出0入0汤圆

发表于 2014-1-10 14:37:45 | 显示全部楼层
你可以参考一下L3G4200 的相关应用,检查一下不代码和这款芯片对应应用的区别。

出0入0汤圆

发表于 2014-1-10 14:39:41 | 显示全部楼层
看到其他地方一个建议操作,不过那边后来也没有回应,你可以试试看其他网友的建议操作。
“请将SDA管脚配置为open drain输出试试看看。
PortxPCR寄存器中ODE位。”

出0入0汤圆

 楼主| 发表于 2014-1-10 15:13:44 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-10 14:39
看到其他地方一个建议操作,不过那边后来也没有回应,你可以试试看其他网友的建议操作。
“请将SDA管脚配置 ...

刚看了下,那个引脚的开漏输出已经使能了啊在底层库里面
boolean ode = i2c_init_structure.I2C_OpenDrainEnable;

出0入0汤圆

发表于 2014-1-10 15:29:06 | 显示全部楼层
孤独stranger 发表于 2014-1-10 15:13
刚看了下,那个引脚的开漏输出已经使能了啊在底层库里面
boolean ode = i2c_init_structure.I2C_OpenDrai ...

只是其他网友的建议,
我没有用过LPLD库,既然飞思的加速度传感器可以使用,
建议你还是去看看这个L3G4200的一些典型应用,是不是外围,或者控制时序方面有差异。

出0入0汤圆

 楼主| 发表于 2014-1-10 17:23:25 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-10 15:29
只是其他网友的建议,
我没有用过LPLD库,既然飞思的加速度传感器可以使用,
建议你还是去看看这个L3G420 ...

之前拿M3的板子,用IO口模拟IIC,都可以读出来,现在不管是用M3的硬件IIC,还是K60的硬件IIC,配置的都可以读出其它IIC器件,就是读不出来L3G4200

出0入0汤圆

 楼主| 发表于 2014-1-11 13:12:25 | 显示全部楼层
,求解决方案啊

出0入0汤圆

发表于 2014-1-11 22:17:13 | 显示全部楼层

楼主现在怎么样; ,期待你能够采集出信号,分享经验。。我的也是不行啊,NEC-03 温漂的厉害啊。。

出0入0汤圆

发表于 2014-1-11 22:22:18 | 显示全部楼层
传几个资料,希望打什么可以帮忙解决一下,在此表示十分的感谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-1-13 09:06:22 | 显示全部楼层
孤独stranger 发表于 2014-1-10 17:23
之前拿M3的板子,用IO口模拟IIC,都可以读出来,现在不管是用M3的硬件IIC,还是K60的硬件IIC,配置的都可 ...

建议你可以把你的通信波形抓出来,然后资讯一下L3G4200公司的技术支持!

出0入0汤圆

 楼主| 发表于 2014-1-13 10:58:47 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2014-1-20 13:09 编辑
湛泸骏驰 发表于 2014-1-11 22:17
楼主现在怎么样; ,期待你能够采集出信号,分享经验。。我的也是不行啊,NEC-03 温漂的厉害啊。。 ...


现在搞定了,当时有人提出是SDA管脚要开漏,
我没仔细看,就以为它默认的是开漏
过了两天,我再仔细看,发现默认的是FALSE
改成TRUE就行了

出0入0汤圆

发表于 2014-1-13 13:35:23 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2014-1-13 13:37 编辑
孤独stranger 发表于 2014-1-13 10:58
现在搞定了,当时有人提出是SDA管脚要开漏,
我没仔细看,就以为它默认的是开漏
过了两天,我再仔细看, ...


恭喜楼主解决问题,同时也感谢你分享经验!
另外楼主如果问题解决了,请将标题加上“已解决”

出0入0汤圆

发表于 2014-1-13 13:56:25 | 显示全部楼层
孤独stranger 发表于 2014-1-13 10:58
现在搞定了,当时有人提出是SDA管脚要开漏,
我没仔细看,就以为它默认的是开漏
过了两天,我再仔细看, ...

一个不小心给烧了,哎。。你的程序仅仅只是加了一句   i2c_init_param.I2C_OpenDrainEnable=TRUE;  对吧。。谢谢了。

出0入0汤圆

 楼主| 发表于 2014-1-13 14:03:07 | 显示全部楼层
本帖最后由 孤独stranger 于 2014-1-13 14:11 编辑
湛泸骏驰 发表于 2014-1-13 13:56
一个不小心给烧了,哎。。你的程序仅仅只是加了一句   i2c_init_param.I2C_OpenDrainEnable=TRUE;  对吧 ...


额,有钱人啊,烧一个一百多啊!!
是的,就加那一句话就可以了

出0入0汤圆

发表于 2014-1-13 14:17:09 | 显示全部楼层
孤独stranger 发表于 2014-1-13 14:03
额,有钱人啊,烧一个一百多啊!!
是的,就加那一句话就可以了

我的这个没有那多,也心疼啊

出0入0汤圆

发表于 2014-1-13 18:35:32 | 显示全部楼层
之前我测VCC和GND他们是导通的 ,现在又,没有问题了,可以我的CS 一接3.3V 就冒烟,你遇到这样的问题了吗?

出0入0汤圆

 楼主| 发表于 2014-1-13 20:41:09 | 显示全部楼层
湛泸骏驰 发表于 2014-1-13 18:35
之前我测VCC和GND他们是导通的 ,现在又,没有问题了,可以我的CS 一接3.3V 就冒烟,你遇到这样的问题了吗 ...

木有发现这个问题额,我还以为你是主控板烧了呢,传感器烧了是小事

出0入0汤圆

发表于 2014-1-13 20:58:31 | 显示全部楼层
本帖最后由 湛泸骏驰 于 2014-1-13 21:27 编辑
  1. int16 resultx,resulty,resultz;
  2. uint8 device_id  ;
  3.   void delay(void)  ;


  4. void main (void)
  5. {

  6.    //初始化L3G4200D底层驱动及寄存器
  7. device_id=L3G4200_Init();

  8.   if(device_id==L3G4200_DEV_ID)
  9.   {
  10.     printf("L3G4200D init succeed!\r\n");
  11.     printf("Device ID :0x%X\r\n,device_id") ;
  12.   }
  13.   else
  14.   {
  15.     printf("L3G4200D Init failed !\r\n");
  16.     printf("Device ID :0x%x\r\n,device_id");
  17.     while(1);
  18.    
  19.   }
  20.   
  21.   while(1)
  22.   {
  23.     resultx=L3G4200_GetResult(L3G4200_STATUS_X_READY,OUT_X_L);
  24.     resulty=L3G4200_GetResult(L3G4200_STATUS_Y_READY,OUT_Y_L) ;
  25.     resultz=L3G4200_GetResult(L3G4200_STATUS_Z_READY,OUT_Z_L);
  26.     printf("XYZ:\t%d\t%d\t%d\r\n", resultx, resulty, resultz);
  27.   }
  28. }


  29. void delay(void)
  30. {
  31.    int16 i,n;
  32.    for (i=0;i<30000;i++)
  33.    {
  34.       for (n=0;n<200;n++)
  35.       {
  36.         asm("nop");
  37.       }
  38.    }
  39. }
  40.    
复制代码
孤独stranger 发表于 2014-1-13 20:41
木有发现这个问题额,我还以为你是主控板烧了呢,传感器烧了是小事


在CS 端接10K电阻后接3.3V没有冒烟,不接就会冒烟的,现在还是不能正确的读取ID
给看看是不是这里有问题呢,

我刚刚测了一下CS端的电压,电压比较低。但是如果我不在电路中串入电阻的话,传感器就会冒烟的,我是使用的lm117-3.3 V的稳压芯片。

出0入0汤圆

 楼主| 发表于 2014-1-14 12:53:11 | 显示全部楼层
湛泸骏驰 发表于 2014-1-13 20:58
在CS 端接10K电阻后接3.3V没有冒烟,不接就会冒烟的,现在还是不能正确的读取ID  
给看看 ...

悬空试试? 理论上直接接3.3V 是没有问题的,或者是你那块板子有问题

出0入0汤圆

发表于 2014-1-14 12:55:55 | 显示全部楼层
孤独stranger 发表于 2014-1-14 12:53
悬空试试? 理论上直接接3.3V 是没有问题的,或者是你那块板子有问题

等我的传感器到了,如果不行的话。在请教一下你哈。。

出0入0汤圆

发表于 2014-1-20 01:11:05 | 显示全部楼层
  1. /**
  2. * @file DEV_L3G4200D.h
  3. * @version 0.1[LUDSMARTCAR]
  4. * @date 2013-11-9
  5. * @brief L3G4200三轴陀螺仪设备驱动程序
  6. */

  7. #ifndef __DEV_L3G4200D_H__

  8. #define __DEV_L3G4200D_H__


  9. #include "common.h"

  10. #include "HW_I2C.h"


  11. /********用户可修改值 开始***********/

  12. //连接L3G4200用到的I2C通道

  13. #define L3G4200_I2CX    (I2C1)


  14. //连接L3G4200用到的SCL引脚

  15. #define L3G4200_SCLPIN  (PTC10)


  16. //连接L3G4200用到的SDA引脚

  17. #define L3G4200_SDAPIN  (PTC11)

  18. /********用户可修改值 结束***********/


  19. //定义SCL Bus Speed取值,外设总线为50Mhz时的计算结果

  20. #define L3G4200_SCL_50KHZ                   (0x33)
  21. #define L3G4200_SCL_100KHZ                  (0x2B)  

  22. #define L3G4200_SCL_150KHZ                  (0x28)

  23. #define L3G4200_SCL_200KHZ                  (0x23)

  24. #define L3G4200_SCL_250KHZ                  (0x21)

  25. #define L3G4200_SCL_300KHZ                  (0x20)

  26. #define L3G4200_SCL_400KHZ                  (0x17)  


  27. //=========MMA8451 功能参数==================//

  28. #define L3G4200_DEV_ADDR     0x69//0X68//0x69         //定义器件地址,可根据硬件修改

  29. #define L3G4200_DEV_WRITE    0xD2//0XD0//0xD2     

  30. #define L3G4200_DEV_READ     0XD3//0XD1//0xD3

  31. #define L3G4200_DEV_ID       0xD3    //设备ID


  32. //L3G4200 内部寄存器地址

  33. #define WHO_AM_I               0x0F

  34. #define CTRL_REG1              0x20

  35. #define CTRL_REG2         0x21

  36. #define CTRL_REG3         0x22

  37. #define CTRL_REG4         0x23

  38. #define CTRL_REG5         0x24

  39. #define REFERENCE         0x25

  40. #define OUT_TEMP          0x26

  41. #define STATUS_REG         0x27

  42. #define OUT_X_L         0x28

  43. #define OUT_X_H         0x29

  44. #define OUT_Y_L         0x2A

  45. #define OUT_Y_H         0x2B

  46. #define OUT_Z_L         0x2C

  47. #define OUT_Z_H         0x2D



  48. //=========L3G4200 STATUS寄存器 寄存器位==================//

  49. #define L3G4200_STATUS_X_READY   0x01

  50. #define L3G4200_STATUS_Y_READY   0x02

  51. #define L3G4200_STATUS_Z_READY   0x04

  52. #define L3G4200_STATUS_XYZ_READY 0x08

  53. #define L3G4200_STATUS_X_OW      0x10

  54. #define ML3G4200_STATUS_Y_OW     0x20

  55. #define L3G4200_STATUS_Z_OW      0x40

  56. #define L3G4200_STATUS_XYZ_OW    0x80


  57. //函数声明

  58. uint8  L3G4200_Init(void);

  59. void  L3G4200_WriteReg(uint8, uint8);

  60. uint8 L3G4200_ReadReg(uint8);

  61. int16 L3G4200_GetResult(uint8, uint8);


  62. #endif



  63. /**
  64. * @file DEV_L3G4200D.h
  65. * @version 0.1[LUDSMARTCAR]
  66. * @date 2013-11-9
  67. * @brief L3G4200三轴陀螺仪设备驱动程序
  68. */

  69. #include "DEV_L3G4200D.h"

  70. static void L3G4200_Delay(void);


  71. uint8 L3G4200_Init(void)

  72. {

  73.   I2C_InitTypeDef i2c_init_param;

  74.   uint8 device_id=0;  

  75.   

  76.   //初始化L3G4200_I2CX

  77.   i2c_init_param.I2C_I2Cx = L3G4200_I2CX ;       //在DEV_L3G4200.h中修改该值

  78.   i2c_init_param.I2C_IntEnable = FALSE;

  79.   i2c_init_param.I2C_ICR = L3G4200_SCL_200KHZ;  //可根据实际电路更改SCL频率

  80.   i2c_init_param.I2C_SclPin = L3G4200_SCLPIN;   //在DEV_MMA8451.h中修改该值

  81.   i2c_init_param.I2C_SdaPin = L3G4200_SDAPIN;   //在DEV_MMA8451.h中修改该值
  82.   
  83.   i2c_init_param.I2C_OpenDrainEnable=TRUE;

  84.   i2c_init_param.I2C_Isr = NULL;

  85.   

  86.   LPLD_I2C_Init(i2c_init_param);

  87.   

  88.     //读取设备ID

  89.   device_id = L3G4200_ReadReg(WHO_AM_I);

  90.   

  91.   //进行寄存器配置

  92.   L3G4200_WriteReg(CTRL_REG1, 0x0f);   //100hz    0xff(800hz)

  93.   L3G4200_WriteReg(CTRL_REG2, 0x00);   
  94.   L3G4200_WriteReg(CTRL_REG3, 0x08);
  95.   L3G4200_WriteReg(CTRL_REG4, 0x30);  //+-2000dps , Data LSB @ lower address

  96.   L3G4200_WriteReg(CTRL_REG5, 0x00);  

  97.   

  98.   return device_id ;

  99. }


  100. /*

  101. *   L3G4200_WriteReg

  102. *   该函数用于配置L3G4200的寄存器

  103. *

  104. *   参数:

  105. *   RegisterAddress
  106. *    |__ L3G4200寄存器地址

  107. *   Data

  108. *    |__ 具体写入的字节型数据
  109. */

  110. void  L3G4200_WriteReg(uint8 RegisterAddress, uint8 Data)

  111. {

  112.    //发送从机地址

  113.   LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);

  114.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  115.   

  116.   //写L3G4200寄存器地址

  117.   LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);

  118.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);

  119.   

  120.   //向寄存器中写具体数据

  121.   LPLD_I2C_WriteByte(L3G4200_I2CX, Data);

  122.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);


  123.   LPLD_I2C_Stop(L3G4200_I2CX);
  124.    
  125.    L3G4200_Delay();

  126. }


  127. /*

  128. *   L3G4200_ReadReg

  129. *   该函数用于读取L3G4200的数据

  130. *

  131. *   参数:

  132. *     RegisterAddress
  133. *        |__ MMA8451寄存器地址

  134. *   返回值

  135. *      加速传感器的测量值

  136. */

  137. uint8 L3G4200_ReadReg(uint8 RegisterAddress)

  138. {

  139.   uint8 result=0;


  140.   //发送从机地址

  141.   LPLD_I2C_StartTrans(L3G4200_I2CX,L3G4200_DEV_ADDR, I2C_MWSR);

  142.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);


  143.   //写L3G4200_I2CX寄存器地址

  144.   LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);

  145.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);


  146.   //再次产生开始信号

  147.   LPLD_I2C_ReStart(L3G4200_I2CX);


  148.   //发送从机地址和读取位

  149.   LPLD_I2C_WriteByte(L3G4200_I2CX , L3G4200_DEV_READ);

  150.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);


  151.   //转换主机模式为读

  152.   LPLD_I2C_SetMasterWR(L3G4200_I2CX, I2C_MRSW);


  153.   //关闭应答ACK

  154.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK


  155.   // Dummy read 虚假读取

  156.   result =LPLD_I2C_ReadByte(L3G4200_I2CX);  

  157.   LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_ON);


  158.   //发送停止信号

  159.   LPLD_I2C_Stop(L3G4200_I2CX);


  160.   //读IIC数据

  161.   result = LPLD_I2C_ReadByte(L3G4200_I2CX);

  162.   

  163.   L3G4200_Delay();
  164.   L3G4200_Delay();
  165.   L3G4200_Delay();

  166.   return result;

  167. }


  168. /*

  169. * 函数功能:读L3G4200加速度输出

  170. * 参数

  171. *       Status - 数据寄存器状态

  172. *       Regs_Addr - 数据寄存器地址

  173. * 函数返回值:加速度值(int16)

  174. */   

  175. int16 L3G4200_GetResult(uint8 Status, uint8 Regs_Addr)

  176. {

  177.   uint8 ret=0;

  178.   uint16 cnt=0;

  179.   int16 result,temp;

  180.    

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

  182.   while(!(ret&Status))
  183.   {

  184.     ret = L3G4200_ReadReg( STATUS_REG);

  185.     if(++cnt>500)

  186.     //  break;

  187.       ;

  188.   }


  189.   

  190.   temp= L3G4200_ReadReg( Regs_Addr);        //低字节数据

  191.   result  = L3G4200_ReadReg( Regs_Addr+1);  //高字节
  192.   result=result<<8;

  193.   result=result|temp;

  194.   

  195.   return result;

  196. }



  197. /*

  198. * 延时函数

  199. */

  200. static void L3G4200_Delay(void){

  201.   int n;

  202.   for(n=1;n<200;n++) {

  203.     asm("nop");

  204.   }

  205. }



  206. /**
  207. * --------------基于"拉普兰德K60底层库V3"的工程(L3G4200D)-----------------
  208. * @file L3G4200D.c
  209. * @version 0.0
  210. * @date 2013-9-29
  211. * @brief 关于该工程的描述
  212. *
  213. * 版权所有:北京拉普兰德电子技术有限公司
  214. * http://www.lpld.cn
  215. * mail:support@lpld.cn
  216. * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
  217. *
  218. * 本工程基于"拉普兰德K60底层库V3"开发,
  219. * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
  220. * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
  221. * 底层库使用方法见相关文档。
  222. *
  223. */
  224. #include "common.h"
  225. #include "DEV_L3G4200D.h"
  226. int16 resultx,resulty,resultz;
  227. uint8 device_id  ;
  228.   void delay(void)  ;


  229. void main (void)
  230. {

  231.    //初始化L3G4200D底层驱动及寄存器
  232. device_id=L3G4200_Init();

  233.   if(device_id==L3G4200_DEV_ID)
  234.   {
  235.     printf("L3G4200D init succeed!\r\n");
  236.     printf("Device ID :0x%X\r\n,device_id") ;
  237.   }
  238.   else
  239.   {
  240.     printf("L3G4200D Init failed !\r\n");
  241.     printf("Device ID :0x%x\r\n,device_id");
  242.     while(1);
  243.   }
  244.   
  245.   while(1)
  246.   {
  247.     resultx=L3G4200_GetResult(L3G4200_STATUS_X_READY,OUT_X_L);
  248.     resulty=L3G4200_GetResult(L3G4200_STATUS_Y_READY,OUT_Y_L) ;
  249.     resultz=L3G4200_GetResult(L3G4200_STATUS_Z_READY,OUT_Z_L);
  250.     printf("XYZ:\t%d\t%d\t%d\r\n", resultx, resulty, resultz);
  251.   }
  252. }


  253. void delay(void)
  254. {
  255.    int16 i,n;
  256.    for (i=0;i<30000;i++)
  257.    {
  258.       for (n=0;n<200;n++)
  259.       {
  260.         asm("nop");
  261.       }
  262.    }
  263. }
  264.    


复制代码


好人楼主,能给测试一下L3G4200D吗?我这里使用你的代码还是读不出ID 啊。新来的传感器。,。帮忙测一下,代码能否读取ID 吧,顺便给来张截图,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 07:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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