5396|10

68

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

F28027模拟IIC程序驱动MPU3050陀螺 [复制链接]

如题,最近在调试F28027的模拟IIC程序,因为launchpad的SCI和IIC在同一引脚上,
所以想自己对照51和STM32的程序写模拟的IIC. 下面的程序是我移植过来的,
一些输入输出还针对DSP写了一些设置。反复对照51和STM32的模拟IIC,应该没有问题。
但是事实是死活调不好,接收到的数据一直显示是0.实在是郁闷。恳请大神解答。。。~~~~



/****************端口宏定义*****************/
#define SCL_OUT GpioDataRegs.GPADAT.bit.GPIO0      //
#define SCL_DIR GpioCtrlRegs.GPADIR.bit.GPIO0
#define SDA_DAT GpioDataRegs.GPADAT.bit.GPIO1
#define SDA_DIR GpioCtrlRegs.GPADIR.bit.GPIO1
/****************常量宏定义*****************/
#define TRUE    1
#define FALSE   0

void Init_IIC(void);
void Set_SDA_In(void);
void Set_SDA_Out(void);
void I2C_delay(void);
void I2C_delay_1(void);
unsigned char ACK_Check(void);
unsigned char Read_Byte(void);
void Write_Byte(unsigned char content);
void MPU3050_Write_Byte(unsigned char Adr,unsigned char Data);
unsigned char MPU3050_Read_Byte(unsigned char Adr);
void Init_MPU3050();
void READ_MPU3050(void);
/*----------------iic部分函数--------------------------*/
/*******************************************************************************
* Function Name  : I2C_delay
* Description    : Simulation IIC Timing series delay
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
// unsigned char i=10;
// while(i)
//{
//  i--;
// }
   DELAY_US(30);          //统一写在外面,便于调节延时时间
}
void I2C_delay_1(void)
{
//  unsigned char i=10;
//  while(i)
//  {
//   i--;
// }
    DELAY_US(10);
}
/*------------------------------------------*/
/*形式参数:void                */
/*返回值: void            */
/*函数描述:初始化24C02         */
/*------------------------------------------*/
void Init_IIC(void)
{
EALLOW;
SCL_DIR=1;                 
   SDA_DIR=1;
EDIS;
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:设置SDA引脚输入                 */
/*------------------------------------------*/
void Set_SDA_In(void)
{
   EALLOW;
   SDA_DIR=0;
   EDIS;
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:设置SDA引脚输出                 */
/*------------------------------------------*/
void Set_SDA_Out(void)
{
   EALLOW;
   SDA_DIR=1;
   EDIS;
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:完成IIC的起始条件操作            */
/*------------------------------------------*/
void Start_IIC(void)
{
//unsigned char i;
   SCL_OUT=1;
   SDA_DAT=1;
   I2C_delay();
  SDA_DAT=0;
   I2C_delay();
   SCL_OUT=0;
   I2C_delay();
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:完成IIC的终止条件操作            */
/*------------------------------------------*/
void Stop_IIC(void)
{
// unsigned char i;
   SDA_DAT=0;
   I2C_delay();
   SCL_OUT=1;
   I2C_delay();
   SDA_DAT=1;
   I2C_delay();
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:完成IIC的主机应答操作            */
/*------------------------------------------*/
void Master_ACK(void)
{
// unsigned char i;
   SDA_DAT=0;
   I2C_delay();
   SCL_OUT=1;
   I2C_delay();
   SCL_OUT=0;
   I2C_delay_1();
   SDA_DAT=1;
   I2C_delay();
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                    */
/*函数描述:完成IIC的主机无应答操作          */
/*------------------------------------------*/
void Master_NO_ACK(void)
{
//  unsigned char i;
   SDA_DAT=1;
   I2C_delay();
   SCL_OUT=1;
   I2C_delay();
   SCL_OUT=0;
   I2C_delay();
   SDA_DAT=0;
   I2C_delay();
}
/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:从机是否有应答:1--有,0--无       */
/*函数描述:检查从机的应答操作          */
/*------------------------------------------*/
unsigned char ACK_Check(void)
{
  unsigned char Slave_ACK;
   SDA_DAT=1;
   I2C_delay();
   SCL_OUT=1;
   I2C_delay();
   Set_SDA_In();
   I2C_delay();
   Slave_ACK = SDA_DAT;   //读入SDA数值
   SCL_OUT=0;
   I2C_delay();
   Set_SDA_Out();
   if(Slave_ACK==0)
    return TRUE;
   else
     return FALSE;
}
/*------------------------------------------*/
/*形式参数:content--发送的数据             */
/*返回值:void              */
/*函数描述:向IIC总线发送一个字节的数据      */
/*------------------------------------------*/
void Write_Byte(unsigned char content)
{
  unsigned char i;
   for(i = 8;i > 0;i--)
   {
     if((content&0x80)==0x80)
     {
        SDA_DAT=1;
        I2C_delay();
        SCL_OUT=1;
        I2C_delay();
        SCL_OUT=0;
        I2C_delay();
     }
     else
     {
        SDA_DAT=0;
        I2C_delay();
        SCL_OUT=1;
        I2C_delay();
        SCL_OUT=0;
        I2C_delay();
     }
  content <<= 1;
   }
   SDA_DAT=1;
   I2C_delay();
}
/*------------------------------------------*/
/*形式参数:void                */
/*返回值:读出的数据          */
/*函数描述:从IIC总线读一个字节的数据        */
/*------------------------------------------*/
unsigned char Read_Byte(void)
{
  unsigned char i,temp=0;
   for(i = 0;i < 8;i++)
   {
  Set_SDA_Out();
  SDA_DAT=1;
  SCL_OUT=1;
  I2C_delay();
  Set_SDA_In();
     if(SDA_DAT==1)
        temp |= (0x01 << (7-i));
     SCL_OUT=0;
  I2C_delay();
   }
Set_SDA_Out();
   return(temp);
}

/*------------------------------------------*/
/*形式参数:Adr--地址,Data--数据           */
/*返回值:void           */
/*函数描述:向指定地址写入一个字节的数据     */
/*------------------------------------------*/
void MPU3050_Write_Byte(unsigned char Adr,unsigned char Data)
{
unsigned char temp=0;
// unsigned int i;
int delay=10000;
   Start_IIC();//启用数据总线
   Write_Byte(MPU3050_Addr);//发送写命令
   temp=ACK_Check();//等待ACK
   if(temp==FALSE)
   {
     return;
   }
   Write_Byte(Adr);//发送指针寄存器
   temp=ACK_Check();//等待ACK
   if(temp==FALSE)
   {
     return;
   }
   Write_Byte(Data);//发送数据
   temp=ACK_Check();//等待ACK
   if(temp==FALSE)
   {
     return;
   }
   Stop_IIC();
   // for(i=0;i<10000;i++);//等待写入完成
   while(delay)
   {
    delay--;                      //还是换成while吧!
   }
   DELAY_US(30);            
}

/*------------------------------------------*/
/*形式参数:Adr--地址               */
/*返回值:从指定的地址读处的数据        */
/*函数描述:从指定地址读出一个字节的数据     */
/*------------------------------------------*/
unsigned char MPU3050_Read_Byte(unsigned char Adr)
{
unsigned char temp=0,r_data;
   Start_IIC();//启用数据总线
   Write_Byte(MPU3050_Addr);//发送写命令
   temp=ACK_Check();//等待ACK
   if(temp==FALSE)
   {
     return FALSE;
   }
   Write_Byte(Adr);//发送指针寄存器
   temp=ACK_Check();//等待ACK
   if(temp==FALSE)
   {
     return FALSE;
   }
Start_IIC();//启用数据总线
Write_Byte(MPU3050_Addr+1);//发送读命令
   temp=ACK_Check();//等ACK
   if(temp==FALSE)
   {
     return FALSE;
   }
r_data=Read_Byte();
Master_NO_ACK();
   Stop_IIC();
return r_data;
}


void Init_MPU3050()
{
   MPU3050_Write_Byte(PWR_M, 0x80);   //
   MPU3050_Write_Byte(SMPL, 0x07);   
   MPU3050_Write_Byte(DLPF, 0x1E);    //±2000°
   MPU3050_Write_Byte(INT_C, 0x00 );  //
   MPU3050_Write_Byte(PWR_M, 0x00);   //
}

void READ_MPU3050(void)
{
    BUF_3050[0]= MPU3050_Read_Byte(GX_L);
    BUF_3050[1]= MPU3050_Read_Byte(GX_H);
    T_X_3050=(BUF_3050[1]<<8)+BUF_3050[0];   //合成数据
    T_X_3050/=16.4;              //计算对应 度/秒
    BUF_3050[2]= MPU3050_Read_Byte(GY_L);
    BUF_3050[3]= MPU3050_Read_Byte(GY_H);
    T_Y_3050=(BUF_3050[3]<<8)+BUF_3050[2];   //合成数据
    T_Y_3050/=16.4;              //计算对应 度/秒
    BUF_3050[4]= MPU3050_Read_Byte(GZ_L);
    BUF_3050[5]= MPU3050_Read_Byte(GZ_H);
    T_Z_3050=(BUF_3050[5]<<8)+BUF_3050[4];     //合成数据
    T_Z_3050/=16.4;                //计算对应 度/秒
    Temp_h=MPU3050_Read_Byte(TMP_H); //读取温度
    Temp_l=MPU3050_Read_Byte(TMP_L); //读取温度
    T_T_3050=Temp_h<<8|Temp_l;     //合成温度
    T_T_3050 = 35+ ((double) (T_T_3050 + 13200)) / 280; // 计算出温度
}



实在是晕啊。。。。求解答。。。。。。

[ 本帖最后由 yue621 于 2013-9-5 21:25 编辑 ]

最新回复

我在论坛上已经发了一个调试过的例程了。  详情 回复 发表于 2013-9-9 08:27

点评

你最好将延时部分的函数贴出来,延时比较关键。  详情 回复 发表于 2013-9-5 23:30
 
点赞 关注

回复
举报

1万

帖子

25

TA的资源

裸片初长成(高级)

沙发
 
楼主首先看看硬件接法是否正确。有时候并非技术上的问题,或者因为疏忽而导致的。

第二对照IIC时序验证一下。有条件可以用分析仪捕捉一下。


launchpad的IC有两套输出脚可以分配的,最好使用它的内部资源,这样CPU干预的就少些。

点评

额。。。谢谢版主,觉得IO模拟容易移植啊。。。不过看样子很难找到原因啊。。。崩溃。。。。  详情 回复 发表于 2013-9-5 23:35
 
 

回复

290

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

回复 楼主yue621 的帖子

你最好将延时部分的函数贴出来,延时比较关键。

点评

就在最前面啊。。。用的系统自带的延时。。。。。。。。。  详情 回复 发表于 2013-9-5 23:33
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 板凳liuming759 的帖子

就在最前面啊。。。用的系统自带的延时。。。。。。。。。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 沙发dontium 的帖子

额。。。谢谢版主,觉得IO模拟容易移植啊。。。不过看样子很难找到原因啊。。。崩溃。。。。

点评

是DSP28X_usdelay()吗?这个延时与名字并非相同的。  详情 回复 发表于 2013-9-5 23:37
 
 
 

回复

290

帖子

0

TA的资源

纯净的硅(初级)

6
 

回复 5楼yue621 的帖子

是DSP28X_usdelay()吗?这个延时与名字并非相同的。

点评

或者求大神提供一个正确程序吧。。。实在是调崩溃了。。。。  详情 回复 发表于 2013-9-6 00:02
额。。。求详解?延时不是us?或是不够准确?非常感谢!  详情 回复 发表于 2013-9-5 23:52
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼liuming759 的帖子

额。。。求详解?延时不是us?或是不够准确?非常感谢!

点评

用示波器查看一下自己的延时即可,其他的则仿照EEPROM的时序即可。  详情 回复 发表于 2013-9-6 09:51
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 6楼liuming759 的帖子

或者求大神提供一个正确程序吧。。。实在是调崩溃了。。。。
 
 
 

回复

290

帖子

0

TA的资源

纯净的硅(初级)

9
 

回复 7楼yue621 的帖子

用示波器查看一下自己的延时即可,其他的则仿照EEPROM的时序即可。

点评

谢谢啦~~!!!!但是还是调不出来。跪求范例。TI官方用的STRUCT,看不太懂啊。。。。。:funk:  详情 回复 发表于 2013-9-8 23:27
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 9楼liuming759 的帖子

谢谢啦~~!!!!但是还是调不出来。跪求范例。TI官方用的STRUCT,看不太懂啊。。。。。

点评

我在论坛上已经发了一个调试过的例程了。  详情 回复 发表于 2013-9-9 08:27
 
 
 

回复

290

帖子

0

TA的资源

纯净的硅(初级)

11
 

回复 10楼yue621 的帖子

我在论坛上已经发了一个调试过的例程了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表