《线程》中讨论的其他部件:MSP432P4111
我遇到的问题在我看来是芯片勘误表。 当我在端口10.3 = 100引脚 LQFP 封装的引脚3上启用 LCD 段36后,EUSCI_B3上的 I2C 中断将停止工作。 巧合的是,端口10.3可以是我在 CPU 引脚80和81 (Port6.6和 Port6.7)上使用的 EUSCI_B3 I2C 时钟的备用源引脚。
我已将项目白化到执行以下操作的程度:
- Board_init();
- GPIO 初始化();
- I2C_INIT();
- I2C_Params_init (&i2cParams);
- i2cParams.bitrate = I2C_400kHz;
- i2cHandle = I2C_OPEN (MyI2C1,&i2cParams);
- 创建 I2C 信号
- 创建一个 FreeRTOS 任务
- 启动 FreeRTOS 调度程序
- 任务将运行
- 写入 I2C EEPROM–工作正常
- 从 I2C EEPROM 读取-工作正常
- 初始化 LCD_F 外围设备
- 写入 I2C EEPROM–失败
- 下面是 I2C 引脚的范围图。 顶部是 I2C 数据,底部是 I2C 时钟。 这些是 CPU 引脚80和81 (Port6.6和 Port6.7)上 I2C 时钟和 I2C 数据引脚的不间断连续脉冲导轨
- 我加载了 ROMMED I2C 驱动程序代码,并确定 I2C 驱动程序尝试生成 I2C 启动,然后等待来自 I2C ISR 的事件,但 I2C ISR 从未关闭
- 我查看了 I2C 和 GPIO 寄存器,并确认它们没有改变
- 如果我在初始 EEPROM I2C 写入之前移动 LCD_F 初始化,则 I2C 端口在第一个 I2C 写入时会立即失败
- 如果我初始化所有 LCD 段(总共42个),I2C 端口将工作,但端口10.3上共享 I2C 时钟功能的 LCD 段除外。
问题:
- MSP432411VIPZ 的勘误表是否存在?
- 如果是,它会讨论这个问题吗?
- 是否有其他人看到了这个问题?
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();
}