Hello! I'm using MSP-EXP432P401R Launchpad with a BME280 sensor (breakout board). I'm trying to communicate using I2C, but after successfully performing a read or write, the I2C bus remains busy. The sensor board has 10kohm pull-ups mounted and I've set the clock at 400kHz. I'm using MSP432 DriverLib v3.21.00.05.
E.g., I've tried reading the chip ID two times consecutively, but my function hangs in while(I2C_isBusBusy(EUSCI_B1_BASE)) when reading the second time. If I remove this loop, then I2C_masterSendSingleByteWithTimeout() returns 0. The code I'm using:
int main(void)
{
Clock_System_init();
MAP_Interrupt_enableSleepOnIsrExit();
MAP_Interrupt_enableMaster(); // Enabling MASTER interrupts
Timer32_sleep(1000000);
I2C_init();
Timer32_sleep(1000000);
char result;
I2C_setslave(0x76); // BME280_SLAVE_ADDRESS
if (!I2C_read8(0xD0, &result, 1000)) //BME280_REGISTER_CHIPID
return false;
if (result != 0x60) // Wrong chip ID
return false;
I2C_setslave(0x76); // BME280_SLAVE_ADDRESS
if (!I2C_read8(0xD0, &result, 1000)) //BME280_REGISTER_CHIPID
return false;
if (result != 0x60) // Wrong chip ID
return false;
while(1) {};
}
const eUSCI_I2C_MasterConfig i2cConfig =
{
EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
6000000, // SMCLK = 6MHz
EUSCI_B_I2C_SET_DATA_RATE_400KBPS, // Desired I2C Clock of 400khz
0, // No byte counter threshold
EUSCI_B_I2C_NO_AUTO_STOP // No Autostop
};
void I2C_init(void)
{
/* Select I2C function for I2C_SCL(P6.5) & I2C_SDA(P6.4) */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P6, GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION);
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P6, GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION);
/* Initialize USCI_B0 and I2C Master to communicate with slave devices*/
I2C_initMaster(EUSCI_B1_BASE, &i2cConfig);
/* Disable I2C module to make changes */
I2C_disableModule(EUSCI_B1_BASE);
/* Enable I2C Module to start operations */
I2C_enableModule(EUSCI_B1_BASE);
return;
}
/***************************************************************************//**
* @brief Reads data from the sensor
* @param pointer Address of register to read from
* @return Register contents
******************************************************************************/
bool I2C_read8(unsigned char pointer, char * result, unsigned int timeout)
{
while(I2C_isBusBusy(EUSCI_B1_BASE));
/* Set master to transmit mode PL */
I2C_setMode(EUSCI_B1_BASE,
EUSCI_B_I2C_TRANSMIT_MODE);
/* Clear any existing interrupt flag PL */
I2C_clearInterruptFlag(EUSCI_B1_BASE,
EUSCI_B_I2C_TRANSMIT_INTERRUPT0);
/* Initiate start and send first character */
if (!I2C_masterSendSingleByteWithTimeout(EUSCI_B1_BASE,
pointer, timeout))
return 0;
*result = I2C_masterReceiveSingleByte(EUSCI_B1_BASE);
return 1;
}I've attached my I2C .c and .h files hoping that someone could reproduce the problem.
I've tried using the example "BOOSTXL-SENSORS_SensorGUI_MSP432P401R", but without success, because the program hangs in the following code from readI2C():
while(ui8Status == eUSCI_BUSY)
{
if(MAP_I2C_getInterruptStatus(EUSCI_B1_BASE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0))
{
ui8Status = eUSCI_IDLE;
}
}Does anybody know what is the problem?
(Please visit the site to view this file)(Please visit the site to view this file)