求助,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
检查下陀螺仪初始化是否正确
陀螺仪好像是正确的 我用示波器看过陀螺仪的SDA和SCL,输出是有数据的 SDA不全是高电平哎╮(╯▽╰)╭
页:
[1]