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.

[参考译文] MSPM0L1106:API DL_GPIO_readPins 的引脚状态读数不正确

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1390465/mspm0l1106-incorrect-pin-state-reading-via-api-dl_gpio_readpins

器件型号:MSPM0L1106
主题中讨论的其他器件:SysConfig

工具与软件:

通过"DL_GPIO_readPins" API 读取的引脚状态与实际引脚状态不匹配时、我会遇到这个问题。 我最初将引脚配置为输出、然后将其切换到输入以读取其状态。 但是、API 返回不正确的值。 我已经使用万用表和示波器确认了正确的引脚状态。

环境详细信息:
Code Composer Studio 12.7.1
SDK 2.01.00.03
SysConfig 1.20.0.3587

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

    您能否提供一个显示问题的简单代码示例。

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

    如何将其从输出切换到输入? 配置为输出(DL_GPIO_initDigitalOutput())设置(IOMUX) INENA=0、因此无法读取它。

    我没有我的资料,但我很确定,如果你把它配置为输入[INENA=1]然后调用 DL_GPIO_enableOutput ()[DOESET=1],你可以读写。

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

       while (1){

           如果(! DL_GPIO_readPins (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN)

        {

               DL_GPIO_setPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);

           }

        设计

        {

               DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);

           }

           DL_GPIO_setPins (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);

           DL_GPIO_initDigitalOutput (GPIO_GRP_0_PIN_0_IOMUX);

           DL_GPIO_enableOutput (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);

           delay_cycles (128);

           DL_GPIO_disableOutput (GPIO_GRP_0_PORT、GPIO_GRP_0_PIN_0_PIN);

           DL_GPIO_initDigitalInputFeatures (GPIO_GRP_0_PIN_0_IOMUX、

                                                                          DL_GPIO_INVERSION _DISABLE、DL_GPIO_RESISTOR_NONE

                                                                          DL_GPIO_HYSTERESIS_DISABLE、DL_GPIO_WAKEUP_DISABLE);                    

    }

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

    DL_GPIO_enableOutput()将引脚配置为输入后、调用该函数不起作用、并且引脚状态始终保持低电平。

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

    哪个(物理)引脚是  GPIO_GRP_0_PIN_0_PIN?

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

    我尝试了将此代码序列修补到 L1306上的示例 GPIO_TOGGLE_OUTPUT、从而更改  GPIO_GRP_0_PIN_0_PIN -> GPIO_LEDS_USER_TEST_PIN 。 我先尝试将 USER_TEST_PIN 作为 PA1 (如示例中的配置)、然后是 PA3。

    使用 PA1 (没有外部上拉)、我看到引脚上没有响应(符合预期)、因为无法将其驱动为高电平。

    使用 PA3时、我看到引脚会变为高电平并持续大约4微秒、然后会变成低漂移(符合预期)。 自从 INENA=0后、DIN 寄存器没有改变。

    你发布的代码不能测试调用 enableOutput ()的情况下,当引脚是一个输入。 当我尝试此操作(通过删除对 DL_GPIO_initDigitalOutput 的调用)时、我看到引脚在 enableOutput ()之后变为高电平、与前一种情况一样、DIN 寄存器变为1。 在 disableOutput ()后、引脚漂移为低电平;由于 DIN 寄存器反映了引脚的状态(而不是 DOUT)、因此它最终也变为0 [参考 TRM (SLAU847D)图9-1]。

    我想我不明白你的目标。 要获得一个输出引脚、您可以读回、将其配置为"输入"[INENA=1]、然后使用 DL_GPIO_enableOutput [DOE=1]进行驱动。 或者、您是否正在尝试执行其他操作?

    1)在 INENA=1和 DOE=0时,引脚是 Hi-Z ,你可以读回它——一个"纯"输入。

    2)在 INENA=0和 DOE=1的情况下,引脚被驱动,但你不能读回它——一个"纯"输出。

    3) 3)当 INENA=1和 DOE=1时、该引脚被驱动、您可以读回该引脚的状态。 [如果您从外部将引脚下拉得足够硬、则即使驱动为高电平、也可能读取到很低。 这当然不是建议的,但它有时是偶然发生的。]

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

    实际上、我希望将该引脚配置为软件 I2C SDA。 发送一个字节后、我始终会从从器件收到高引脚状态(NACK)。 示波器清楚地显示通过将 SDA 线拉至低电平来确认从器件、但引脚状态读取仍显示为高电平。 另外、从从从器件读取值时、始终得到0xFF、这与示波器上观察到的值不匹配。 谢谢你。

    #define SDA_HIGH ()                       DL_GPIO_setPins (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN);   \

                                 DL_GPIO_initDigitalOutput (GPIO_OUTPUTS_SDA_IOMUX);          \

                                 DL_GPIO_enableOutput (GPIO_Outputs_port、GPIO_Outputs_SDA_PIN)  

     

    #define SDA_LOW ()                      DL_GPIO_clearPins (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN);   \

                                 DL_GPIO_initDigitalOutput (GPIO_OUTPUTS_SDA_IOMUX);            \

                                 DL_GPIO_enableOutput (GPIO_Outputs_port、GPIO_Outputs_SDA_PIN)

     

    #define SDA_INPUT ()                    DL_GPIO_disableOutput (GPIO_OUTPUTS_PORT、GPIO_OUTPUTS_SDA_PIN);\

                                 DL_GPIO_initDigitalInputFeatures (GPIO_OUTPUTS_SDA_IOMUX、\

                                 DL_GPIO_INVERSION _DISABLE、DL_GPIO_RESISTOR_NONE、\

                                 DL_GPIO_HYSTERESIS_DISABLE、DL_GPIO_WAKEUP_DISABLE)

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

    要制作一个 I2C-ISH 总线、我会从:

    1) 1)将 SCL/SDA 配置为输入并保持其不变

    2) 2)设置 SCL/SDA = 0 (clearPins)并将其保留在那里。

    3) SDA_LOW ()则为"DL_GPIO_enableOutput"(与 SCL 类似)以驱动为低电平

    4) SDA_HIGH ()为"DL_GPIO_disableOutput"(也适用于 SCL)以悬空(拉至)高电平

    5) SDA_INPUT()可以移除、或者保留为 DL_GPIO_disableOutput、以防万一(也适用于 SCL)

    也就是说,我没有看到任何明显的东西会导致你所描述的症状. 我怀疑您发布的代码之外有什么内容。

    您是否使用了开漏引脚(PA0/1)? 我认为这不会改变我的建议、但我可能会忘记一些细节。

    [编辑:轻微澄清]

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

    我正在使用通用 I/O (PA11/12)、并将按照您的建议操作。  即使按照您的建议、不正确的引脚状态问题(引脚状态读取仍显示为高电平)仍然存在。 调试时,如果我在执行 DL_GPIO_readPins ()之前放置一个断点,我就能够获得正确的引脚状态(引脚状态为低电平)。

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

    抱歉、我没有注意到上面的(暗示的)问题。  

    使用上面概述的序列时、可以看到 DIN 寄存器(readPins)中立即反映的 enableOutput/disableOutput 结果。 我将在引脚上使用内部上拉电阻。

    对于出现延迟的情况、您要使用哪种顺序?

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

    此外:您的软件 I2C 是否支持时钟延展(由从器件实现)? 否则、这可能是关于后到信号转换的一种解释(在示波器上可能看不到)。

    主器件的一般规则:仅在观察到 SCL 已变为高电平后才读取 SDA;仅仅将其释放到浮点/拉高是不够的。

    [编辑:轻微澄清]

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

    已确定根本原因。 需要取消选中"Global Pin Configuration"中的"Enable Global Fast Wake"选项。 感谢您的时间和支持。