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 段启用导致 I2C 故障

Guru**** 657500 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1070264/msp432p411y-lcd-segment-enable-causes-i2c-failure

部件号:MSP432E411Y
《线程》中讨论的其他部件:MSP432P4111

我遇到的问题在我看来是芯片勘误表。  当我在端口10.3 = 100引脚 LQFP 封装的引脚3上启用 LCD 段36后,EUSCI_B3上的 I2C 中断将停止工作。  巧合的是,端口10.3可以是我在 CPU 引脚80和81 (Port6.6和 Port6.7)上使用的 EUSCI_B3 I2C 时钟的备用源引脚。

 我已将项目白化到执行以下操作的程度:

  1. Board_init();
  2. GPIO 初始化();
  3. I2C_INIT();
  4.  
  5. I2C_Params_init (&i2cParams);
  6. i2cParams.bitrate = I2C_400kHz;
  7. i2cHandle = I2C_OPEN (MyI2C1,&i2cParams);
  8.  
  9. 创建 I2C 信号
  10. 创建一个 FreeRTOS 任务
  11. 启动 FreeRTOS 调度程序
  12. 任务将运行
  13. 写入 I2C EEPROM–工作正常
  14. 从 I2C EEPROM 读取-工作正常
  15. 初始化 LCD_F 外围设备
  16. 写入 I2C EEPROM–失败
  17. 下面是 I2C 引脚的范围图。  顶部是 I2C 数据,底部是 I2C 时钟。  这些是 CPU 引脚80和81 (Port6.6和 Port6.7)上 I2C 时钟和 I2C 数据引脚的不间断连续脉冲导轨
  18. 我加载了 ROMMED I2C 驱动程序代码,并确定 I2C 驱动程序尝试生成 I2C 启动,然后等待来自 I2C ISR 的事件,但 I2C ISR 从未关闭
  19. 我查看了 I2C 和 GPIO 寄存器,并确认它们没有改变
  20. 如果我在初始 EEPROM I2C 写入之前移动 LCD_F 初始化,则 I2C 端口在第一个 I2C 写入时会立即失败
  21. 如果我初始化所有 LCD 段(总共42个),I2C 端口将工作,但端口10.3上共享 I2C 时钟功能的 LCD 段除外。

 

 

问题:

  1. MSP432411VIPZ 的勘误表是否存在?
  2. 如果是,它会讨论这个问题吗?
  3. 是否有其他人看到了这个问题?


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();
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉,我想选择 MSP432P411,而不是 MSP432E411。  我意识到 TI 最近已经废弃了该部件。  希望这些问题仍能得到解答。  我还想了解芯片修订历史

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外,芯片标记为 Rev A,因此我希望获得该修订版的勘误表

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Ron,

    勘误表 attached.e2e.ti.com/.../MSP432P4111_5F00_Microcontroller_5F00_Errata_5F00_slaz697h.pdf

    我在勘误表中没有看到与您所描述的内容相关的任何内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Ron,

    让我深入探讨这一点。  顺便说一句,修订历史记录仅为 A.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Ron,

    我无法立即得到您为什么看到这种行为的答案。  我正在获取 MSP432P4111启动板,以查看是否可以复制。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在主板上添加了电线,以使用不同的 LCD 段来解决此问题。  我认为 MSP432411V (SLAZ699E)的勘误表需要更新。  请注意,此问题的一个症状是没有发生 I2C 中断。在 I2C 模式下使用 LCD 区段和 UCB3时。  当我将 Timer_A 与 UCB3一起使用时,也会发生同样的情况。  我的用法与勘误表不完全匹配。  此外,我甚至没有将计时器配置为出现在端口引脚上,而是将其用于内部计时,以替代 FreeRTOS Systick。  请注意,Timer_A 在 LPM3模式下工作,可从 DeepSleep 模式唤醒系统

    /*
     * ================================= 计时器=========================
     *
    TimerMSP432_对象时间戳 MSP432Objects[Board_TIMECOUNT];

    const TimerMSP432_HWAttrs timerMSP432HWAttrs[Board_TIMECOUNT]=

      {
         timerBaseAddress = TIMER32_0_base,
         时钟源= TIMER _A_CLOCKSOURCE_SMCLK,
         .intNum = INT_T32_INT1,
         .intPriority =~0
      },
      {
         timerBaseAddress = timer_A0_base,
         时钟源= TIMER _A_CLOCKSOURCE_ACLK,
         .intNum = INT_TA0_0,
         .intPriority =~0
      },
    };

    连接计时器配置计时器配置[Board_TIMERCOUNT]=

      {
         fxnTablePtr =&TimerMSP432_Timer32_fxnTable,
         .object =&timerMSP432Objects[MyTIMER32],
         hwAttrs =&timerMSP432HWAttrs [MyTIMER32]
      },
      {
         fxnTablePtr =&TimerMSP432_Timer_a_fxnTable,
         .object =&timerMSP432Objects[MyTIMER_A],
         hwAttrs =&timerMSP432HWAttrs [MyTIME_A]
      },
    };

    const uint_least8_t Timer_count = Board_TIMECOUNT;


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Ron,

    好的,听起来你有它在工作,并在你的项目上取得进展。  我将深入了解详细信息,并查看勘误表是否应进行扩展。

    我会将此帖子标记为已解决,但如果不是这种情况,请单击“这未能解决我的问题”按钮,并使用更多信息回复此主题。
    如果此线程已锁定,请单击“询问相关问题”按钮,在新线程中描述您的问题的当前状态以及您可能需要帮助我们解决您的问题的任何其他详细信息。