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:
- Board_init();
- GPIO_init();
- I2C_init();
- I2C_Params_init(&i2cParams);
- i2cParams.bitRate = I2C_400kHz;
- i2cHandle = I2C_open(MyI2C1, &i2cParams);
- Create an I2C semaphore
- Create one FreeRTOS task
- Start the FreeRTOS scheduler
- The task runs
- Write to I2C EEPROM – works
- Read from I2C EEPROM - works
- Initialize the LCD_F peripheral
- Write to I2C EEPROM – fails
- 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)
- 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
- I looked at the I2C and GPIO registers and confirmed they have not changed
- If I move the LCD_F initialization ahead of the initial EEPROM I2C writes, the I2C port fails immediately on the first I2C write
- 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:
- Is there an errata for the MSP432411VIPZ?
- If so, does it discuss this issue?
- 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();
}