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.

[参考译文] [tda4x] j721e_evm:在 main r5f0 (MCU2_1)中使用 GPIO 中断时出现问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/920716/tda4x-j721e_evm-issue-when-using-gpio-interrupt-in-main-r5f0-mcu2_1

您好、TI 员工:

  我正在使用 mcan0引脚  pinmux 作为 GPIO 功能  (j721e_evm 板上的 J24)、希望从 GPIO1_1捕获边沿中断、但失败。 那么、我使用 CCS 进行调试

然后发现在 GPIO_init()中,当它调用 Sciclient_rmIrqSet()时它返回-1。

似乎我无法分配 GPIO 中断资源、导致无法捕获边沿中断。

GPIO_init();
GPIO_INIT_V0
GPIO_setConfig_V0
RET_socIntraPath =(*hwAttrs->socConfigIntraPath)(portnum、pinNum、hwAttrs、true);
 |
GPIO_socConfigIntraPath   <-- |
RetVal = Sciclient_rmIrqSet ((const struct tisci_msg_rm_IRQ_set_req *)&rmIrqReq、            << RetVal =-1
rmIrqResp (&R)、
SCICLIENT_SERVICE_WAIT_FOREVAL);
##################

下面显示的是安装代码

##########

/* J24
* MCAN0 <-> GPIO1_2 <-> TX
* GPIO1_1 <-> RX
*/


#define USS_TX_GPIO_base CSL_GPIO1_base
#define USS_RX_GPIO_base CSL_GPIO1_base
#define US_TX_PORT (1U)
#define USS_RX_PORT (1U)
#define USS_TX_PIN (USS_TX_PIN)#define
USS_RX_PIN (USS_TX_PIN)#define USS_INDEX (USS_TX_PIN

)#define USS_DIRECT_INDEX) USS USS (0U)
#define USS_RX_GPIO_INDEX (1U)

#define GPIO_LOW (0U)
#define GPIO_HIGH (1U)


GPIO_PinConfig gpioPinConfigs[]=
{
GPIO_DEVICE_CONFIG (USS_TX_PORT、USS_TX_PIN)| GPIO_CFG_OUTPUT、 //Tx
GPIO_DEVICE_CONFIG (USS_RX_PORT、USS_RX_PIN)| GPIO_CFG_IN_INT_INT_INT_INT_INT_BUT_FETS // Rx < <<intNum = CSLR_R5FSS0_Core1_INTR_GPIOMUX_INTR0_OUTP_16;
GPIO_configIntRouter (fg_RX_PORT、USS_RX_PIN、0、&GPIO_cfg);//NOTUSED 引脚 NOUSED_CONFIGINITCfg
(fgUSS_RX_PINT











);USS_INTR32_INT_INTRUSS INTRUS_INT_INTRUS_INTRUS_INTRUS_INTRU32_INTRUS_INT_INTRUS_INTRUS_INTRUS_INTRUS_INTRIGN;US_INT_INTRUS_INTRUS_INTRUS_INTRUS_INT_INT_INTRIGN INTRUS_INTRU32_INT_INT_INT_INT_INTRUSPUT_INT_INTRUS_INT_INTRUS_INT_INTRUS_INT_INTRIGNOT_INT_INTRUS_INT_
bankNum = pinNum/16;
intCfg[pinNum].intNum = CSLR_R5FSS0_Core1_INTR_GPIOMUX_INTR0_OUTP_16 + OutbankConfig;intCfg[pinNum].intcMuxNum
= INTC_MUX_Num;//未使用 intCfg[%intcEvent]


;intcNum[%intcNum_Num_Num_Num_inc.];intcNum_intcEvent[%intcNum_intcNum_intcNum_intcNum_intcNum_intcNum_intcNum_intcNum_intcNum_intning];//未使用 intNum[%d]、EventID[%d]\n"、
portNum、pinNum、bankNum、 intCfg[pinNum].intNum、intCfg[pinNum].EventID);
} 

##############
CSS 调试信息  
##############
GPIO 状态
RetVal = Sciclient_rmIrqSet        返回-1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能告诉我您正在使用哪个 SDK 版本、以及您在哪个内核上尝试访问 GPIO 吗?

    Rgds、

    Brijesh

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

    您好:

    我使用 PSDLRA 07.00.00.11版本,内核为 MCU2_1 (MAIN_r5f0_1)

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

    您好!

    我认为 GPIO4被分配给 MCU2_1。 大多数引脚也可用于 GPIO4、只需更改 pinmux 寄存器、那么您是否可以更改 pinmux 寄存器以将 GPIO4模块用于该引脚并请求 IRQ 号 GPIO4?

    Rgds、

    Brijesh

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

    您好、Brijesh、

    这是 Neo。

    我想客户希望使用 EVM 中的输出引脚来进行测试、他们选择 GPIO1_1/2是因为这两个引脚已输出并连接到 CAN 收发器、因此可以 将外设直接连接到 EVM。

    我们如何知道 GPIOx 分配给哪个内核? 似乎我在 EVM 中发现 GPIO4模块的下面没有任何引脚。

    非常感谢

    新生儿

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

    您好:Brijesh

    谢谢 Neo。 是的、我们希望使用 EVM 板上的输出引脚连接到外设、而且我在数据表中找不到任何到 GPIO4模块的引脚多路复用器

    Rgds、

    科拉奇

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

    您好、Neo、

    PINMUX 寄存器中的寄存器字段 VGPIO_SEL 可用于为同一引脚选择不同的 GPIO。  因此、请尝试更改引脚多路复用寄存器中的此字段。 并使用 MCU2_1上的 GPIO4作为 GPIO 访问该引脚。

    Rgds、

    Brijesh  

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

    您好、Brijesh:

     我已将 PADCONFIG1和 PADCONFIG2中的字段 VGPIO_SEL 更改为使用 GPIO3 (因为 GPIO1不能设置为选择 GPIO4)、但相关引脚的电平没有变化设置为高电平。 我做得对吗?

     

    --------------------------

    寄存器如下所示

    --------------

    指示代码如下所示

    --------------

    #define PADCONFIG1 (*(volatile Int32_t*) 0x0011C004U)
    #define PADCONFIG2 (*(volatile Int32_t*) 0x0011C008U
    
    ) void SettoVGPIO_Bank (void)
    {
    uint32_t cfg = PADCONFIG1;
    =(~
    
    
    
    ~0xCONFIG= 0xFFFF)
    
    | GPIO= 0xCONFIG1;0xCONFIG1 = 0xPADCONFIG1 = 0xPADCONFIG1;FFG = 0xPADCONFIG1 = 0xPADCONFIG1;FFFG = 0xPADCONFIG1 = 0xPADCONFIG1;FFG = 0xPADCONFIG1;
    FFG = 0xPADCONFIG1 = 0xPADCONFIG1;FFG = 0xPADCONFIG1 = 0xPADCONFIG1;FFG = 0xPADCONFIG1 = 0xPADCONFIG1;FFG = 0xPADCONFIG1 = 0xPADCONFIG
    
    
    静态空 Board_initGPIO (void)
    {
    
    (笑声)
    boardCfg = Board_init_PINMUX_config |
    Board_init_module_clock |
    Board_init_UART_stdio;
    
    Board_init (boardCfg);
    
    SettoVGPIO_Bank(); //在此处拨打电话
    
    
    
    。} 

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

    您好、Neo、

    我看到、即使 GPIO 的 INT_STAT 寄存器未设置、这意味着 GPIO 仍然不会生成中断。 那么、让我们首先尝试解决这个问题。  

    您能否分享引脚多路复用寄存器的值?

    Rgds、

    Brijesh

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

    您好、Brijesh:

    这是我们设置的相关引脚多路复用器、  

    attach 是全局板 pinmux_data.c

    e2e.ti.com/.../J721E_5F00_pinmux_5F00_data.c

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

    这里是我设置为 VGPIO_SEL 的值

    最恰当的考虑。

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

    您好 、Brijesh:

     我再次检查、发现在了解 PADCONFIG#N 和 GPIO 引脚之间的关系时出错、我更改为使用 PADCONFIG130和 PADCONFIG131并为 GPIO 中断更改 INT_STAT 寄存器值、但仍然无法进入 GPIO ISR。

     

    下面是感兴趣的代码 
    #define USS_TX_PIN_OFFSET (PIN_MCAN0_TX) #define USS_RX_PIN_OFFSET (PIN_MCAN0_RX) #define VGPIO_SEL_Bank (1U) #define VGPIO_OFFSET (4U) #define PADCONFIG_RX (*(volatile Int32_t*)(0x0011C000U + USS_TX_PIN_OFFSET) #define PADCONFIG_TX (*(volatile Int32_t*)= VCONFIG_POIN_BANC000+ VCONFIGN )= 0xPADCONFIG_OFFSET = VCONFIG_POIN_POIN_CONFIG1;VCONFIG1 = VCONFIG_POIN_POIN_CONFIG1 = VCONFIG_CL_POIN_POIN_CL_OFFSET = 0xP= VCONFIG_CONFIG_POIN_CONFIG1;VCONFIG1 + VCONFIG_POIN_POIN_POIN_CONFIG1 = VCONFIG1 + VCONFIGN = VCONFIG_POIN_POIN_POIN_POIN_POIN_POIN_CL_POIN_POIN_CL

    最恰当的考虑。

     

    Shuxin

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

    下面是寄存器值

    最恰当的考虑。

    Shuxin

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

    您好!

    我是说、您能否读回引脚多路复用寄存器并确认位18设置正确?  

    我通常将0x50007设置为 pinmux 寄存器、您还可以将 VGPIO 标志添加到 pinmux 寄存器。

    此致、

    Brijesh

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

    您好、Brijesh:

      是的、我读回 pinmux reg、该值=0x50007

    在我设置 VGPIO_SEL 后、寄存器值=0x50017

    我使用的引脚是

    /* My_GPIO1 -> GPIO1_1 -> W5 */
    {
    PIN_MCAN0_RX、PIN_MODE (7)|\
    ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE)&(~PIN_PULL_DIRECTION))
    }、
    /* My_GPIO1 -> GPIO1_2 -> W6 */
    {
    PIN_MCAN0_TX、PIN_MODE (7)|\
    ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE)&(~PIN_PULL_DIRECTION)) 

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

    您好、Brijesh:

      我的问题已经解决。 问题不在于 GPIO 引脚复用或 VGPIO。 这是导致 IRQ 资源请求失败的 GPIO_lib 陷阱。

      在重新编译之前、我必须转到 PDK 并清理 GPIO_lib。 然后构建我的演示。  

    原因如下:

      首先,我在 mcusw 中构建演示,它默认传递 core=mcu1_0以根据 depend 构建 PDK 库。这将使用  core=mcu1_0构建 GPIO_lib

       然后、我使用 core=MCU2_1构建演示、因为 pdk/gpio src 没有变化、因此默认情况下使用  core=mcu1_0构建的 GPIO_lib、

       导致  Sciclient_rmIrqSet 失败

     

       这是重新获取 IRQ 资源 wtih sciclient 时出现的问题。

      pdk_xx/packages/ti/drv/gpio/soc/j721e/gpio_soc.c 中的 GPIO_socConfigIntraPath
    #if defined (build_MCU1_0)|| defined (build_MCU1_1)
    if (r5CpuInfo.cpuid = 0U){
    dst_id = TISCI_DEV_MCU_R5FSS0_CORE0;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    } 否则{
    dst_id = TISCI_DEV_MCU_R5FSS0_Core1;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    }
    #Elif defined (build_MCU2_0)|| defined (build_MCU2_1)
    if (r5CpuInfo.cpuid = 0U){
    dst_id = TISCI_DEV_R5FSS0_CORE0;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    } 否则{
    dst_id = TISCI_DEV_R5FSS0_Core1;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    }
    #Elif defined (build_MCU3_0)|| defined (build_MCU3_1)
    if (r5CpuInfo.cpuid = 0U){
    dst_id = TISCI_DEV_R5FSS1_CORE0;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    } 否则{
    dst_id = TISCI_DEV_R5FSS1_Core1;
    dst_host_IRQ =(uint16_t) intCfg[pinNum].intNum;
    } 

    这意味着使用不同内核进行编译将使用 coresponding src_id。 因此、当我运行 MCU2_1、但 src_id 是 mcu1_0时、它会失败。