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.

[FAQ] [参考译文] [常见问题解答]如何为 PRU GPIO 启用 GPO 和 GPI 操作之间的切换功能?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1386144/faq-how-to-enable-switching-capability-between-gpo-and-gpi-operation-for-pru-gpio

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

工具与软件:

每个 PRU_ICSSG PRU 处理器都通过其 R30寄存器实现快速 GPO、通过 R31寄存器实现快速 GPI。 AM64x/AM243x 具有20个引脚输出 PRU GPIO 引脚、该器件使用不同的多路复用模式将所有 GPI 信号及其相应的 GPO 信号多路复用到同一引脚上。

如何从 PRU 固件代码在 GPO 和 GPI 操作之间切换?

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

    适用于 AM64x 和 AM243x 的 PRU GPIO 双向模式

    我们可以在双向模式下对 PRU GPIO 引脚进行编程、以便能够从 PRU 在 GPO 和 GPI 操作之间切换。 GPO/GPI 引脚的特殊 I/O 引脚连接是 是使用 IEP EDIO 信号控制实现的 使用单个 SoC 电平引脚多路复用模式来提供输入/输出切换。

    IEP EDIO 接口具有32个数据输出使能(DATA_OUT_EN)信号、对应于其32个数据输入和32个数据输出信号。 在器件上、每个 PRU_ICSSG 模块的 IEP0 EDIO (没有 IEP1 EDIO) I/O 中只有4个引脚输出(PRG[2:0]_IEP0_EDIO_DATA_IN_OUT[31:28])。  

    当为配置 I/O 引脚时、未使用的输出使能可选择重新用作 GPO 使能、从而允许每个 ICSSG GP 引脚用作 GPO 或 GPI  GPO 多路复用模式 .  一组 SoC 电平寄存器(CTRLMMR_ICSSG[2:0]_CTRL[2:0])用于确定每个 GPO 模式引脚的行为。

    默认情况下、[19-0]GPM_Bidi 位字段设置为0h、相应的 GPO 引脚仅在选择 GPO 多路复用模式时作为输出运行。 相应的 GPI 信号(ICSSG GPI[19:0]输入)被驱动为低电平。

    当寄存器的[19-0]GPM_Bidi 位字段设置为1h 时、相应的 ICSSG_DIGIO_DATA_OUT_EN_REG[31-0] DATA_OUT_EN 位字段用于控制 GPO 输出缓冲区。

    • 如果[31-0] DATA_OUT_EN 位字段设置为0h、则驱动输出、该引脚充当 GPO。
    • 如果[31-0] DATA_OUT_EN 位字段设置为1h、则输出被禁用、该引脚用作 GPI。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 PRU IO 空项目中启用双向模式的步骤:

    导入 CCS 工程、

    1. 浏览到目录 MCU_PLUS_SDK/examples/PRU_IO/empty/
    2. 将 R5F 工程(empty_pru_io_am64x-evm_r5fss0-0_freertos_ti-arm-clang)和 PRU 工程(empty_am64x-evm_icssg0-pru0_fw_ti-pru-cGT)导入 CCS。

    修改 R5F 项目-

    1. 打开 SysConfig 并在"TI Drivers"下添加 PRU (ICSS)实例。
    2. 在新添加的实例中、转至"Additional ICSS settings"(其他 ICSS 设置)>"PRU (ICSS) GPIO"(PRU (ICSS) GPIO)并将新元素添加至 PRU (ICSS) GPIO。
    3. 选择您要处理的 GPO 信号、并确保选中 μ‘ Rx '  GPO 引脚为选项、以确保在将 Rx 更改为 GPI 时启用 GPI。


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

    修改 PRU 项目-

    以下代码启用 PRU GPIO[6-0]的双向功能并将 GPO3转换为 GPI3。 将 main.asm 文件中的寄存器空间(零&r0120)清除后出现的代码替换为以下代码。

    1. CTRL_MMR0模块有一种保护机制(LOCKi_KICK0和 LOCKi_KICK1寄存器)可防止虚假写入更改寄存器的值。 保护机制的解锁过程记录在这里-  TRM 第 5.1.3.1.2节 KICK 保护寄存器。

      PIN_CONTROL:
          ;Unlock CTRLMMR kick protection registers
          ldi32   TEMP_REG, 0x68EF3490
          ldi32   CTRL_REG, 0x43001008
          sbbo    &TEMP_REG, CTRL_REG, 0, 4
          
          ldi32   TEMP_REG, 0xD172BC5A
          ldi32   CTRL_REG, 0x4300100C
          sbbo    &TEMP_REG, CTRL_REG, 0, 4
          
          ldi32   TEMP_REG, 0x68EF3490
          ldi32   CTRL_REG, 0x43005008
          sbbo    &TEMP_REG, CTRL_REG, 0, 4
          
          ldi32   TEMP_REG, 0xD172BC5A
          ldi32   CTRL_REG, 0x4300500C
          sbbo    &TEMP_REG, CTRL_REG, 0, 4 


    2. 通过设置 CTRLMMR_ICSSG[2:0]_CTRL[2:0]寄存器中的相应位字段[19-0]GPM_Bidi、可以使任何 GPO (多路复用模式0功能)双向进行。

          ;Set bits 0-6 of CTRLMMR_ICSSG0_CTRL0 to 1 to enable PRU fast GPIO as bidirectional
          ldi32   TEMP_REG, 0x7F
          ldi32   CTRL_REG, 0x43004100
          sbbo    &TEMP_REG, CTRL_REG, 0, 4 


    3. 将 [31-0] DATA_OUT_EN 位字段设置为1h 会禁用输出、该引脚充当 GPI。

          ;Set bits in IEP_DIGIO_DATA_OUT_EN_REG, GPIO 3 to inputs, rest as outputs
          ldi32   TEMP_REG, 0x08
          ldi32   EN_REG,   0x2e314
          sbbo    &TEMP_REG, EN_REG, 0, 4 
          
          halt ;end of program


    构建和运行示例-

    按照此处的步骤- example_pru_empty 来构建和运行该示例

    测试功能 -

    通过向相应的 R30寄存器位写入1h 并将其外部环回到 GPI3、将其中一个 GPO 引脚设置为高电平。 因此、R31寄存器的值应在 GPI3中接收到高电平信号时发生变化。

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

    其他说明 :解锁 CTRLMMR 保护机制和双向配置是一次性设置,可以在 R5F 侧添加如下所示。

    #define KICK0_UNLOCK_VAL              (0x68EF3490U)
    #define KICK1_UNLOCK_VAL              (0xD172BC5AU)
    #define CSL_MAIN_LOCK0_KICK0_OFFSET   (0x1008)
    #define CSL_MAIN_LOCK1_KICK0_OFFSET   (0x5008)
    void config_CTRLMMR()
    {
    uint32_t            baseAddr;
    volatile uint32_t  *kickAddr;
    volatile uint32_t  *regAddr = (volatile uint32_t *)((uint32_t)0x43004100);
    
    baseAddr = (uint32_t)(0x43000000);
    /* Lock 0 */
    kickAddr = (volatile uint32_t *) (baseAddr + CSL_MAIN_LOCK0_KICK0_OFFSET);
    CSL_REG32_WR(kickAddr, KICK0_UNLOCK_VAL);   /* KICK 0 */
    kickAddr++;
    CSL_REG32_WR(kickAddr, KICK1_UNLOCK_VAL);   /* KICK 1 */
    
    /* Lock 1 */
    kickAddr = (volatile uint32_t *) (baseAddr + CSL_MAIN_LOCK1_KICK0_OFFSET);
    CSL_REG32_WR(kickAddr, KICK0_UNLOCK_VAL);   /* KICK 0 */
    kickAddr++;
    CSL_REG32_WR(kickAddr, KICK1_UNLOCK_VAL);   /* KICK 1 */
    
    CSL_REG32_WR(regAddr, 0x0000007F);  

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

    下面随附了为 PRU GPIO 启用双向模式的修改后 PRU IO 空工程文件。

    e2e.ti.com/.../pru_5F00_gpio_5F00_bidirectional_5F00_mode_5F00_enable_5F00_projects.zip