Other Parts Discussed in Thread: ADS1118
Hi Everyone,
I am working on an application, where I am interfacing ADS1118 EVM with EK-TM4C1294Xl.
Following is my configuraion
1) SPI2 module selected
SSI TX - PD1
SSI RX - PD0
SSI FSS - PD2
SSI CLK - PD3
I believe SSI interface is working fine.
2) Config register values sent
a) ADC mode : 0xBD0B
b) Temperature sensor mode : 0x8D1B
3) Converaion register got
a) ADC mode : 0x106
b) Temperature sensor mode : 0xBE8
4) After calculation:
a) ADC mode: 2mV : Hot junction of thermocouple dipped in hot water of temperature 66-degree celsius. Measured by thermal gun.
Formula used:
Didn't perform reverse of 2's complement. Bipolar value selected (2^15).
Voltage(mV) = (256 * conv_reg[0]) / 32768
b) Temperature sensor mode: 23-degree celsius : Thermal gun measurement 26/27-degree celsius.
Formula used:
Right shift to obtain 14 bit value.
Considering +/-0.03125 for final value.
I am not sure, whether I am getting correct values. Please guide me in right direction and let me know, If I am missing out any steps. My code is attached.
// //This program is used for interfacing ADS1118 temperature sensor to TM4C1294NCPDT microcontroller. //TM4C1294NCPDT microcontroller provides Quad Synchronous Serial Interface(SSI). // #include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/ssi.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "uartstdio.h" #define NUM_SSI_DATA 2 // //UART0 is configured to get debug logs. // void InitConsole(void) { // // Enable GPIO port A which is used for UART0 pins. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Configure the pin muxing for UART0 functions on port A0 and A1. // GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); // // Enable UART0 to configure the clock. // SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Using the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // // Select the alternate (UART) function for these pins. // GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 16000000); } int main(void) { uint32_t ui32SysClock; uint16_t config_reg[NUM_SSI_DATA]; uint16_t conv_reg[NUM_SSI_DATA]; uint16_t dummy; uint16_t temp; int index; int i = 1; uint16_t raw_data = 0; uint16_t bit_test; config_reg[0] = 0xbd0b; config_reg[1] = 0x8d1b; // //Sets clock source for SSI module. // ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC), 25000000); // // Sets the serial console to use for displaying messages. // InitConsole(); // // Display the setup on the console. // UARTprintf("SSI ->\n"); UARTprintf(" Mode: SPI with Polarity 0 and Phase 1\n"); UARTprintf(" Data: 16-bit\n\n"); SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); GPIOPinConfigure(GPIO_PD3_SSI2CLK); GPIOPinConfigure(GPIO_PD2_SSI2FSS); GPIOPinConfigure(GPIO_PD0_SSI2XDAT1); GPIOPinConfigure(GPIO_PD1_SSI2XDAT0); GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0); SSIConfigSetExpClk(SSI2_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, 2000000, 16); SSIEnable(SSI2_BASE); for(index = 0; index < NUM_SSI_DATA; index++){ while(SSIDataGetNonBlocking(SSI2_BASE, &conv_reg[index])) { } } SSIDataPut(SSI2_BASE, config_reg[0]); UARTprintf("ADC_MODE config register sent\n\n"); while(SSIBusy(SSI2_BASE)) { } while(1){ SysCtlDelay(5750000); if (i == 1) { SSIDataGet(SSI2_BASE, &dummy); UARTprintf("dummy data received\n"); i--; } SSIDataPut(SSI2_BASE, config_reg[1]); UARTprintf("TEMP_MODE config register is sent\n\n"); SSIDataGet(SSI2_BASE, &conv_reg[0]); UARTprintf("ADC_MODE data received is %x\n\n",conv_reg[0]); //conv_reg[0] = ~(conv_reg[0] - 1); temp = (256 * conv_reg[0]) / 32768; UARTprintf("Thermocouple voltage difference value is %dmV\n\n", temp); while(SSIBusy(SSI2_BASE)) { } SysCtlDelay(5750000); SSIDataPut(SSI2_BASE, config_reg[0]); UARTprintf("ADC_MODE configured\n"); SSIDataGet(SSI2_BASE, &conv_reg[1]); UARTprintf("TEMP_MODE data received is %x\n\n",conv_reg[1]); raw_data = conv_reg[1]; UARTprintf("raw data received as integer is %x\n", raw_data); raw_data = raw_data >> 2; UARTprintf("raw data received as integer is %x\n", raw_data); bit_test = raw_data; if((bit_test & 0x2000) == 1){ raw_data = raw_data - 0x01; raw_data = ~(raw_data); temp = (raw_data * (-0.03125)); UARTprintf("value in celsius is %d\n", temp); } else { temp = (raw_data * 0.03125); UARTprintf("value in celsius is %d\n", temp); } } }