Part Number: MSP432E401Y
I am trying to use the I2C bus and when I am calling the I2C transfer function, it is going into an infinite loop at
I2C_transfer(i2c, &i2cTransaction)
The function will occasionally return false if I move around the sensor a little bit, but most of the time it stays in that loop.
Here is my code, basically the same as the i2ctmp007 example program, but with the address and write/read changed.
/*
* Copyright (c) 2016-2017, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* ======== i2ctmp007.c ========
*/
#include <stdint.h>
#include <stddef.h>
#include <unistd.h>
#include <stdio.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/I2C.h>
#include <ti/display/Display.h>
/* Example/Board Header files */
#include "Board.h"
#define TASKSTACKSIZE 640
#define TMP007_DIE_TEMP 0x0001 /* Die Temp Result Register */
#define TMP007_OBJ_TEMP 0x0003 /* Object Temp Result Register */
static Display_Handle display;
/*
* ======== mainThread ========
*/
void *mainThread(void *arg0)
{
unsigned int i;
uint16_t temperature;
uint8_t readBuffer[5];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;
printf("main thread\n");
/* Call driver init functions */
Display_init();
GPIO_init();
I2C_init();
/* Configure the LED pin */
GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
/* Open the HOST display for output */
display = Display_open(Display_Type_UART, NULL);
if (display == NULL) {
while (1);
}
/* Turn on user LED */
GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
Display_printf(display, 0, 0, "Starting the i2ctmp007 example\n");
/* Create I2C for usage */
I2C_Params_init(&i2cParams);
i2cParams.bitRate = I2C_400kHz;
i2c = I2C_open(Board_I2C_TMP, &i2cParams);
if (i2c == NULL) {
Display_printf(display, 0, 0, "Error Initializing I2C\n");
while (1);
}
else {
Display_printf(display, 0, 0, "I2C Initialized!\n");
}
/* Changed from original program*/
i2cTransaction.slaveAddress = 0x40020800; //Address of the I2C Slave Own Address, according to the Documentation.
i2cTransaction.writeBuf = NULL;
i2cTransaction.writeCount = 0;
i2cTransaction.readBuf = readBuffer;
i2cTransaction.readCount = 5;
Display_printf(display, 0, 0, "down here1\n");
/* Take 20 samples and print them out onto the console */
for (i = 0; i < 20; i++) {
Display_printf(display, 0, 0, "down here2\n");
if (I2C_transfer(i2c, &i2cTransaction)) {
Display_printf(display, 0, 0, "down here3\n");
/* Extract degrees C from the received data; see TMP102 datasheet */
temperature = 0;
/*
* For simplicity, divide the temperature value by 32 to get rid of
* the decimal precision; see TI's TMP007 datasheet
*/
temperature /= 32;
Display_printf(display, 0, 0, "Sample %u: %d (C)\n", i, temperature);
}
else {
Display_printf(display, 0, 0, "I2C Bus fault\n");
}
/* Sleep for 1 second */
sleep(1);
}
/* Deinitialized I2C */
I2C_close(i2c);
Display_printf(display, 0, 0, "I2C closed!\n");
return (NULL);
}
I have connected the SCL pin of my sensor to PB2, and the SDA pin of my sensor to PB3, and the documentation I am using to figure out the address is below:
Documentation from www.ti.com/.../slasen5.pdf


