智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2413|回复: 5
打印 上一主题 下一主题

[编程类] LPLD库函数的I2C

[复制链接]

7

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
威望
217
贡献
99
兑换币
121
注册时间
2013-6-1
在线时间
36 小时
毕业学校
燕山大学
跳转到指定楼层
1#
发表于 2013-12-20 10:35:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
想用I2C写L3G4200但是不成功,读取那个寄存器都是0XD3···········把陀螺仪拔出来也是0xd3··········无语了····写入和读取

   /**
* --------------基于"拉普兰德K60底层库V3"的工程(LPLD_MAG3110)-----------------
* @file LPLD_MAG3110.c
* @version 0.2[By LPLD]
* @date 2013-10-3
* @brief 利用I2C模块,读取MAG3110三轴地磁传感器的值。
*
* 版权所有:北京拉普兰德电子技术有限公司
*
* mail:support@lpld.cn
* 硬件平台:  LPLD K60 Card / LPLD K60 Nano
*
* 本工程基于"拉普兰德K60底层库V3"开发,
* 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
* 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
* 底层库使用方法见相关文档。
*
*/
#include "common.h"
//包含MAG3110设备头文件
#include "L3G4200.h"

/****************************************
说明:
   *将MAG3110的SCL引脚连接开发板的PTB0引脚
    将MAG3110的SDA引脚连接开发板的PTB1引脚
    将MAG3110的VCC和GND分别接开发板的3V3和GND
   *将MiniUSB线插入RUSH Kinetis开发板的USB
    插座,并连接至电脑USB接口。
   *使用串口调试助手波特率设置为115200
   *使用串口调试助手查看运行结果
   *摆动MAG3110来观察输出值的变化
****************************************/

//*****************************************************************

//初始化L3G4200D,根据需要请参考pdf进行修改************************
uint8 InitL3G4200D()
{

  uint8 device_id;
  I2C_InitTypeDef i2c_init_param;

  //初始化MAG3110_I2CX
  i2c_init_param.I2C_I2Cx = L3G4200_I2CX;       //在DEV_MAG3110.h中修改该值
  i2c_init_param.I2C_ICR = L3G4200_SCL_400KHZ;  //可根据实际电路更改SCL频率
  i2c_init_param.I2C_SclPin = L3G4200_SCLPIN;   //在DEV_MAG3110.h中修改该值
  i2c_init_param.I2C_SdaPin = L3G4200_SDAPIN;   //在DEV_MAG3110.h中修改该值
  i2c_init_param.I2C_IntEnable = FALSE;
  i2c_init_param.I2C_Isr = NULL;
  i2c_init_param.I2C_OpenDrainEnable = FALSE;

  LPLD_I2C_Init(i2c_init_param);



  L3G4200_WriteReg(CTRL_REG1, 0xff);   //0000 1111   

  L3G4200_WriteReg(CTRL_REG2, 0x00);

  L3G4200_WriteReg(CTRL_REG3, 0x08);

  L3G4200_WriteReg(CTRL_REG4, 0x10);//量程 500

  L3G4200_WriteReg(CTRL_REG5, 0x00);




  device_id =L3G4200_ReadReg(WHO_AM_I);


  return device_id;


}

void L3G4200_WriteReg(uint8 RegisterAddress, uint8 Data)
{


  unsigned long int time_out;

  //发送从机地址
  LPLD_I2C_Start(L3G4200_I2CX);
  LPLD_I2C_WriteByte(L3G4200_I2CX, L3G4200_DEV_WRITE);
  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>60000) //如果等待超时,强行退出
      {
        printf("从机寻址超时");
        break;
      }
      else time_out++;
    }
    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;

  //写MAG3110寄存器地址
  LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>80000) //如果等待超时,强行退出
      {
        printf("写时写寄存器地址超时");
        break;
      }
      else time_out++;
    }
    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;

  //向寄存器中写具体数据
  LPLD_I2C_WriteByte(L3G4200_I2CX, Data);
  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>80000) //如果等待超时,强行退出
      {
        printf("写数据超时");
        break;
      }
      else time_out++;
    }
    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;

  LPLD_I2C_Stop(L3G4200_I2CX);

  L3G4200_Delay(); L3G4200_Delay();
}



uint8 L3G4200_ReadReg(uint8 RegisterAddress)
{
  uint8 result;
  unsigned long int time_out;

  //发送从机地址
  LPLD_I2C_Start(L3G4200_I2CX);
  LPLD_I2C_WriteByte(L3G4200_I2CX,L3G4200_DEV_WRITE);
  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>60000) //如果等待超时,强行退出
      {
        printf("从机寻址超时");
        break;
      }
      else time_out++;
    }

    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;


  //写MAG3110寄存器地址
   LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);

  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>80000) //如果等待超时,强行退出
      {
        printf("读时写寄存器地址超时");
        break;
      }
      else time_out++;
    }
    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;




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


  LPLD_I2C_WriteByte(L3G4200_I2CX, L3G4200_DEV_READ);//发送从机地址和读取位
  while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
    {
      if(time_out>60000) //如果等待超时,强行退出
      {
        printf("从机重启超时");
        break;
      }
      else time_out++;
    }
    L3G4200_I2CX->S |= I2C_S_IICIF_MASK;



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

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


  //读IIC数据
  result =LPLD_I2C_ReadByte(L3G4200_I2CX);
  //关闭应答ACK
  //LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK
  //result =LPLD_I2C_ReadByte(L3G4200_I2CX);

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

  L3G4200_Delay(); L3G4200_Delay();

  return result;

}




void L3G4200_Delay(void)
{
  int n;
  for(n=1;n<1000;n++) {
    asm("nop");
  }
}

3

主题

93

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5358
威望
2674
贡献
1678
兑换币
1593
注册时间
2012-11-17
在线时间
503 小时
毕业学校
0.0.
2#
发表于 2013-12-21 00:47:04 | 只看该作者
对于K60 I2C 鄙人甚是无语 先后试过 野火底层 拉普兰德底层 官方底层 自己修改的底层 均无果 楼上还是用模拟i2c吧
回复

使用道具 举报

7

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
威望
217
贡献
99
兑换币
121
注册时间
2013-6-1
在线时间
36 小时
毕业学校
燕山大学
3#
 楼主| 发表于 2013-12-21 23:15:06 | 只看该作者
InnerSong 发表于 2013-12-21 00:47
对于K60 I2C 鄙人甚是无语 先后试过 野火底层 拉普兰德底层 官方底层 自己修改的底层 均无果 楼上还是用模拟 ...

额····大哥您当时配置的时候是什么情况·····我读回来根本从机没有应答······
模拟的中间的延时感觉挺站CPU的····和直立有冲突···

回复

使用道具 举报

3

主题

93

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5358
威望
2674
贡献
1678
兑换币
1593
注册时间
2012-11-17
在线时间
503 小时
毕业学校
0.0.
4#
发表于 2013-12-22 00:50:59 | 只看该作者
对 我的也是应答问题 根本就不应答 勉强能读出来的时候 读回来的都是1 你要是弄好了 还是求指教 我的没冲突 单纯的i2c
回复

使用道具 举报

30

主题

135

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2019
威望
874
贡献
437
兑换币
516
注册时间
2013-1-13
在线时间
354 小时
5#
发表于 2014-1-3 14:28:51 | 只看该作者
同样卡在L3G4200上了 不知道咋回事啊 读ID一直0xff
回复

使用道具 举报

18

主题

479

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1766
威望
798
贡献
472
兑换币
524
注册时间
2014-1-1
在线时间
248 小时
毕业学校
lll
6#
发表于 2014-1-11 22:57:12 | 只看该作者
成功没有呢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 17:14 , Processed in 0.043054 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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