This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS: msp430g2553

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. 

can anyone help me with it?

/*
 * 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;

}

 

**Attention** This is a public forum