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.

[参考译文] MSPM0C1104:引脚动态输入/输出开关

Guru**** 2905430 points

Other Parts Discussed in Thread: MSPM0C1104, MSPM0C1103

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580719/mspm0c1104-pin-on-the-fly-input-output-switching

器件型号:MSPM0C1104
主题: MSPM0C1103 中讨论的其他器件

MSPM0C1104 上的 GPIO 引脚是否可以在输入(真高阻态)和输出(推挽)之间动态切换、而无需重新配置 IOMUX? 如果是、哪个 driverlib 函数可以保证引脚完全处于高阻抗状态(无保持器,无拉电阻,无漏电流)?

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

    您好 Rob、
    否、每次要从一种状态切换到另一种状态时、都需要切换 IOMUX。 请参阅 IOMUX 图以供参考(可在 TRM 的 IOMUX 一章中找到)

    此致、

    Diego Abad

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

    我尝试用这个测试代码,但 PA27 切换不输入:

    #include "ti_msp_dl_config.h"
    #include <stdint.h>
    
    #define PORTA     GPIO_GRP_0_PORT
    #define CP0_PIN   GPIO_GRP_0_CP0_PIN     // PA26 (anode LED1)
    #define CP1_IOMUX GPIO_GRP_0_CP1_IOMUX   // PA27 (vrije pin)
    #define CP2_PIN   GPIO_GRP_0_CP2_PIN     // PA28 (cathode LED1)
    #define CP0_IOMUX GPIO_GRP_0_CP0_IOMUX
    #define CP2_IOMUX GPIO_GRP_0_CP2_IOMUX
    
    static inline void dly(volatile uint32_t n){ while(n--) __NOP(); }
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        for(;;)
        {
            /* ---------- ON: wissel IOMUX INPUT -> OUTPUT (glitchvrij) ---------- */
    
            // 0) vrije pin echt vrij (kies 1 van de 2 regels)
            DL_GPIO_initDigitalInput(CP1_IOMUX);      // PA27 = input, no pull (SysCfg)
            // DL_GPIO_initAnalog(CP1_IOMUX);         // (alternatief) PA27 = Analog (zeker high-Z)
    
            // 1) PRELOAD OUT-latch (pads nog géén output!)
            DL_GPIO_clearPins(PORTA, CP2_PIN);        // PA28 latch = LOW (cathode)
            DL_GPIO_setPins  (PORTA, CP0_PIN);        // PA26 latch = HIGH (anode)
            dly(50);                                   // korte guard
    
            // 2) IOMUX → DigitalOutput (runtime switch)
            DL_GPIO_initDigitalOutput(CP2_IOMUX);     // PA28 wordt nu echt LOW
            DL_GPIO_initDigitalOutput(CP0_IOMUX);     // PA26 wordt nu echt HIGH
    
            dly(600000);                               // ~0.6 s AAN (LED1 zou nu alleen moeten branden)
    
            /* ---------- OFF: terug naar INPUT (IOMUX terug) ---------- */
    
            DL_GPIO_initDigitalInput(CP0_IOMUX);      // PA26 terug naar input
            DL_GPIO_initDigitalInput(CP2_IOMUX);      // PA28 terug naar input
            // (optioneel) latches wissen, heeft geen effect op inputs:
            DL_GPIO_clearPins(PORTA, CP0_PIN);
            DL_GPIO_clearPins(PORTA, CP2_PIN);
    
            dly(300000);                               // ~0.3 s UIT
        }
    }
    



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

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

    Diego、

    感谢信息,如果我看 图 9-1 我可以留下引脚输出和需要
    激活关断功能、将引脚切换至高阻态
    我必须查找 shutdown 命令。

    此致、

    Rob Keij

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

    您好 Rob、
    您是对的。 但是、MSPM0C1103/4 器件不支持从 SHUTDOWN 模式唤醒。 我建议使用任何其他模式、如 STANDBY0/1。

    此致、

    Diego Abad

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

    尊敬的 Diego:

    好的、我尝试对引脚的每个功能更改都进行正确处理 、通过 IOMUX 进行更改 需要完全重新启动。
    因此,简单的设计与 charlieplex LED 是不可用的。 我本来希望使用 MSPM0C1104。
    但我不明白、引脚不可能从输出切换到输入或悬空。
    我相信这应该是可能的,并产生 100 PCBA 的:(

    我将您的第一个答案标记为“此解决了我的问题“  (此回答了我的问题)

    谢谢、

    此致、

    Rob keij


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

    您好 Rob、
    让我看看我是否能得到关于这个主题的更深入的解释。

    此致、

    Diego Abad

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

    您好 Rob、

    实际上、在与我的团队交谈后、我确认、只要功能保持在 GPIO 功能范围内(低,高,高阻抗)、IOMUX 就应该保持不变。 但是、如果要从没有内部上拉/下拉电阻切换到具有内部上拉/下拉电阻、则这时 IOMUX 会发生变化。

    此致、

    Diego Abad

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

    #include "ti_msp_dl_config.h"
    #include <stdint.h>
    
    #define PA26_MASK  DL_GPIO_PIN_26
    #define PA27_MASK  DL_GPIO_PIN_27
    #define PA28_MASK  DL_GPIO_PIN_28
    
    static inline void dly(volatile uint32_t n){ while(n--) __NOP(); }
    
    /* -------------------------------------------------------------- */
    /* Tri-state en output helpers – alléén GPIO-registers             */
    /* -------------------------------------------------------------- */
    
    static inline void make_input_hiz(uint32_t mask)
    {
        // maak pin input (DOE bit = 0)
        GPIOA->DOE31_0 &= ~mask;
    }
    
    static inline void make_output(uint32_t mask)
    {
        // maak pin output (DOE bit = 1)
        GPIOA->DOE31_0 |= mask;
    }
    
    /* -------------------------------------------------------------- */
    /* Eén LED aansturen: A=anode, C=kathode, F=vrije pin             */
    /* -------------------------------------------------------------- */
    
    static void drive_one(uint32_t A_mask, uint32_t C_mask, uint32_t F_mask, uint32_t on_ticks)
    {
        // alles los
        make_input_hiz(PA26_MASK | PA27_MASK | PA28_MASK);
    
        // vrije pin blijft input (high-Z)
        make_input_hiz(F_mask);
    
        // vooraf: kathode laag, anode hoog
        GPIOA->DOUT31_0 &= ~C_mask;
        GPIOA->DOUT31_0 |=  A_mask;
    
        // outputs activeren
        make_output(C_mask);
        make_output(A_mask);
    
        dly(on_ticks);
    
        // terug los
        make_input_hiz(A_mask | C_mask);
    }
    
    /* -------------------------------------------------------------- */
    /* main – sequentieel alle zes LED-combinaties                    */
    /* -------------------------------------------------------------- */
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        while (1)
        {
            drive_one(PA26_MASK, PA28_MASK, PA27_MASK, 500000); // L1
            drive_one(PA27_MASK, PA28_MASK, PA26_MASK, 500000); // L2
            drive_one(PA26_MASK, PA27_MASK, PA28_MASK, 500000); // L3
            drive_one(PA28_MASK, PA26_MASK, PA27_MASK, 500000); // L5
            drive_one(PA28_MASK, PA27_MASK, PA26_MASK, 500000); // L6
            drive_one(PA27_MASK, PA26_MASK, PA28_MASK, 500000); // L7
            dly(300000);
        }
    }
    



    谢谢 Diego