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.

Compiler/MSP432P401R: MSP432P401R + I2C +TMP006

Part Number: MSP432P401R
Other Parts Discussed in Thread: TMP006

Tool/software: TI C/C++ Compiler

Hi fellows, 

I have some facing some problems  with interface on sensor TMP006, now I have done the I2C driver in CMSIS, the problem is in the TMP006 file, I can not configure the registers to make the conection with i2c protocol.

/*
 * I2C.c
 *
 *  Created on: Jan 31, 2018
 *      Author: biza
 */

#include "msp.h"
#include "I2C.h"


/* IRQHandler */
static volatile uint8_t * rtx_data;
static volatile int8_t status;

/*I2C MASTER CONFIGURATION PARAMETER*/
void I2C_setupDevice(void){
    /*SET SWRST*/
    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;                 /*SOFTWARE RESET ENABLE*/

    /*INITIALIZE EUSCI_B REGISTERS  */
    EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |                 /*REMAIN EUSCI IN RESET MODE*/
                      EUSCI_B_CTLW0_MODE_3 |                /*I2C MODE*/
                      EUSCI_B_CTLW0_MST |                   /*MASTER MODE*/
                      EUSCI_B_CTLW0_SYNC |                  /*SYNC MODE*/
                      EUSCI_B_CTLW0_SSEL__SMCLK;            /*SMCLK*/
    /*CONFIGURE PORTS*/
    I2C_PORT();
    /*RESET SWRST*/
    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;                 /*SOFTWARE RESET ENABLE*/
    /*ENABLE INTERRUPT*/
    I2C_enableInterrupt();
}

/*CONFIGURE I2C PIN PORT*/
void I2C_PORT(void){
    I2C_PxSEL0 |= I2C_SCL | I2C_SDA;                         /*CONFIGURE I2C_SCL(P6.5) & I2C_SDA(P6.4)*/
    I2C_PxSEL1 &= ~(I2C_SCL | I2C_SDA);                      /*RELEASE I2C_SCL(P6.5) & I2C_SDA(P6.4)*/
}

/*CONFIGURE I2C*/
void I2C_init(void){
/*INITIALIZE  EUSCI_B0 AND I2C MASTER TO COMUNICATE  WITH SLAVE DEVICE*/
    I2C_setupDevice();
}
/*ENABLE I2C MODULE TO START OPERATION*/
void I2C_enableInterrupt(void){
    EUSCI_B0->IE |= EUSCI_B_IE_BCNTIE |                     /*BYTE COUNT INTERRUPT ENABLE*/
                    EUSCI_B_IE_NACKIE |                     /*NOT-ACKNOWLEDGE INTERRUPT ENABLE*/
                    EUSCI_B_IE_TXIE0  |                     /*TRANSMIT INTERRUPT ENABLE 0*/
                    EUSCI_B_IE_RXIE0;                       /*RECEIVE INTERRUPT ENABLE 0*/

    /*ENABLE EUSCI_B0 INTERRUPT IN NVIC MODULE*/
    NVIC->ISER[0] = 1 << ((EUSCIB0_IRQn) & 31);

}

void I2C_frequency(void){
    EUSCI_B0->CTLW0 |=  EUSCI_B_CTLW0_SWRST;                /*SOFTWARE RESET ENABLE*/
    EUSCI_B0->BRW = 30;                                     /*BAUDERATE = SMCLK/30=100Khz*/
    EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;                /*SOFTWARE RESET RELEASED FOR OPERATION*/
    /*ENABLE INTERRUPT*/
    I2C_enableInterrupt();

}

void I2C_byteToProcess(uint8_t counter){
    EUSCI_B0->CTLW0 |=  EUSCI_B_CTLW0_SWRST;                /*SOFTWARE RESET ENABLE*/
    EUSCI_B0->TBCNT &= ~(EUSCI_B_TBCNT_TBCNT_MASK);         /*RESET COUNT TRESHOLD REGISTER*/
    EUSCI_B0->TBCNT = counter;                               /*NUMBER OF BYTES TO BE RECEIVED*/
    EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;                /*SOFTWARE RESET RELEASED FOR OPERATION*/
    /*ENABLE INTERRUPT*/
    I2C_enableInterrupt();
}

void I2C_setslave(uint8_t address, uint8_t r_w){
    /*SPECIFY SLAVE ADDRESS FOR I2C*/
    EUSCI_B0->I2CSA &= ~(EUSCI_B_I2CSA_I2CSA_MASK);         /*RESET SLAVE ADDRESS REGISTERS*/
    EUSCI_B0->I2CSA = address;                              /*I2C SLAVE ADRESS*/

    if(r_w){                                                /*READ*/
        EUSCI_B0->CTLW0 &= ~(EUSCI_B_CTLW0_TR);             /*RECEIVER*/
    }else{                                                  /*WRITE*/
        EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TR;                /*TRANSMITER*/
    }
}

int I2C_status(void){
    /*LOCAL DECLARATION*/
    int8_t oldStatus = status;
    /*PROGRAM STATEMENT*/
    status = 0;
    return oldStatus;
}

void I2C_setMode(void){
    EUSCI_B0->CTLW0 = (EUSCI_B0->CTLW0 & (~EUSCI_B_CTLW0_TR))|
                      EUSCI_B_CTLW0_TR ;
}

/*READ DATA FROM SENSOR*/
int I2C_readWrite(uint8_t r_w, uint8_t address, uint8_t *data, uint8_t length){

    while((EUSCI_B0->STATW & EUSCI_B_STATW_BBUSY));            /*WAIT UNTIL I2C BUS IS AVALIABLE*/
    rtx_data = data;
    status = 0;
    I2C_byteToProcess(length);                                 /*SET THE NUMBER OF BYTES TO SET*/
    I2C_setslave(address,r_w);                                 /*SET THE SLAVE ADDRESS IN WRITE OR READ MODE*/
    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTT;                    /*SEND I2C START SIGNAL*/
    /*IRQHANDLER*/
    __sleep();
    return I2C_status();                                       /*RETURN THE NUMBER OF BYTES PROCESSED*/
}
/*WRITE DATA TO SENSOR*/
int I2C_write(uint8_t address, uint8_t *data, uint8_t length){
    return I2C_readWrite(I2C_W, address, data, length);
}
/*READ DATA FROM SENSOR*/
int I2C_read(uint8_t address, uint8_t *data, uint8_t length){
    return I2C_readWrite(I2C_R, address, data, length);
}

/*INTERRUPT SERVICE ROUTINE*/
void EUSCIB0_IRQHandler(void){

    /*TRANSMIT*/
    if(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG0){
        /*HERE IS INCREMENTED*/
        EUSCI_B0->TXBUF = rtx_data[(EUSCI_B0->STATW & EUSCI_B_STATW_BCNT_MASK)>>EUSCI_B_STATW_BCNT_OFS];
        EUSCI_B0->IFG &= ~(EUSCI_B_IFG_TXIFG0);


    }
    /*RECEIVE*/
    if(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG0){

        EUSCI_B0->IFG &= ~(EUSCI_B_IFG_RXIFG0);
        /*HERE IT'S STUCK AT NUMBER  OF BYTES TO PROCESSED*/
        rtx_data[(EUSCI_B0->STATW & EUSCI_B_STATW_BCNT_MASK)>>EUSCI_B_STATW_BCNT_OFS] = EUSCI_B0->RXBUF;

    }
    /*NOT-ACKNOWLEDGE RECEIVED*/
    if (EUSCI_B0->IFG & EUSCI_B_IFG_NACKIFG) {

            EUSCI_B0->IFG &= ~ (EUSCI_B_IFG_NACKIFG);
            /*I2C STOP CONDITION*/
            EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_TXSTP;
            status = I2C_ERR;
            __low_power_mode_off_on_exit();
   }

    /*BYTE COUNTER*/
    if (EUSCI_B0->IFG & EUSCI_B_IFG_BCNTIFG) {

            EUSCI_B0->IFG &= ~(EUSCI_B_IFG_BCNTIFG);
            status = EUSCI_B0->TBCNT & EUSCI_B_TBCNT_TBCNT_MASK;
            __low_power_mode_off_on_exit();
    }
}


2867.I2C.h

/******************************************************************************/
/*        @TITLE : TMP006.c                                                   */
/*      @VERSION : 0                                                          */
/*     @CREATION : JANUARY 3, 2017                                            */
/* @MODIFICATION :                                                            */
/*      @AUTEURS : ANTONIO BIZA                                               */
/*    @COPYRIGHT : Copyright (c) 2017 ANTONIO BIZA                            */
/*      @LICENSE :                                                            */
/******************************************************************************/
#include "TMP006.h"
#include "I2C.h"
#include "math.h"

void TMP006_init(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/

    I2C_setslave(TMP006_SLAVE_ADDRESS);

    /* RESET TMP006 */
    I2C_write(TMP006_SLAVE_ADDRESS, TMP006_RST,REGISTER_LENGTH);
//int I2C_write(uint8_t address, uint8_t *data, uint8_t length)
    volatile int i;
    for (i=10000; i>0;i--);

    /* POWER-UP AND RE-ENABLE DEVICE */
    I2C_write(TMP006_SLAVE_ADDRESS, TMP006_POWER_UP | TMP006_CR_2,REGISTER_LENGTH);
}

int TMP006_readDeviceId(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006 */
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}

int TMP006_readObjectVoltage(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}

int TMP006_readAmbientTemperature(void)
{
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}


/*READS DATA FROM SENSOR AND CALCULATE THE OBJECT TEMPERATURE*/
long double TMP006_getTemp(void){
    volatile int Vobj = 0;
    volatile int Tdie = 0;
    static long double S0 = 0;          /* CALIBRATION CONSTANT FOR TMP006 */

    Vobj = TMP006_readDeviceId();

    /*READ THE OBJECT VOLTAGE*/
    Vobj = TMP006_readObjectVoltage();

    /*READ THE AMBIENT TEMPERATURE*/
    Tdie = TMP006_readAmbientTemperature();
    Tdie = Tdie >> 2;

    /*CALCULATE TMP006. THIS NEED TO BE REVIEWED AND CALIBRATED*/
    long double Vobj2 = (double)Vobj*.00000015625;
    long double Tdie2 = (double)Tdie*.03525 + 273.15;

    /*INITIALIZE CONSTANTS*/
    S0 = 6 * pow(10, -14);
    long double a1 = 1.75*pow(10, -3);
    long double a2 = -1.678*pow(10, -5);
    long double b0 = -2.94*pow(10, -5);
    long double b1 = -5.7*pow(10, -7);
    long double b2 = 4.63*pow(10, -9);
    long double c2 = 13.4;
    long double Tref = 298.15;

    /*CALCULATE VALUE*/
    long double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));
    long double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);
    volatile long double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);
    volatile long double Tobj = pow(pow(Tdie2,4) + (fObj/S),.25);
    Tobj = (9.0/5.0)*(Tobj - 273.15) + 32;

    /*RETURN OBJECT TEMPERATURE */
    return (Tobj);
}

tmp006.h

thanks in advance

**Attention** This is a public forum