Jump to content
YSN

Interface MSP432 with MPU6050

Recommended Posts

Hi,

I am having trouble interfacing the MSP432 with MPU6050. I have pulled the SDA and SCL lines up to 3.3V with 10k resistors. When I initiate the communication using the I2C_masterSendMultipleByteStart(), the program enters an infinite loop waiting for the TXIFG to be set after the STT is sent. I can see that the STT remains set and TXIFG never gets set. What could be the issue? Please let me know if you want me to post the code.

Thank you.

Share this post


Link to post
Share on other sites

I have not worked that much with the MPU6050 or the MSP432, but usually use lower value pull-ups than 10k as you get a cleaner i2c signal. 4k7 down to 2k2 are usually safe values and it is possible to go lower on 3.3v but probably not necessary in most cases. If you can scope the signal that could be useful to see, as well as the code.

 

Other obvious problems is the wrong address, but assuming you have checked this.

Share this post


Link to post
Share on other sites

Hi Antscran, yes I have cross checked the address (0x68). I will use a lower value resistor for pulling the SDA and SCL lines. Unfortunately, I don't have access to a scope. But please find the attached code. I am using the Driver library for MSP432. 

 

Code:

 
#include "driverlib.h"
#include "i2c.h"


#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>


#define SLAVE_ADDRESS       0x68
#define NUM_OF_REC_BYTES    14


const uint8_t TXData[16] = {0x6B,0x00,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48};
static uint8_t RXData[NUM_OF_REC_BYTES];
static volatile bool stopSent;
unsigned int ctr=0;


const eUSCI_I2C_MasterConfig i2cConfig =
{
        EUSCI_B_I2C_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
        3000000,                                // SMCLK = 3MHz
        EUSCI_B_I2C_SET_DATA_RATE_100KBPS,      // Desired I2C Clock of 100khz
        0,                                      // No byte counter threshold
        EUSCI_B_I2C_NO_AUTO_STOP                // No Autostop
};


int main(void)
{


    MAP_WDT_A_holdTimer();


    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
            GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
    stopSent = false;
    memset(RXData, 0x00, NUM_OF_REC_BYTES);


    /* Initializing I2C Master to SMCLK at 100kbs with no autostop */
    MAP_I2C_initMaster(EUSCI_B0_MODULE, &i2cConfig);


    /* Specify slave address */
    MAP_I2C_setSlaveAddress(EUSCI_B0_MODULE, SLAVE_ADDRESS);


    /* Set Master in transmit mode */
    MAP_I2C_setMode(EUSCI_B0_MODULE, EUSCI_B_I2C_TRANSMIT_MODE);


    /* Enable I2C Module to start operations */
    MAP_I2C_enableModule(EUSCI_B0_MODULE);


    //Enable master Receive interrupt
    MAP_I2C_enableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0);


    MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
    MAP_Interrupt_enableMaster();


    while (MAP_I2C_masterIsStopSent(EUSCI_B0_MODULE) == EUSCI_B_I2C_SENDING_STOP);
    while (I2C_isBusBusy(EUSCI_B0_MODULE)==EUSCI_B_I2C_BUS_BUSY);
    MAP_I2C_masterSendMultiByteStart(EUSCI_B0_MODULE, TXData[0]);
    while (I2C_isBusBusy(EUSCI_B0_MODULE)==EUSCI_B_I2C_BUS_BUSY);
    MAP_I2C_masterSendMultiByteFinish(EUSCI_B0_MODULE, TXData[1]);


    ctr=2;


    while (1)
    {


        MAP_I2C_masterSendMultiByteStart(EUSCI_B0_MODULE, TXData[ctr]);


        MAP_I2C_enableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0);


        while(!stopSent);
        ctr++;
        if (ctr==16)
        {
            ctr = 2;
        }
        stopSent = false;
    }
}


void euscib0_isr(void)
{
    uint_fast16_t status;
    status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_MODULE);
    MAP_I2C_clearInterruptFlag(EUSCI_B0_MODULE, status);
   if (status & EUSCI_B_I2C_TRANSMIT_INTERRUPT0)
    {
  printf("sent\r\n");
        MAP_I2C_disableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0);
        MAP_I2C_setMode(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_MODE);
        MAP_I2C_masterReceiveStart(EUSCI_B0_MODULE);
        MAP_I2C_enableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
    }


    if (status & EUSCI_B_I2C_RECEIVE_INTERRUPT0)
    {
          int i=ctr-2;
          RXData[i] = MAP_I2C_masterReceiveMultiByteNext(EUSCI_B0_MODULE);
          printf("%d\r\n",RXData[i]);
          RXData[i] = MAP_I2C_masterReceiveMultiByteFinish(EUSCI_B0_MODULE);
          MAP_I2C_disableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
          MAP_I2C_setMode(EUSCI_B0_MODULE, EUSCI_B_I2C_TRANSMIT_MODE);
          stopSent = true;
    }
}
 
Your help is much appreciated. Thank you.

Share this post


Link to post
Share on other sites

I removed the 10k resistors as I read online that the sensor has 4.7k resistors on board.
Progress: Initially, the problem is solved if I turn off the sensor and turn it back on. Then I am able to cycle through the 14 data registers once. But when I send the stop and then restart at the address of the first register (0x3B) to be read, the code gets stuck at polling for TXIFG.

Share this post


Link to post
Share on other sites

Hello YSN

It's been long and I wonder if you are still following this forum. 

I am coming across the same issue between MSP432 and MPU6050 and I was wondering if you ever resolved this issue. Thanks for any help!

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×