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.

TM4C123 + 430BOOST-TMP006

Other Parts Discussed in Thread: TMP006

Hi,


I'm triying get data from TMP006EVM via I2C, with eclipse, when reading values from the booster, always get the same result. I think the I2C reading code is wrong, but i'm not sure.


The code is adapted from:  https://github.com/adafruit/Adafruit_TMP006

(The relevant parts are in TMP6_Read16 and TMP6_Write16)

Here is the code:

/**
 ** TMP006 EVM + UART
 **
**/
#include <stdint.h>
#include <stdbool.h>

#include <inc/tm4c123gh6pge.h>
//#include <utils/ustdlib.h>

#include <inc/hw_memmap.h>
#include <inc/hw_types.h>
#include <inc/hw_nvic.h>

#include <driverlib/systick.h>
#include <driverlib/gpio.h>
#include <driverlib/pin_map.h>
#include <driverlib/sysctl.h>
#include <driverlib/debug.h>
#include <driverlib/i2c.h>
#include <driverlib/uart.h>
#include <driverlib/timer.h>

#include <utils/uartstdio.h>

#define SYSTICK_INT_PRIORITY 0x80

#include <inc/hw_ints.h>
#include <driverlib/interrupt.h>

#include "UART_TMP006.h"

void UARTIntHandler(void);


//#if POLLING == 0
void UARTIntHandler(void){}
//	uint32_t ui32Status;
//	// GET INSTERRUPT STATUS
//	ui32Status = UARTIntStatus(UART0_BASE, true);
//	// CLEAR ASSERTED INTERRUPTS
//	UARTIntClear(UART0_BASE, ui32Status);
//
//	// LOOP WHILE THERE ARE CHARS
//	while(UARTCharsAvail(UART0_BASE)){
//		// ECHO CHARACTER
//		UARTCharPutNonBlocking(UART0_BASE, UARTCharGetNonBlocking(UART0_BASE));
//		// BLINK LED
//		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
//		// DELAY ~1ms
//		SysCtlDelay(SysCtlClockGet() / (1000 * 3));
//		// TURN OFF LED
//		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x00);
//	}
//}
//#endif

int main(void);
void InitUART(void);
void InitI2C(void);
void InitLeds(void);
void InitBoardLeds(void);
void InitSysTick(void);
void InitTimer(void);
void BoardLeds(uint8_t);
void SysTickWait(uint32_t);
void SysTickWait_ms(uint32_t);

uint8_t TMP6_Start(void);
uint16_t TMP6_Read16(uint8_t);
void TMP6_Write16(uint8_t, uint16_t);

void InitUART(void){
	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
	GPIOPinConfigure(GPIO_PA0_U0RX);
	GPIOPinConfigure(GPIO_PA1_U0TX);
	GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
}

void InitI2C(void){
	// INITIALIZE I2C PERIPH 3
	SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

	I2CMasterInitExpClk(I2C3_BASE, SysCtlClockGet(), false);

	GPIOPinConfigure(GPIO_PD1_I2C3SDA);
	GPIOPinConfigure(GPIO_PD0_I2C3SCL);
	GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);
	GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
}

void InitLeds(void){
	// ENABLE LEDS
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
	GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); // LED PF1
}

void InitBoardLeds(void){
	// ENABLE BOARD LEDS
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
	GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3 | GPIO_PIN_2);
}

void InitSysTick(void){
	// DEFAULTS TO 1ms
	//uint32_t microsecs = F_CPU / SYSTICK_MHZ;
	//SysTickPeriodSet(microsecs * 1000);
	// 40000 > 0.001s > 1ms
	SysTickPeriodSet(40000);
    SysTickEnable();
    IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY);
    SysTickIntEnable();
}

void InitTimer(void){
	uint32_t ui32Period;
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
	TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);

	ui32Period = (SysCtlClockGet() / 2) / 2;
	TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period - 1);

	IntEnable(INT_TIMER0A);
	TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
	IntMasterEnable();

	TimerEnable(TIMER0_BASE, TIMER_A);
}

void SysTickWait(uint32_t delay){
    // 0x00FFFFFF > 16777215 > 0.42s(40MHZ)
 	// 120MHz > nS
    // 80MHz > 12.5nS
	// 40MHz > 25.nS
    // 16MHz > 62.5nS

    // FORCE RELOAD
    HWREG(NVIC_ST_CURRENT) = 0;
    // ENABLE SysTick
    SysTickEnable();
    uint32_t test = SysTickValueGet();
    for(uint32_t aux = 0; aux < delay; aux++) {
    	while (test > 0){
    		test = SysTickValueGet();
    		__asm__("NOP");
    	}

    }
}

void SysTickWait_ms(uint32_t delay){
	if (delay == 0) {
		SysTickWait(1);
	}
	SysTickWait(delay);
}

void BoardLeds(uint8_t onoff){
	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x8);
	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2, 0x4);
}

int main(void){
	// 400MHz > DEFAULT /2 > /5 > 40MHz
	// 40MHz SYSTEM CLOCK
	SysCtlClockSet(SYSCTL_SYSDIV_5 |SYSCTL_USE_PLL |
			SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

	InitUART();
	InitI2C();
	InitLeds();
	InitBoardLeds();
	InitSysTick();
	//InitTimer();


	UARTStdioConfig(0, 115200, 40000000);
//	// CONFIG UART
//	UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
//			UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
//
//	// ENABLE INTERRUPTS
//	IntMasterEnable();
//	// ENABLE UART INTERRUPTS
//	IntEnable(INT_UART0);
//	// ENABLE RX AND TX INTERRUPTS
//	UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
//

	UARTprintf("Hello world!\n");
	UARTprintf("\n");
	UARTprintf("%u", SysCtlClockGet());
	UARTprintf("\n");

	BoardLeds(0);
	uint8_t val;
	val = TMP6_Start();
	UARTprintf("TMP_START: "); UARTprintf("%u", val); UARTprintf("\n");
	while(true){}
}

uint8_t TMP6_Start(void){
	TMP6_Write16(TMP006_CONFIG, TMP006_CFG_MODEON | TMP006_CFG_DRDYEN | TMP006_CFG_16SAMPLE);

	uint16_t mid, did;
	mid = TMP6_Read16(TMP006_MANID);
	did = TMP6_Read16(TMP006_DEVID);

	#ifdef TMP006_DEBUG
		UARTprintf("mid = 0x"); UARTprintf("%X", mid); UARTprintf("\n");
		UARTprintf("did = 0x"); UARTprintf("%X", did); UARTprintf("\n");
	#endif

	if (mid != 0x5449) return 0;
	if (did != 0x67) return 0;

	return 1;
}

uint16_t TMP6_Read16(uint8_t u8Addr) {
	uint16_t u16Return;
	uint32_t u32Aux;

	// SENDS REGISTER ADDRESS TO READ FROM
	I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterDataPut(I2C3_BASE, u8Addr);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);
	while(I2CMasterBusy(I2C3_BASE)){}

	I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
	while(I2CMasterBusy(I2C3_BASE)){}
	u32Aux = I2CMasterDataGet(I2C3_BASE);

	u16Return = ((u32Aux<<8) | 0x0000FF00);

	//I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
	while(I2CMasterBusy(I2C3_BASE)){}
	u32Aux = I2CMasterDataGet(I2C3_BASE);

	u16Return |= u32Aux;

	return u16Return;
}

void TMP6_Write16(uint8_t u8Addr, uint16_t u16Data){
	// SENDS REGISTER ADDRESS TO READ FROM
	I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterDataPut(I2C3_BASE, u8Addr);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_START);
	while(I2CMasterBusy(I2C3_BASE)){}

	//
	//I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
	I2CMasterDataPut(I2C3_BASE, u16Data >> 8);
	while(I2CMasterBusy(I2C3_BASE)){}
	//I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);
	//while(I2CMasterBusy(I2C3_BASE)){}
	//
	//I2CMasterSlaveAddrSet(I2C3_BASE, TMP006_I2C_ADDR, true);
	I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
	I2CMasterDataPut(I2C3_BASE, u16Data);
	while(I2CMasterBusy(I2C3_BASE)){}
	//I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);
	//while(I2CMasterBusy(I2C3_BASE)){}

}

// SYSTICK ISR
void SysTickIntHanhdler(void) {
//	if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1)){
//		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PORTF_BASE & 0xfd); //SOLO LIMPIAR BIT 3 1000
//	} else {
//		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x02);
//	}
}

// TIMER0 ISR
void Timer0IntHandle(void){
	TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

	if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1)){
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PORTF_BASE & 0xfd);
	} else {
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0x02);
	}
}

Best regards

  • Hello Alex,

    In the TMP6_Read16 please replace the following

    I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_SEND);

    with

    I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_START);

    Also the result from the MSB read

    u16Return = ((u32Aux<<8) | 0x0000FF00);

    should be

    u16Return = ((u32Aux<<8) & 0x0000FF00);

    Regards

    Amit