OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4919|回复: 2

关于L3G4200的代码 的问题

[复制链接]

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-7-6
在线时间
0 小时
发表于 2013-11-24 14:34:20 | 显示全部楼层 |阅读模式

请问IIC代码有错嘛   就是读不出来   模块有8个脚 GND SDA  SCL VCC    另一边是SDOCS DR INT 要怎么连接啊  那几个脚要接VCC




****************************************************************************** */
void I2C_GPIO_Config(void)
{
GPIO_Init(PTA,24,GPIO_OUT,GPIO_HIGH);
GPIO_Init(PTA,25,GPIO_OUT,GPIO_HIGH);
}

/*******************************************************************************
* Function Name : I2C_delay
* Description   : Simulation IIC Timing series delay
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
   u8 i=30; //这里可以优化速度 ,经测试最低到5还能写入
   while(i) 
   { 
     i--; 
   }  
}

void delay5ms(void)
{
   int i=5000;  
   while(i) 
   { 
     i--; 
   }  
}
/*******************************************************************************
* Function Name : I2C_Start
* Description   : Master Start Simulation IIC Communication
* Input         : None
* Output         : None
* Return         : Wheather Start
****************************************************************************** */
u8 I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
//if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
//if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_Stop
* Description   : Master Stop Simulation IIC Communication
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
/*******************************************************************************
* Function Name : I2C_Ack
* Description   : Master Send Acknowledge Single
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}   
/*******************************************************************************
* Function Name : I2C_NoAck
* Description   : Master Send No Acknowledge Single
* Input         : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
/*******************************************************************************
* Function Name : I2C_WaitAck
* Description   : Master Reserive Slave Acknowledge Single
* Input         : None
* Output         : None
* Return         : Wheather Reserive Slave Acknowledge Single
****************************************************************************** */
u8 I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
      SCL_L;
 I2C_delay();
      return FALSE;
}
SCL_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_SendByte
* Description   : Master Send a Byte to Slave
* Input         : Will Send Date
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
{ SDA_H;}  
      else 
        SDA_L;   
        SendByte<<=1;
        I2C_delay();
SCL_H;
        I2C_delay();
    }
    SCL_L;
}  
/*******************************************************************************
* Function Name : I2C_RadeByte
* Description   : Master Reserive a Byte From Slave
* Input         : None
* Output         : None
* Return         : Date From Slave 
****************************************************************************** */
unsigned char I2C_RadeByte(void)  //数据从高位到低位//
    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
 SCL_H;
      I2C_delay();
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;
    return ReceiveByte;
//ZRX          
//单字节写入*******************************************

u8 Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)     //void
{
  if(!I2C_Start())return FALSE;
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//
I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址 
    if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
    I2C_SendByte(REG_Address );   //设置低起始地址      
    I2C_WaitAck();
    I2C_SendByte(REG_data);
    I2C_WaitAck();   
    I2C_Stop(); 
    delay5ms();
    return TRUE;
}

//单字节读取*****************************************
unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
{   unsigned char REG_data;    
if(!I2C_Start())return FALSE;
    I2C_SendByte(SlaveAddress); //
I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址 
    if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
    I2C_SendByte((u8) REG_Address);   //设置低起始地址      
    I2C_WaitAck();
    I2C_Start();
    I2C_SendByte(SlaveAddress+1);
    I2C_WaitAck();

REG_data= I2C_RadeByte();
    I2C_NoAck();
    I2C_Stop();
    //return TRUE;
return REG_data;

}      




 void Delay(u32 nCount)
{
  for(; nCount != 0; nCount--);
}

/*
********************************************************************************
** 函数名称 : void Delayms(vu32 m)
** 函数功能 : 长延时函数 m=1,延时1ms
** 输    入 : 无
** 输    出 : 无
** 返    回 : 无
********************************************************************************
*/
 void Delayms(u32 m)
{
  u32 i;
  
  for(; m != 0; m--)
       for (i=0; i<50000; i++);
}



 //************初始化L3G4200D*********************************
void Init_L3G4200D(void)
{
Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);
Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);
Single_Write(L3G4200_Addr,CTRL_REG4, 0x30); //+-2000dps
Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);
}
//******读取L3G4200D数据****************************************
void READ_L3G4200D(void)
{
   BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
   BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);
   T_X= (BUF[1]<<8)|BUF[0];
 


   BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);
   BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
   T_Y= (BUF[3]<<8)|BUF[2];
  

   BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
   BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
   T_Z= (BUF[5]<<8)|BUF[4];

}































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-24 16:47:57 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-7-6
在线时间
0 小时
 楼主| 发表于 2013-11-27 18:10:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我现在调出来以后变成GND引脚拔了以后再插上去 显示的数据才会变化  不然就算VCC拔了重插也没用 我真不知道啥情况
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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