Other Parts Discussed in Thread: MSP430G2553
Tool/software: Code Composer Studio
hi all,
It is my first experience with MSP430G2553, and I am interfacing it with the Pmod nav 9-axis imu LSM9D1 and LPS25HB via 3-wires SPI. I have attached my code, I don't understand what is going wrong with this code the USCI A0 buffer keep showing 0xFF when I read the accelerometer address.
/*
* Accelerometer registers
*/
#define CRISTAL 16000000L
#define TICK (CRISTAL/1000/5 -1)
#define TICKSP (TICK/1000)
#define ACEL_ACT_THS 0x04 // ACTIVATE TRESHOLD REGISTERS, DEFAUT VALUE =0;
#define ACEL_ACT_DUR 0x05 // INACTIVITY DURATION REGISTERS, DEFAUT VALUE =0;
#define ACEL_INT_GEN_CFG_XL 0x06 // LINEAR ACCELERATION SENSOR INTERRUPT, DEFAUT VALUE=0000 0000;
#define ACEL_INT_GEN_THS_X_XL 0x07 // LINEAR ACCELERATION SENSOR INTERRUPT TRESHOLD REGISTER, X-AXIS INTERRUPT DEFAUT VALUE =0000 0000;
#define ACEL_INT_GEN_THS_Y_XL 0x08 // LINEAR ACCELERATION SENSOR INTERRUPT TRESHOLD REGISTER, Y-AXIS INTERRUPT DEFAUT VALUE =0000 0000;
#define ACEL_INT_GEN_THS_Z_XL 0x09 // LINEAR ACCELERATION SENSOR INTERRUPT TRESHOLD REGISTER, Z-AXIS INTERRUPT DEFAUT VALUE =0000 0000;
#define ACEL_INT_GEN_DUR_XL 0x0A // LINEAR ACCELERATION SENSOR INTERRUPT DURATION REGISTER, DEFAUT VALUE =0000 0000;
#define ACEL_REFERENCE_G 0x0B // ANGULAR RATE SENSOR REFRENCE VALUE REGISTER FOR DIGITAL HIGH PASS FILTER, DEFAUT VALUE = 0000 0000;
#define ACEL_INT1_CTRL 0x0C // INT1_A/G PIN CONTROL REGISTER. DEFAUT VALUE =0000 0000;
#define ACEL_INT2_CTRL 0x0D // INT2_A/G PIN CONTROL REGISTER. DEFAUT VALUE =0000 0000;
#define ACEL_WHO_AM_I 0x0F // WHO AM I REGISTER, DEFAUT VALUE = 0110 1000;
#define ACEL_CTRL_REG1_G 0x10 // ANGULAR RATE SENSOR CONTROL REGISTER1, ODR_G= 000; FS_G=00; BW_G=00;
#define ACEL_CTRL_REG2_G 0x11 // ANGULAR RATE SENSOR CONTROL REGISTER2, INT_SEL[1:0]=00, OUT_SEL[1:0]=00, DEFAULT VALUE = 0000 0000;
#define ACEL_CTRL_REG3_G 0x12 // ANGULAR RATE SENSOR CONTROL REGISTER3, LP_mode=0, HP_EN=0, HPCF_G[3:0]=000, DEFAULT VALUE = 0000 0000;
#define ACEL_ORIENT_CFG_G 0x13 // ANGULAR RATE SENSOR SIGN AND ORIENTATION REGISTER, DEFAUT VLAUE= 0000 0000; POSITIVE SIGN.
#define ACEL_INT_GEN_SRC_G 0x14 // ANGULAR RATE SENSOR INTERRUPT SOURCE REGISTER , DEFAUT VALUE =0000 0000; INTERRUPT ACTIVE
#define ACEL_OUT_TEMP_L 0x15 // TEMPERATURE DATA OUTPUT REGISTER, L AND H REGISTER TOGETHER EXPRESS A 16-BIT WORD IN TWO'S COMPLEMENT RIGHT- JUSTIFIED
#define ACEL_OUT_TEMP_H 0x16 // TEMPERATURE DATA OUTPUT REGISTER, L AND H REGISTER TOGETHER EXPRESS A 16-BIT WORD IN TWO'S COMPLEMENT RIGHT- JUSTIFIED
#define ACEL_STATUS_REG 0x17 // STATUS REGISTER, DEFAUT VALUE = 0000 0000;
#define ACEL_OUT_X_L_G 0x18 // ANGULAR RATE SENSOR PITCH AXIS (X) ANGULAR RATE OUTPUT REGISTER.(LOW) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_OUT_X_H_G 0x19 // ANGULAR RATE SENSOR PITCH AXIS (X) ANGULAR RATE OUTPUT REGISTER.(HIGH) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_OUT_Y_L_G 0x1A // ANGULAR RATE SENSOR ROLL AXIS (Y) ANGULAR RATE OUTPUT REGISTER.(LOW)THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_OUT_Y_H_G 0x1B // ANGULAR RATE SENSOR ROLL AXIS (Y) ANGULAR RATE OUTPUT REGISTER.(HIGH) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_OUT_Z_L_G 0x1C // ANGULAR RATE SENSOR YALL AXIS (Z) ANGULAR RATE OUTPUT REGISTER.(LOW) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_OUT_Z_H_G 0x1D // ANGULAR RATE SENSOR YALL AXIS (Z) ANGULAR RATE OUTPUT REGISTER.(HIGH)THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT
#define ACEL_CTRL_REG4 0x1E // CONTROL REGISTER 4 , DEFAUT VALUE =0011 1000
#define ACEL_CTRL_REG5_XL 0x1F // LINEAR ACCELERATION SENSOR CONTROL REGISTER 5; DEFAUT VALUE= 00111000;
/*
* GYROSCOPE REGISTER;
*/
#define GYRO_CTRL_REG6_XL 0x20 // LINEAR ACCELERATION SENSOR CONTROL REGISTER 6, DEFAUT VALUE =00000000
#define GYRO_CTRL_REG7_XL 0x21 // LINEAR ACCELERATION SENSOR CONTROL REGISTER 7, DEFAUT VALUE= 0XX00000, X-> DCF1,DCF0 ACCELEROMETER DIGITAL FILTER
#define GYRO_CTRL_REG8 0x22 // CONTROL REGISTER 8, DEFAUT VALUE = 0000 1000, SPI DEFAUT 0 FOR 4 WIRES / SPI DEFAUT 1 FOR 3 WIRES, BIT5 SIM,
#define GYRO_CTRL_REG9 0x23 // CONTROL REGISTER 9, DEFAUT VALUE = 0000 0000, BOTH I2C AND SPI ANABLE
#define GYRO_CTRL_REG10 0x24 // CONTROL REGISTER 10, DEFAUT VALUE = 0000 0000, ANGULAR RATE SENSOR AND LINEAR ACCELERATION SELF-TEST ENABLE
#define GYRO_INT_GEN_SRC_XL 0x25 // LINEAR ACCELERATION SENSOR INTERRUPT SOURCE REGISTER, DEFAUT VALUE= 0000 0000;
#define GYRO_STATUS_REG 0x26 // STATUS REGISTER, DEFAUT VALUE = 0000 0000;
#define GYRO_OUT_X_L_XL 0x27 // LINEAR ACCELERATION SENSOR X-AXIS OUTPUT REGISTER.(LOW) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_OUT_X_H_XL 0x28 // LINEAR ACCELERATION SENSOR X-AXIS OUTPUT REGISTER.(HIGH) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_OUT_Y_L_XL 0x29 // LINEAR ACCELERATION SENSOR Y-AXIS OUTPUT REGISTER.(LOW) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_OUT_Y_H_XL 0x2A // LINEAR ACCELERATION SENSOR Y-AXIS OUTPUT REGISTER.(HIGH)THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_OUT_Z_L_XL 0x2B // LINEAR ACCELERATION SENSOR Z-AXIS OUTPUT REGISTER.(LOW) THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_OUT_Z_H_XL 0x2C // LINEAR ACCELERATION SENSOR Z-AXIS OUTPUT REGISTER.(HIGH)THE VALUE IS EXPRESSED AS A 16-BIT WORD IN TWO'S COMPLEMENT.
#define GYRO_FIFO_CTRL 0x2E // FIFO CONTROL REGISTER, DEFAUT VALUE = 0000 0000;
#define GYRO_FIFO_SRC 0x2F // FIFO STATUS CONTROL REGISTER, CHECK DATASHEET TO ACTIVATE:B FIFO TRESHOLD, FIFO OVERRUN STATUS, NUMBER OF UNREAD SAMPLES STORED INTO FIFO
#define GYRO_INT_GEN_CFG_G 0x30 // ANGULAR RATE SENSOR INTERRUPT GENERATOR CONFIGURATION REGISTER. DEFAUT VALUE = ;
#define GYRO_INT_GEN_THS_XH_G 0x31 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.X-AXIS(HIGH) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_THS_XL_G 0x32 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.X-AXIS(LOW) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_THS_YH_G 0x33 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.Y-AXIS(HIGH) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_THS_YL_G 0x34 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.Y-AXIS(LOW) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_THS_ZH_G 0x35 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.Z-AXIS(HIGH) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_THS_ZL_G 0x36 // ANGULAR RATE SENSOR INTERRUPT GENERATOR THRESHOLD REGISTERS.Z-AXIS(LOW) THE VALUE IS EXPRESSED AS A 15-BIT WORD IN TWO'S COMPLEMENT
#define GYRO_INT_GEN_DUR_G 0x37 // ANGULAR RATE SENSOR INTERRUPT GENERATOR DURATION REGISTER, DEFAUT VALUE= 0000 0000;
/*
* MAGNETOMETER REGISTERS
*/
#define MAGNET_OFFSET_X_REG_L_M 0x05 // 16-BIT REGISTER AND REPRESENTS THE X (LEFT) OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_OFFSET_X_REG_H_M 0x06 // 16-BIT REGISTER AND REPRESENTS THE X (HIGH)OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_OFFSET_Y_REG_L_M 0x07 // 16-BIT REGISTER AND REPRESENTS THE Y (LEFT)OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_OFFSET_Y_REG_H_M 0x08 // 16-BIT REGISTER AND REPRESENTS THE Y (HIGH)OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_OFFSET_Z_REG_L_M 0x09 // 16-BIT REGISTER AND REPRESENTS THE Z (LEFT)OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_OFFSET_Z_REG_H_M 0x0A // 16-BIT REGISTER AND REPRESENTS THE Z (HIGH)OFFESET USED TO COMPENSATE ENVIRONMENTAL EFFECTS( DATA IS EXPRESSED AS TWO'S COMPLEMENT), DEFAUT VALUE=0;
#define MAGNET_WHO_AM_I 0x0F // DEVIDE IDENTIFICATION REGISTER. DEFAUT VALUE = 00111101
#define MAGNET_CTRL_REG1_M 0x20 // CONTROL MAGNETOMETER REGISTER 1, DEFAUT VALUE = 0001 0000
#define MAGNET_CTRL_REG2_M 0x21 // CONTROL MAGNETOMETER REGISTER 2, DEFAUT VALUE = 0000 0000
#define MAGNET_CTRL_REG3_M 0x22 // CONTROL MAGNETOMETER REGISTER 3, DEFAUT VALUE = 0000 0011
#define MAGNET_CTRL_REG4_M 0x23 // CONTROL MAGNETOMETER REGISTER 4, DEFAUT VALUE = 0000 0000
#define MAGNET_CTRL_REG5_M 0x24 // CONTROL MAGNETOMETER REGISTER 5, DEFAUT VALUE = 0000 0000
#define MAGNET_STATUS_REG_M 0x27 // STATUS REGISTER, DEFAUT = 0000 0000;
#define MAGNET_OUT_X_L_M 0x28 // MAGNETOMETER X-AXIS DATA OUTPUT ,(LEFT) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_OUT_X_H_M 0x29 // MAGNETOMETER X-AXIS DATA OUTPUT ,(HIGH) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_OUT_Y_L_M 0x2A // MAGNETOMETER Y-AXIS DATA OUTPUT ,(LEFT) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_OUT_Y_H_M 0x2B // MAGNETOMETER Y-AXIS DATA OUTPUT ,(HIGH) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_OUT_Z_L_M 0x2C // MAGNETOMETER Z-AXIS DATA OUTPUT ,(LEFT) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_OUT_Z_H_M 0x2D // MAGNETOMETER Z-AXIS DATA OUTPUT ,(HIGH) THE VALUE OF THE MAGNETIC FIELD IS EXPRESSED AS TWO'S COMPLEMENT.
#define MAGNET_INT_CFG_M 0x30 //
#define MAGNET_INT_SFG_M 0x31 //
#define MAGNET_INT_THS_L_M 0x32 // INTERRUPT THRESHOLD. DEFAULT VALUE =0
#define MAGNET_INT_THS_H_M 0x33 // INTERRUPT THRESHOLD. DEFAULT VALUE =0
#define CS_OUTPUT P1OUT
#define CS_DIRECTOR P1DIR
#define TRX_BUFFER UCA0TXBUF
#define RX_BUFFER UCA0RXBUF
#define INT_REG IFG2
#define RX_IFG UCA0RXIFG
#define SPI_CTL0 UCA0CTL0
#define SPI_CTL1 UCA0CTL1
#define SPI_BR0 UCA0BR0
#define SPI_BR1 UCA0BR1
#define SPI_Modul UCA0MCTL
#define INPUT P1IN
#define OUTPUT P1OUT
#define DIRECTOR P1DIR
#define INTFLAG P1IFG
#define INTEDGESEL P1ES
#define SELECTION P1SEL
#define SELECTION2 P1SEL2
#define IRESISTOR P1REN
#define BasClkCtr1 BCSCTL1
#define DCOREGISTER DCOCTL
#define CALIBBSCTR1 CALBC1_16MHZ
#define CALIBDCO CALDCO_16MHZ
//#define EX_PIN BIT3
#define MISO BIT1
#define MOSI BIT2
#define SCK BIT4
#define CS BIT5 // chip select port b
#include <msp430.h>
//void espera_ms(unsigned short ms);
//void espera_us(unsigned short us);
unsigned char Readregister (unsigned char Address);
//unsigned char WriteToRegister( unsigned char Address, unsigned char data);
unsigned char Data;
//unsigned char RevID;
unsigned char Xaxis_data;
unsigned char Yaxis_data;
unsigned char Zaxis_data;
int lerz;
int data_array[10];
int main(void)
{
volatile unsigned int i;
//STOP WATCHDOG
WDTCTL = WDTPW + WDTHOLD;
// CLOCK SETTING - 16HZ
if (CALIBBSCTR1 == 0xFF && CALIBDCO ==0xFF)
while(1){
__delay_cycles(65000);
}
BasClkCtr1 = CALIBBSCTR1;
DCOREGISTER = CALIBDCO ;
//CHIP SELECT TO SELECT AND UNSELECT A CERTAIN REGISTER
CS_DIRECTOR|=CS;
CS_OUTPUT|= CS;
// HARDWARE CONNECTION
OUTPUT = 0x00; // P1 setup for LED & reset output
DIRECTOR |= BIT0 + BIT5; //
SELECTION = MISO|MOSI|SCK;
SELECTION2 = MISO|MOSI|SCK;;
//INITIALIZE SPI
SPI_CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
SPI_CTL1 |= UCSSEL_2; // SMCLK
SPI_BR0|= 0x02; // /2
SPI_BR1 = 0; //
SPI_Modul = 0; // No modulation
SPI_CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
INT_REG |= UCA0RXIE; // Enable USCI0 RX interrupt
OUTPUT &= ~BIT5; // Now with SPI signals initialized,
OUTPUT|= BIT5; // reset slave
__delay_cycles(2); // Wait for slave to initialize
Xaxis_data = Readregister (ACEL_OUT_X_L_G);
//lerz = Readregister (ACEL_OUT_Z_H_G);
Yaxis_data = Readregister (ACEL_OUT_Y_L_G);
//lerz = Readregister (ACEL_OUT_Z_H_G);
Zaxis_data = Readregister (ACEL_OUT_Z_L_G);
//lerz = Readregister (ACEL_OUT_Z_H_G);
// while (1)
// {
// lerz = Readregister (ACEL_OUT_Z_H_G);
// data_array[i]=lerz;
// i++;
// __delay_cycles(1);
// }
}
unsigned char Readregister (unsigned char Address){
unsigned char Result=0;
//Address <<=2;
CS_OUTPUT &=~CS;
TRX_BUFFER = Address;
Result = RX_BUFFER;
//1
__delay_cycles(1);
//while(!(INT_REG&RX_IFG))
TRX_BUFFER = 0x00;
Result = RX_BUFFER; //2
__delay_cycles(1);
//while (!(INT_REG&RX_IFG))
TRX_BUFFER = Address;
CS_OUTPUT|=CS;
Result = RX_BUFFER;
Result= Result<< 8;
/*
__delay_cycles(1);
//while(!(INT_REG&RX_IFG))
TRX_BUFFER = 0x00;
Result=Result&0x03fff;
if (Result&0x2000){
Result=Result|0xC000;
}*/
return Result;
}