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.

MSP432P411Y: LCD segment enable causes I2C failure

Part Number: MSP432E411Y

I’m having a problem that appears, to me, to be a chip errata.  After I enable LCD segment 36 on Port10.3 = pin 3 of the 100 pin LQFP package, the I2C interrupts on EUSCI_B3 quit working.  Coincidentally or not, Port 10.3 can be an alternate source pin for the EUSCI_B3 I2C clock that I am using on CPU pins 80 and 81 (Port6.6, and Port6.7).

 I’ve whittled my project down to the point where I perform the following actions:

  1. Board_init();
  2. GPIO_init();
  3. I2C_init();
  4.  
  5. I2C_Params_init(&i2cParams);
  6. i2cParams.bitRate = I2C_400kHz;
  7. i2cHandle = I2C_open(MyI2C1, &i2cParams);
  8.  
  9. Create an I2C semaphore
  10. Create one FreeRTOS task
  11. Start the FreeRTOS scheduler
  12. The task runs
  13. Write to I2C EEPROM – works
  14. Read from I2C EEPROM - works
  15. Initialize the LCD_F peripheral
  16. Write to I2C EEPROM – fails
  17. Below is a scope shot of what comes out of the I2C pins.  Top is I2C data, bottom is I2C clock.  These are now non-stop, continuous pulse trains coming out of the I2C clock and I2C data  pins on CPU pins 80 and 81 (Port6.6, and Port6.7)
  18. I loaded the ROMMED I2C driver code and determined the I2C driver attempts to generate an I2C start, then waits for an event from the I2C ISR, but the I2C ISR never goes off
  19. I looked at the I2C and GPIO registers and confirmed they have not changed
  20. If I move the LCD_F initialization ahead of the initial EEPROM I2C writes, the I2C port fails immediately on the first I2C write
  21. The I2C port works if I initialize all of the LCD segments (42 total) except for the one on Port10.3 that shares I2C clock functionality.

 

 

Questions:

  1. Is there an errata for the MSP432411VIPZ?
  2. If so, does it discuss this issue?
  3. Has anyone else seen this issue?


GPIO_PinConfig gpioPinConfigs[] =

{
   GPIOMSP432_P10_1 | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_00
   GPIOMSP432_P8_0  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_01
   GPIOMSP432_P8_1  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_02
   GPIOMSP432_P8_7  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_HIGH,     // GPIO_ENC_I
   GPIOMSP432_P9_0  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_03
   GPIOMSP432_P9_1  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_04
   GPIOMSP432_P6_0  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_05
   GPIOMSP432_P6_1  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_06
   GPIOMSP432_P4_0  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_07
   GPIOMSP432_P4_1  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_08
   GPIOMSP432_P4_2  | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_NONE,                          // GPIO_PROG_EN
   GPIOMSP432_P4_3  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_POWER
   GPIOMSP432_P4_4  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_UNITS
   GPIOMSP432_P4_5  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_PLUS
   GPIOMSP432_P4_6  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_DATUM
   GPIOMSP432_P4_7  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_MINUS
   GPIOMSP432_P5_0  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_AUX_C1
   GPIOMSP432_P5_1  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_AUX_C0
   GPIOMSP432_P5_2  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_AUX_R2
   GPIOMSP432_P5_3  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_AUX_R1
   GPIOMSP432_P5_4  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_AUX_R0
   GPIOMSP432_P5_5  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_E_REQ
   GPIOMSP432_P5_6  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_E_DATA
   GPIOMSP432_P5_7  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_E_CLK
   GPIOMSP432_P7_0  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_SPC_REQ
   GPIOMSP432_P7_1  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_SPC_READ
   GPIOMSP432_P7_2  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_SPC_CLK
   GPIOMSP432_P7_3  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_SPC_DATA
   GPIOMSP432_P9_4  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_09
   GPIOMSP432_P9_5  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_IO_IN2
   GPIOMSP432_P9_6  | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_IO_OUT
   GPIOMSP432_P9_7  | GPIO_CFG_IN_PU     | GPIO_CFG_IN_INT_NONE,                          // GPIO_IO_IN1
   GPIOMSP432_P10_0 | GPIO_CFG_OUT_STD   | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,      // GPIO_UNUSED_10
};

 

/*
*  =============================== I2C ===============================
*/
I2CMSP432_Object i2cMSP432Objects[Board_I2CCOUNT];

const I2CMSP432_HWAttrsV1 i2cMSP432HWAttrs[Board_I2CCOUNT] =
{
   {
      .baseAddr = EUSCI_B3_BASE,
      .intNum = INT_EUSCIB3,
      .intPriority = (~0),
      .clockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK,
      .dataPin = I2CMSP432_P6_6_UCB3SDA,
      .clkPin = I2CMSP432_P6_7_UCB3SCL,
   },
};

const I2C_Config I2C_config[Board_I2CCOUNT] =
{
   {
      .fxnTablePtr = &I2CMSP432_fxnTable,
      .object = &i2cMSP432Objects[MyI2C1],
      .hwAttrs = &i2cMSP432HWAttrs[MyI2C1]
   },
};

const uint_least8_t I2C_count = Board_I2CCOUNT;

void SegmentLCD_Init(bool useBoost)
{
   /* Configure GPIO pins to LCD peripheral function */
   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,
       GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,
       GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3,
       GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P6,
       GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,
       GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P8,
       GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5,
       GPIO_SECONDARY_MODULE_FUNCTION);

   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P9,
       GPIO_PIN2 | GPIO_PIN3,
       GPIO_SECONDARY_MODULE_FUNCTION);

#if 1
// This breaks the I2C port
   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P10,
       GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5,
       GPIO_SECONDARY_MODULE_FUNCTION);
#else
// I2C port works
   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P10,
       GPIO_PIN2 | GPIO_PIN4 | GPIO_PIN5,
       GPIO_SECONDARY_MODULE_FUNCTION);
#endif

   /* Select the bias */
   LCD_F_selectBias(LCD_F_BIAS_1_3);

   /* Initialize the LCD_F module */
   LCD_F_initModule((LCD_F_Config*)&lcdConf);

   /* Clear out all main, blink, and animation memory */
   LCD_F_clearAllMemory();
   LCD_F_clearAllBlinkingMemory();
   LCD_F_clearAllAnimationMemory();

   /* Initialize all LCD pins */
   LCD_F_setPinsAsLCDFunction(LCD_F_SEGMENT_LINE_0, LCD_F_SEGMENT_LINE_37);      // Segments 0-37
   LCD_F_setPinsAsLCDFunction(LCD_F_SEGMENT_LINE_44, LCD_F_SEGMENT_LINE_47);     // Com 0-3

   /* Configure COM pins */

   LCD_F_setPinAsCOM(LCD_F_SEGMENT_LINE_44, LCD_F_MEMORY_COM0);
   LCD_F_setPinAsCOM(LCD_F_SEGMENT_LINE_45, LCD_F_MEMORY_COM1);
   LCD_F_setPinAsCOM(LCD_F_SEGMENT_LINE_46, LCD_F_MEMORY_COM2);
   LCD_F_setPinAsCOM(LCD_F_SEGMENT_LINE_47, LCD_F_MEMORY_COM3);

   /* Turn the LCD_F module on */
   LCD_F_turnOn();
}

  • Sorry, I meant to select MSP432P411, not MSP432E411.  I realize this part has been very recently obsoleted by TI.  Hopefully the questions can still be answered.  I would also like to see the chip revision history

  • Also, the chip is marked as Rev A, so I would like the errata for that revision

  • Hi Ron,

    Errata attached.MSP432P4111_Microcontroller_Errata_slaz697h.pdf

    I don't see anything in the errata related to what you are describing.

  • Hi Ron,

    Let me dig into this.  BTW, revision history is only A.

  • Hi Ron,

    I'm not able to get an immediate answer as to why you are seeing this behavior.  I'm in the process of getting an MSP432P4111 Launchpad to see if I can duplicate this.

  • I added wires to my board to use different LCD segments to get around this issue.  I believe the errata for the MSP432411V (SLAZ699E) needs to be updated.  Note that one of the symptoms of this issue is that no I2C interrupts occurred. when using the LCD segments along with UCB3 in I2C mode.  The same thing happens when I used Timer_A along with UCB3.  My usage does not exactly match the errata.  Also, I didn't even configure the timer to appear on the port pin and am instead using it for internal timing as a substitute for the freertos systick.  Note that Timer_A works in LPM3 mode to wake up the system from deepsleep mode

    /*
     *  =============================== Timer ===============================
     */
    TimerMSP432_Object timerMSP432Objects[Board_TIMERCOUNT];

    const TimerMSP432_HWAttrs timerMSP432HWAttrs[Board_TIMERCOUNT] =
    {
       {
          .timerBaseAddress = TIMER32_0_BASE,
          .clockSource = TIMER_A_CLOCKSOURCE_SMCLK,
          .intNum = INT_T32_INT1,
          .intPriority = ~0
       },
       {
          .timerBaseAddress = TIMER_A0_BASE,
          .clockSource = TIMER_A_CLOCKSOURCE_ACLK,
          .intNum = INT_TA0_0,
          .intPriority = ~0
       },
    };

    const Timer_Config Timer_config[Board_TIMERCOUNT] =
    {
       {
          .fxnTablePtr = &TimerMSP432_Timer32_fxnTable,
          .object = &timerMSP432Objects[MyTIMER32],
          .hwAttrs = &timerMSP432HWAttrs[MyTIMER32]
       },
       {
          .fxnTablePtr = &TimerMSP432_Timer_A_fxnTable,
          .object = &timerMSP432Objects[MyTIMER_A],
          .hwAttrs = &timerMSP432HWAttrs[MyTIMER_A]
       },
    };

    const uint_least8_t Timer_count = Board_TIMERCOUNT;


  • Hi Ron,

    Ok, it sounds like you have it working and moving forward with your project.  I'll dig into the details and see if the errata should be expanded.

    I will mark this posting as RESOLVED, but if this isn’t the case, please click the "This did NOT resolve my issue" button and reply to this thread with more information.
    If this thread is locked, please click the "Ask a related question" button, and in the new thread describe the current status of your issue and any additional details you may have to assist us in helping to solve your issues.