智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1468|回复: 2
打印 上一主题 下一主题

关于MPU6050. 求助啊!!!!!!!!!!!!

[复制链接]

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
威望
173
贡献
125
兑换币
112
注册时间
2012-12-10
在线时间
22 小时
毕业学校
哈工程
跳转到指定楼层
1#
发表于 2014-3-7 20:39:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MPU返回值一直都是257        求各路大神指点迷津
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
威望
173
贡献
125
兑换币
112
注册时间
2012-12-10
在线时间
22 小时
毕业学校
哈工程
2#
 楼主| 发表于 2014-3-7 20:41:16 | 只看该作者
此楼贴程序
IIC.c
#include "common.h"
#include "IIC.h"

//****************************
//IIC初始化函数
//****************************

void IIC_init( u8 MoudleNum )
  {
    I2C_MemMapPtr num = IIC_get_base_address(  MoudleNum );            //获取iic模块地址
   
    if( num == I2C0 )
       {
         SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;         //打开I2C0模块时钟;
         //配置引脚复用为I2C0功能
         PORTD_PCR9 = PORT_PCR_MUX( 2 );           //i2c SCL 使用PTD8
         PORTD_PCR8 = PORT_PCR_MUX( 2 );           //i2c SDA 使用PTD9
         I2C0_F = 0x65;                                   //分频?
         I2C0_C1 = I2C_C1_IICEN_MASK | I2C_C1_TXAK_MASK;  //使能I2C,不发送应答信号
       }
    else
      {
        SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;          //打开I2C1模块时钟;
         //配置引脚复用为I2C0功能
         PORTC_PCR10 = PORT_PCR_MUX( 2 );          //i2c SCL 使用PTC10
         PORTC_PCR11 = PORT_PCR_MUX( 2 );          //i2c SCL 使用PTC10
         I2C1_F = 0x65;                                   //分频?
         I2C1_C1 = I2C_C1_IICEN_MASK | I2C_C1_TXAK_MASK;  //使能I2C,不发送应答信号
      }  
      
  }

//*************************************
//根据需要产生开始或停止信号
//参数 :MoudleNum模块号 Signal:'S'开始 'O'结束
//BY         ZYQ 2014.3.6
//*************************************
void send_signal( u8 Signal , u8 MoudleNum )
   {
     I2C_MemMapPtr num = IIC_get_base_address(  MoudleNum );                   //获取i2c模块地址
     
     if( num == I2C0 )
       {
         if( Signal == 'S' )
            { IIC0_Start(); }
         else if ( Signal == 'O' )
            { IIC0_Stop(); }
       }
     
     else if ( num == I2C1 )
       {
         if( Signal == 'S' )
            { IIC1_Start(); }
         else if ( Signal == 'O' )
            { IIC1_Stop(); }
       }
   }

//***************************************
//作用 :在有限时间内,循环检测接受应答标志位,或传送完成标志位,判断MCU是否接受到应答信号或
//       一个字节是否已在总线上传输完毕
//参数 :MoudleNum模块号 ,
//       x x:'A'等待应答; 'T'等待一个字节数据传输完成
//BY    ZYQ  2014.3.6
//***************************************
u8 IIC_wait( u8 x , u8 MoudleNum )
   {
      u16 ErrTime , i ;
      I2C_MemMapPtr num = IIC_get_base_address(  MoudleNum );
      ErrTime = 255*10;                       //定义查询超时时限
      
      for( i = 0 ; i < ErrTime ; i++  )
           {
            if( x == 'A' )
              {
                if( (I2C_S_REG(num) & I2C_S_RXAK_MASK)  == 0 )
                   return 0;
              }
            else if( x == 'T' )
              {
                if( (I2C_S_REG(num) & I2C_S_IICIF_MASK)  != 0 )
                {
                  
                  return 0;
                }
             }
          }
      if( i >= ErrTime )
        return 1;
   }

//**************************************
//从从机读1字节
//参数 : u8 MoudleNum   模块号
//        u8 DeviceAddr 设备地址
//        u8 Accessaddr 访问地址
//        u8 *Data      带收到的1字节数据
//返回 : 0 成功 1 失败
//BY   ZYQ   2012.3.6
//**************************************
u8    IIC_read1( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 *Data )  
   {
     
     I2C_MemMapPtr num = IIC_get_base_address(  MoudleNum );
     I2C_C1_REG( num ) |= 0x10;
     send_signal( 'S' , MoudleNum );
     I2C_D_REG( num ) = DeviceAddr & 0xfe ;
     
     if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
     if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }
         
     I2C_D_REG( num ) =  AccessAddr;
      if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
      if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }  
         
     I2C_C1_REG( num ) |=  0x04 ;
     I2C_D_REG( num ) = DeviceAddr | 0x01 ;
      if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
      if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }
         
     I2C_C1_REG( num ) &= 0xfe;  
     *Data = I2C_D_REG( num );
     if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
     send_signal( 'O' , MoudleNum  );
     *Data = I2C_D_REG( num );
      return 0;
   }

//*********************************************
//向从机写一字节
//参数 : u8 MoudleNum   模块号
//        u8 DeviceAddr 设备地址
//        u8 Accessaddr 访问地址
//        u8 *Data      带收到的1字节数据
//返回 0 成功  1失败
//BY ZYQ 2014.3.6
//*********************************************
u8    IIC_write1( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data )
   {
     I2C_MemMapPtr num = IIC_get_base_address(  MoudleNum );
     I2C_C1_REG( num ) |= 0x10 ;
     send_signal( 'S' , MoudleNum );
     I2C_D_REG( num ) = DeviceAddr & 0xfe ;
     
     if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
      if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }
     
     I2C_D_REG( num ) =  AccessAddr;
     if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
      if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }
     
     I2C_D_REG( num ) =  Data ;
      if( IIC_wait( 'T' , MoudleNum ) )
       { return 1 ; }
      if( IIC_wait( 'A' , MoudleNum ) )
       { return 1 ; }
      
      send_signal( 'O' , MoudleNum );
      return 0 ;
   }


//***************************
//从从机读N个字节   
//***************************
u8  IIC_readN( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data[] , u8 N )
   {
     u16 i,j;
     for ( i=0 ; i<N ; i++ )
      {
       for( j=0 ; j<15*40 ; j++ )
         if( IIC_read1( MoudleNum , DeviceAddr ,  AccessAddr+i ,  &Data[i] ) )
           return 1;
      }
     if( i>=N )
       return 0;
   }


//***************************
//向写机读N个字节   
//***************************
u8  IIC_writeN( u8 MoudleNum , u8 DeviceAddr , u8 AccessAddr , u8 Data[] , u8 N )
   {
     u16 i,j;
     for ( i=0 ; i<N ; i++ )
      {
       for( j=0 ; j<15*40 ; j++ )
         if( IIC_write1( MoudleNum , DeviceAddr ,  AccessAddr+i ,  Data[i] ) )
           return 1;
      }
     if( i>=N )
       return 0;
   }

//***************************
//获取I2C地址函数
//***************************
I2C_MemMapPtr IIC_get_base_address( u8 MoudleNum )
   {
    switch( MoudleNum )
    {
    case 0 :
      return I2C0_BASE_PTR; break;
    case 1 :
      return I2C1_BASE_PTR; break;
    }
   }
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
威望
173
贡献
125
兑换币
112
注册时间
2012-12-10
在线时间
22 小时
毕业学校
哈工程
3#
 楼主| 发表于 2014-3-8 13:34:40 | 只看该作者
求大神啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 20:49 , Processed in 0.069929 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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