guessyou 发表于 2014-3-19 10:51:52

求助,msp430与mpu9150之间iic通信运行出错

本帖最后由 guessyou 于 2014-3-19 11:10 编辑

在用iic在msp430和mpu9150陀螺仪之间通信,先用Jtag调试的时候,单步或者全速运行都可以正确读取陀螺仪的数据;
拔掉Jtag后,让单片机自己跑程序也可以正确运行;
但如果此时将电路板断电重新上电复位后(Jtag仍未连接)iic读出来的数据就全变成了0XFF。。

有木有人遇到过这么奇葩的情况啊,本来想可能是调试的时候延时和单片机自己跑的时候不一样,但是加了很多延时也没用,而且在没重新复位前断开jtag程序自己结果还是正确的,求各位大侠给给意见~

后来在网上查有人说是因为调试时用的是Jtag的时钟 reset后的时钟可能不对 但是我的程序里串口还是正常运行的 这样一来也不是时钟的问题吧?

程序:
#include<msp430f2274.h>
#include"main.h"

#include "IIC.h"
#include"BTuart.h"

//#define RESIZE 20   // UART receive area /Byte
//#define Char_ADC_Size 146//shall change to 145
//#define Char_ADC_Page_Size 730    //5*146=730
//#define SE_Size 7

//extern unsigned char Char_ADC;
#define NOP()                                __asm("nop")

#define IICSDA                (0x01<<3)
#define IICSCL                (0x01<<4)
#define IICINT                        (0x01<<0)

#define sdain P2DIR &= (~IICSDA)        //P2.4输入
#define sdaout P2DIR |= IICSDA        //P2.4输出
#define sclh P2OUT |= IICSCL
#define scll P2OUT &= (~IICSCL)
#define sdah P2OUT |= IICSDA
#define sdal P2OUT &= (~IICSDA)
#define sdav (P2IN>>3 & 0x01)

void init_IIC()
{
//        P1DIR |= IICINT;                        //P1.0输出
//        P1OUT &= (~IICINT);                //MPU_INT
        P2DIR |= IICSCL;                 //P2.3 MPU_SCL输出
}

/////////24C08读写驱动程序////////////////////
//void flash()
//{NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
// NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
//NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
//   NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
//   NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
//      NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
//   NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();

//}

void delay_kus( unsigned int k )
{
while(k--)
{NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();};

}

void x24c01_init()//24c08初始化子程序
{sdaout; sclh; delay_kus(10); sdah; delay_kus(10);}

void start()      //启动I2C总线
{sdaout; sdah; sclh; delay_kus(10); sdal; delay_kus(10); scll; delay_kus(10);
}

void stop()         //停止I2C总线
{sdaout;sdal; sclh; delay_kus(10); sdah; delay_kus(10);scll;delay_kus(10);sclh;}

void SendAck(unsigned char Ack)
{
    sdaout;
    if(Ack)
    {
      sdah;
    }
    else
    {
      sdal;
    }
    //ack (0:ACK 1:NACK)
    sclh; delay_kus(10);
    scll; delay_kus(10);
}
void ReadAck(void)
{   
    sdah;sdain;
    sclh; delay_kus(10);
    sdav;
//    while ((sdav==1)&&(i<200))i++;
//    while(sdav == 1);
    scll; delay_kus(10);
}
void writex(unsigned char j)//写一个字节
{unsigned char i;
   sdaout;
   for (i=0;i<8;i++)
   { if(j&0x80) sdah; else sdal;j <<= 1; sclh; delay_kus(10);scll; delay_kus(10);}
   ReadAck();
}

unsigned char readx()   //读一个字节
{
   unsigned char i,j,k=0;
   sdah;
   sdain;
   delay_kus(10);
   for (i=0;i<8;i++)
   {
      //scll;
      //delay_kus(5);
      sclh;
      k <<=1;
      delay_kus(10);
      if (sdav==1) j=1;
      else j=0;
      k |= j;
      delay_kus(6);
      scll;
      delay_kus(10);
   }
    return(k);
}


cc1989summer 发表于 2014-3-19 10:57:00

检查下陀螺仪初始化是否正确

guessyou 发表于 2014-3-19 11:14:37

cc1989summer 发表于 2014-3-19 10:57
检查下陀螺仪初始化是否正确

陀螺仪好像是正确的 我用示波器看过陀螺仪的SDA和SCL,输出是有数据的 SDA不全是高电平哎╮(╯▽╰)╭
页: [1]
查看完整版本: 求助,msp430与mpu9150之间iic通信运行出错