《线程》中讨论的其他部件: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(); }