智能车制作

标题: LPLD库函数的I2C [打印本页]

作者: chwwdnop    时间: 2013-12-20 10:35
标题: LPLD库函数的I2C
想用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");
  }
}


作者: InnerSong    时间: 2013-12-21 00:47
对于K60 I2C 鄙人甚是无语 先后试过 野火底层 拉普兰德底层 官方底层 自己修改的底层 均无果 楼上还是用模拟i2c吧
作者: chwwdnop    时间: 2013-12-21 23:15
InnerSong 发表于 2013-12-21 00:47
对于K60 I2C 鄙人甚是无语 先后试过 野火底层 拉普兰德底层 官方底层 自己修改的底层 均无果 楼上还是用模拟 ...

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


作者: InnerSong    时间: 2013-12-22 00:50
对 我的也是应答问题 根本就不应答 勉强能读出来的时候 读回来的都是1 你要是弄好了 还是求指教 我的没冲突 单纯的i2c
作者: 博学日新    时间: 2014-1-3 14:28
同样卡在L3G4200上了 不知道咋回事啊 读ID一直0xff
作者: Sailing7    时间: 2014-1-11 22:57
成功没有呢




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