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.

MSP-EXP432P4111: I2C Communication not working

Part Number: MSP-EXP432P4111

Hi, 

I am having some issues with the basic stuff of I2C communication protocol on the MSP432. I am running a code in CCS for a basic master mode write function. This is my code at the moment:

MAIN.C

#include <I2CComm.h>
#include "msp.h"
#include <stdio.h>

void delayMs(int t);

void main(void){
I2C1_init();

while (1){
I2C1_Write(0x21, 0x14, 0x08);
delayMs(1000);
}
}

void delayMs(int t) {
int i, j;

for (j = 0; j < t; j++)
for (i = 750; i > 0; i--); /* Delay */
}



I2CComm.c

#include <I2CComm.h>
#include "msp.h"
#include <stdio.h>


/* initialize I2C to 100 kHz at 3 MHz system clock */
void I2C1_init()

{
EUSCI_B0->CTLW0 = 0x0001; // disable UCB1 for configuration
EUSCI_B0->CTLW0 = 0x0F81;
/* Bit15 : Own Address of 7-bit (0)
Bit 14 : Slave Address of 7-bit (0)
Bit 13: Single Master Environment (0)
Bit 12 : Reserved (0)
Bit 11 : Master Mode Select (1)
Bit 10-9 : EUSCI Mode (11) <- I2C Mode
Bit 8 : Synchronous Mode Enable (1)
Bit 7-6 : EUSCI Clock Source (10)
Bit 5 : Transmit ACK (0)
Bit 4 : Transmitter / Receiver (0)
Bit 3 : Transmit NACK (0)
Bit 2 : Transmit STOP (0)
Bit 1 : Transmit START (0)
Bit 0 : Software Reset Enable (1)
In hex is represented by "0FC1"
P1.7 -> SCL | P1.6 -> SDA*/
EUSCI_B0->BRW = 30; // 3 MHz / 30 = 100 kHz
P1->SEL0 |= 0xC0; /* P1.7 SCLK / P1.6 SDA */
P1->SEL1 &= ~0xC0;
EUSCI_B0->CTLW0 &= ~0x01; // enable UCB1 after configuration
printf("I2C Initialized.\n");
}

/* Write One Byte of Data */
void I2C1_Write(int slaveAddr, unsigned char reg, unsigned char data)

{
EUSCI_B0->I2CSA = slaveAddr; // setup slave address
EUSCI_B0->CTLW0 |= 0x0012; // Enable Transmitter and Generate START bit
while(!(EUSCI_B0->IFG & 0x02)); // Wait until it is ready to transmit                                 <--- It gets stuck in this while loop
EUSCI_B0->TXBUF = reg; // Send Data to slave
while(!(EUSCI_B0->IFG & 0x02)); // Wait until it is ready to transmit
EUSCI_B0->TXBUF = data; // Send Data to slave
while(!(EUSCI_B0->IFG & 0x02)); // Wait until it is ready to transmit
EUSCI_B0->CTLW0 |= 0x04; // Generate STOP bit
while(EUSCI_B0->CTLW0 & 4); // Wait until STOP bit is sent
}

When i run the code, it gets stuck on the Interrupt Flag while loop as indicated on the code. If i replace that line with:

while(EUSCI_B0->CTLW0 & 2);     // Wait until STOP bit is sent

it also gets stuck on that specific while loop. I have a oscilloscope connected to pins 1.6 and 1.7 and while the code is running i dont see any change (it is flat at ~0V). What am i doing wrong? Thank you

  • Hello Hugo,

    When posting code to the forum, please utilize the syntax formatter by clicking "Insert" -> "</> Code" so it is readable. I've already edited your post to reflect this change. 

    Please also review the following application note on eUSCI, section 5 talks about I2C. The title says MSP430, but MSP432P4 shares the same eUSCI module. Going through these debug steps can help you narrow down your issue. 

    www.ti.com/lit/slaa734 

    The most common issue with I2C is incorrect I2C pullups values on the bus. This can also explain why you only see 0V.