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();
}
}
/******************************************************************************/
/* @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);
}
thanks in advance
