用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);
}
}