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.

[参考译文] TMS320C6748:GPIO1[15]读取输入不工作

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/642789/tms320c6748-gpio1-15-reading-input-not-working

器件型号:TMS320C6748

您好!

我正在尝试读取 GPIO1[15]输入、但值始终相同。  

当配置为输入时、其他 GPIO 引脚工作正常、而 GPIO 引脚在相关引脚多路复用器中配置。

用于重现问题的源代码:

#define HW_PINMUX2_GPIO1_MASK 0xFFFFFF00u

#define HW_PINMUX2_GPIO1_ENABLE 0x00004048u

#define GPIOPINNUMBER (组、引脚)((组<< 4)|(引脚+ 1))

#define GPIO_Bank_1_NR 1.
#define GPIO_1_12_PIN_NR 12.
#define GPIO_1_14_PIN_NR 14
#define GPIO_1_15_PIN_NR 15

#define GPIO_1_12_PIN GPIOPINNUMBER (GPIO_Bank_1_NR、GPIO_1_12_PIN_NR)
#define GPIO_1_14_PIN GPIOPINNUMBER (GPIO_Bank_1_NR、GPIO_1_14_PIN_NR)
#define GPIO_1_15_PIN GPIOPINNUMBER (GPIO_Bank_1_NR、GPIO_1_15_PIN_NR)

uint8_t 版本= 0;

//解锁脚踢寄存器(在 C6748上必需)
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_KICK0R)= SYSCFG_KICK0R_UNLOCK;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_KICK1R)= SYSCFG_KICK1R_UNLOCK;

//将 GPIO 引脚配置为 GPIO

HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (2))&&= HW_PINMUX2_GPIO1_MASK;
HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (2))|= HW_PINMUX2_GPIO1_ENABLE;

Task_sleep (1);// 1ms 延迟

版本= GPIOPinRead (SOC_GPIO_0_regs、GPIO_1_14_PIN);
版本|= GPIOPinRead (SOC_GPIO_0_regs、GPIO_1_15_PIN)<< 1;
版本|= GPIOPinRead (SOC_GPIO_0_regs、GPIO_1_12_PIN)<< 2;

以下代码输出显示版本变量的第二位(GPIO1[15])始终为0。

如果我:

GPIODirModeSet (SOC_GPIO_0_regs、GPIO_1_15_PIN、GPIO_DIR_INPUT);  

在读取该值之前、该值始终为1。

其他引脚 GPIO1[12]和 GPIO1[14]工作正常。

GPIO1[15]与 McASP I/O 引脚 AXR7共享。  当从 MCASP_PDIN 读取引脚时、该值会改变、但从相关 GPIO 寄存器读取时不会改变。

使用 McASP 寄存器时、读数正确:  

HWREG (SOC_MCASP_0_CTRL_regs + MCASP_PFUNC)= 0xFEFF;

PDINvar = HWREG (SOC_MCASP_0_CTRL_regs + MCASP_PDIN);

有什么想法为什么?

最棒的餐厅

Teet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的代码似乎正常。 您是否正在运行多任务处理? 是否还有其他任务可能更改 GPIO 配置? 可能会在出现问题时读回配置寄存器。

    在使用 GPIO 之前、您应该调用 GPIODirModeSet()。 理论上、复位时所有 GPIO 均为输入、但我认为最好还是将方向设置为输入。

    如何测试 GPIO 输入? 您是否对引脚应用了逻辑电平? GP1[15]和 GP1[12]/Gp[14]之间的一个差异是位于两个不同的默认上拉控制上。 您的设计是否假定为上拉或下拉。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速响应。

    我正在运行多任务应用程序... 但我也在单线程简单应用程序上测试了相同的代码、结果是相同的。

    当 使用 GPIODirModeSet()将 GPIO1[15]方向设置为输入时,它会反转引脚的状态。 其他引脚值是正确的、因此我没有设置这些引脚的方向。

    我正在使用万用表进行测试、并通过用电线手动拉低引脚。

    我特意将用于设置上拉/下拉控制的代码遗漏了。 但是、是的、我也这样做。 在延迟之前和引脚多路复用之后。 方法如下:

    HWREG (SOC_SYSCFG_1_regs + SYSCFG1_PUPD_ENA)|= SYSCFG1_PUPD_ENA_PUPDENA4;//为引脚组 CP[4]启用 PUPD
    HWREG (SOC_SYSCFG_1_regs + SYSCFG1_PUPD_ENA)|= SYSCFG1_PUPD_ENA_PUPDENA5;//为引脚组 CP[5]启用 PUPD

    HWREG (SOC_SYSCFG_1_regs + SYSCFG1_PUPD_SEL)&&=~SYSCFG1_PUPD_SEL_PUPDSEL4;//引脚组 CP[4]的内部下拉功能被禁用
    HWREG (SOC_SYSCFG_1_regs + SYSCFG1_PUPD_SEL)&&=~SYSCFG1_PUPD_SEL_PUPDSEL5;//引脚组 CP[5]的内部下拉功能被禁用

    然后我将其恢复为默认值。

    当问题发生时、我将查看配置寄存器中的内容。

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

    现在、我已经在读取 GPIO 引脚值前后直接检查了引脚多路复用值。

    引脚多路复用器的读数如下:
    HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (2));

    值始终为0x04404048。

    这似乎是正确的、并且与规格相对应。

    PCB 上有一个1k Ω 的物理上拉电阻器、我尝试通过一根接地线将其下拉。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引脚多路复用看起来不错。 另一个要检查的寄存器是 GPIO 方向。 使用
    GPIODirModeGet()或整个寄存器
    HWREG (SOC_GPIO_0_regs + GPIO_DIR (0))

    您是否为 GPIO 控制器启用了电源和时钟? 其他 GPIO 的工作情况下、您可能会遇到这种情况。

    此宏可能有问题
    #define GPIOPINNUMBER (组、引脚)((组<< 4)|(引脚+ 1))
    我认为应该是这样
    #define GPIOPINNUMBER (组、引脚)((组<< 4)+(引脚+ 1))
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还是可能不是。 这应该是将基于零的组/引脚转换为基于一的引脚的正确方法。
    #define GPIOPINNUMBER (组、引脚)(((组<< 4)|引脚)+ 1)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您提出了正确的解决方案。

    问题是、我没有自己编写这个宏、它现在用于配置所有其他 GPIO 已有一段时间。 似乎只有当组号的第一个位为高电平时、即组1、3、5、7时、才会出现此问题。 幸运的是、我们没有使用其中任何一个。 我想知道该宏是否从某些示例中重复使用。 在这种情况下、它可能会给更广泛的用户带来一些麻烦。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    严格地说、如果组为奇数且引脚为15、则会发生错误。

    #define GPIOPINNUMBER (组、引脚)((组<< 4)|(引脚+ 1))
    0/15->16良好
    1/14 -> 31良好
    1/15 -> 16 BAD、应为32
    2/14 -> 47良好
    2/15 -> 48良好

    宏是否位于 StarterWare 版本的某个位置? 还是仅在您的代码流中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在 StarterWare 中找到了它、但我没有找到它。 这可能是我们以前的内部开发人员留下的。