[加速度/倾角传感器] 求教!MMA7455串口数据丢失问题。

xufei1990   2012-2-23 09:58 楼主

    用MSP430加速度传感器MMA7455数据传到上位机,MMA7455选2g模式。出现如下两个问题:

1、发现XYZ三轴读到数据手册不一样,Z是0到127而不是手册上的-63到63,XY横跨256并不关于256对称。

2、三个加速度数据是在串口助手上看的, XYZ数据通过MSP430依次发给电脑, 最奇怪加速度的X、Y、Z分别达到某一个位置时都会丢失数据,也就是XYZ数据顺序错位了,要说串行通讯问题吧,平时不丢数,只有当加速度达到几个特定位置换了四个新的MMA7455一样所以估计不是传感器问题。

    整个小组因为这个问题纠结好几天求教大神!

  下附程序:


MMA7455.h


#include "mylib.h"



#define MMA_CS 0
#define MMA_SDO 4
#define MMA_SDA 2
#define MMA_SCL 3

#define MMA_COM P1OUT
#define MMA_COMD P1DIR
#define MMA_COMI P1IN
#define MMA_COM_INIT MMA_COMD |= 0x0d

#define SET_MMA_CS MMA_COM |= (1<<MMA_CS) //CS --> P1_0
#define CLR_MMA_CS MMA_COM &= ~(1<<MMA_CS)
#define SET_MMA_SDO MMA_COM |= (1<<MMA_SDO) //MISO --> P1_4
#define CLR_MMA_SDO MMA_COM &= ~(1<<MMA_SDO)
#define SET_MMA_SDA MMA_COM |= (1<<MMA_SDA) //MOSI --> P1_2
#define CLR_MMA_SDA MMA_COM &= ~(1<<MMA_SDA)
#define SET_MMA_SCL MMA_COM |= (1<<MMA_SCL) //SPK --> P1_3
#define CLR_MMA_SCL MMA_COM &= ~(1<<MMA_SCL)


#define MMA_SDO_INPUT MMA_COMD &= ~(1<<MMA_SDO) //让0向左移MMA_SD0(1)位和P1DIR与
#define MMA_SDO_OUTPUT MMA_COMD |= (1<<MMA_SDO) //让1向左移MMA_SD0(1)位和P1DIR或
#define RD_MMA_SDO (MMA_COMI&(1<<MMA_SDO))


void MMA_WR_Byte(uchar data);
uchar MMA_RD_Byte();
uchar MMA_RD_Data(uchar cmd);
void MMA_WR_Data(uchar cmd,uchar data);
void MMA7455_Init();


MMA7455.c



#include "MMA7455.h"


void MMA_WR_Byte(uchar data)
{
uchar i;
CLR_MMA_SCL;
for(i=0;i<8;i++)
{
if(data&0x80)//当data的最高位为1,则送进SDA一个1,当data最高位为0,则送进SDA一个0,SDA为P1OUT_bit.P2
{
SET_MMA_SDA;
}
else
{
CLR_MMA_SDA;
}
SET_MMA_SCL;
data <<= 1;
CLR_MMA_SCL;
}
}

uchar MMA_RD_Byte()
{
uchar data,i;
CLR_MMA_SCL;
for(i=0;i<8;i++)
{
data <<= 1;
SET_MMA_SCL;
if(RD_MMA_SDO)
{
data |= 0x01;
}
CLR_MMA_SCL; //SCL就是MOSI
}
return data;
}

uchar MMA_RD_Data(uchar cmd)
{
uchar data;
cmd &= 0x3f; //个人认为这句没什么用
CLR_MMA_CS; //片选MMA7455
MMA_WR_Byte((cmd<<1));
data = MMA_RD_Byte();
SET_MMA_CS;
return data;
}

void MMA_WR_Data(uchar cmd,uchar data)
{
cmd &= 0x3f; //cmd前两位清0
CLR_MMA_CS; //CS清0
MMA_WR_Byte((cmd<<1)+0x80);
MMA_WR_Byte(data);
SET_MMA_CS;
}

void MMA7455_Init()
{
MMA_COM_INIT;
MMA_SDO_INPUT;
SET_MMA_CS;
CLR_MMA_SCL;
}



main.c



#include "mylib.h"
#include "MMA7455.h"

#define x 0
#define y 1
#define z 2



void main()
{
uchar aa[3];
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

init_uart0();
  


MMA7455_Init();
MMA_WR_Data(0x16,0x15); //$16 Mode Control Register,选择2g和measuring mode
  
while(1)
{

aa[x] = MMA_RD_Data(0x06);//$06 8 bits output value X
aa[y] = MMA_RD_Data(0x07);//$07 8 bits output value Y
aa[z] = MMA_RD_Data(0x08);//$08 8 bits output value Z,将数据读到aa[3]数组中


_NOP();
   
R_S_Byte(aa[x]);
Delay_ms(10);


R_S_Byte(aa[y]);
Delay_ms(10);


R_S_Byte(aa[z]);
Delay_ms(500);

}
}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复