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.

[参考译文] AM2431:SDDF 在 ICSSG1 PRU1中不工作

Guru**** 2511985 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/1424230/am2431-sddf-not-working-in-icssg1-pru1

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

工具与软件:

您好!

我尝试使用基于 motor control SDK 的 single_chip_servo_am243x-lp_r5fss0-0_nortos 的 SDDF。

在本示例中、SDDF 为 ICSSG0和 PRU0。 我的电路板上是 ICSSG1 PRU1、芯片是 AM2431-ALV。

问题在于 gSddfChSamps 保持为0、rtuSddfIrqHandler 在初始化后绝不会触发。

修改如下、

1. MCLK_IEP_SYNC.c

e2e.ti.com/.../mclk_5F00_iep_5F00_sync.c

在该文件中、所有 CSL_PRU_ICSSG0_IPE0_BASE 都更改为 CSL_PRU_ICSSG1_IEP1_BASE。

    //  Set SYNC0/1 high pulse time in iep clok cycles  ( 7 clocks for 20 MHz at 300 MHz iep clk)
        //HW_WR_REG32(USED_IEP_BASE+CSL_ICSS_G_PR1_IEP0_SLV_SYNC_PWIDTH_REG, 0x0006);
        //  Set SYNC0/1 high pulse time in iep clok cycles  ( 5 clocks for 20 MHz at 200 MHz iep clk)
        HW_WR_REG32(USED_IEP_BASE+CSL_ICSS_G_PR1_IEP0_SLV_SYNC_PWIDTH_REG, 0x0004);

    //  Set SYNC0/1 period  ( 15 clocks for 20 MHz at 300 MHz iep clk)
        //HW_WR_REG32(USED_IEP_BASE+CSL_ICSS_G_PR1_IEP0_SLV_SYNC0_PERIOD_REG, 14);
        //  Set SYNC0/1 period  ( 10 clocks for 20 MHz at 300 MHz iep clk)
        HW_WR_REG32(USED_IEP_BASE+CSL_ICSS_G_PR1_IEP0_SLV_SYNC0_PERIOD_REG, 9);

时钟也会更新、因为基本时钟和 IEP 时钟更改为200MHz。 PRG1_PRU1_PGI16 (V12)可以成功输出20Mhz 时钟。

2. sddf.c

e2e.ti.com/.../sddf.c

在该文件函数 initSddf 中、

对于基于200MHz 时钟的20Mhz 输出、ECAP_DIVIDER 的默认值更改为9。

pruicssIep 更改为 IEP1

hSdfm->pruicssIep =(void *)(((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs)->iep1RegBase);

3. single_chip_servo.c.

e2e.ti.com/.../single_5F00_chip_5F00_servo.c

在该文件中、我删除了所有 endat 相关代码。

ICSSG 和 PRU 更改为 ICSSG1 PRU1。

/* Test ICSSG instance ID */
#define TEST_ICSSG_INST_ID              ( CONFIG_PRU_ICSS0 )
/* Test ICSSG slice ID */
#define TEST_ICSSG_SLICE_ID             ( ICSSG_SLICE_ID_1 )
/* Test PRU core instance IDs */
#define TEST_PRU_INST_ID                ( PRUICSS_PRU1 )
#define TEST_RTU_INST_ID                ( PRUICSS_RTU_PRU1 )

/* R5F interrupt settings for ICSSG */
#define ICSSG_PRU_SDDF_INT_NUM          ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG1_PR1_HOST_INTR_PEND_3 )  /* VIM interrupt number */
#define ICSSG_RTU_SDDF_INT_NUM          ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG1_PR1_HOST_INTR_PEND_4 )  /* VIM interrupt number */
#define ICSSG_TX_PRU_SDDF_INT_NUM       ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG1_PR1_HOST_INTR_PEND_5 )  /* VIM interrupt number */

IEP 时钟更改为200MHz

/* Test Sdfm parameters */
SdfmPrms gTestSdfmPrms = {
    200000000,   /*Value of IEP clock*/
    20000000,    /*Value of SD clock (It should be exact equal to sd clock value)*/
    0,                        /*enable double update*/
     10,       /*first sample  trigger time*/
     0,       /*second sample trigger time*/
    APP_EPWM_OUTPUT_FREQ,     /*PWM output frequency*/
    {{3500, 1000},    /*threshold parameters(High, low )*/
    {3500, 1000},
    {3500, 1000}},
    {{0,0},                /*clock sourse & clock inversion for all channels*/
    {0,0},
    {0,0}},
     15,   /*Over current osr: The effect count is OSR + 1*/
     64,   /*Normal current osr */
     0,   /*comparator enable*/
     (uint32_t)&gSddfChSamps /*Output samples base address*/
};

在函数 init_sddf 中、 CSL_PRU_ICSSG0_PR1_CFG_SLV_BASE 更改为 CSL_PRU_ICSSG1_PR1_CFG_SLV_BASE

/* Configure g_mux_en to PRUICSS_G_MUX_EN in ICSSG_SA_MX_REG Register. */
    HW_WR_REG32((CSL_PRU_ICSSG1_PR1_CFG_SLV_BASE+0x40), PRUICSS_G_MUX_EN);

其余与 PWM 相关的更改。  可以正常进入 PWM 中断 App_epwmIntrISR、PWM 输出保持50%。

谢谢!

建宇

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

    另一个问题是、我还尝试将函数 single_chip_servo_main 放入 FreeRTOS 中。 它会在 init_sddf()之后输入 data_abort_handler。

    很奇怪,虽然它没有  在函数 init_sddf()中输入 data_abort_handler ,但直到它到达 whil(1)循环。 我想这与 Σ-Δ 结果 gSddfChSamps 有关? 无论如何、我会在修复主要问题后再试一次。

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

    最新动态:

    对于 SDDF 中断未触发问题、我们目前正在使用 AMC1306。 我测量了它的引脚7 CLKin、20Mhz、并且引脚6 DOUT 具有输出。

    有一个不同之处、我跳过了我们的实验板仅测量通道1和2。  跳过通道0 (PRG1_PRU1_GPO3)。  

    此设置是否也需要对代码进行一些更改?

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

    Jainyu、您好!

    感谢您的提问。

    我会检查一下、然后回复给您。

    此致

    Achala Ram

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

    Jainyu、您好!

    您是否在 SysConfig 中选择了正确的 icssg 实例并将正确的实例 ID 传递给 PRUICSS_OPEN() API? 请分享 SysConfig 更改。

    同时、您可以检查以下各项:

    • 停止 ICSSG1 PRU1内核并检查固件残桩的位置  
    • 检查 IEP 寄存器、确定是否命中 cmp4

    谢谢、此致  

    Achala Ram

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

    SysConfig:

    e2e.ti.com/.../CD3E_5F00_AP_5F00_nortos.zip

    停止 ICSSG1 PRU1内核并检查固件存根的位置 

    我猜它卡在这里了吗? 我停了几次,它总是在这里。

    检查 IEP 寄存器、是否点击了 cmp4

    这是 icssg1 iep1的 IEP_CM4_REG0吗?

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

    仅用于 ICSSG1 IEP0  

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

    哦、SD 时钟在 PRG1_PRU1_IEP1 PRG1_PRU1_GPO19/V19中配置。 仅当配置了 IEP1时、它才会输出20Mhz。

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

    因此、今天我还尝试根据 ICSS_sdfm_three_channel_with_phase_compensation 使用 SDFM。 此时使用 ICSSG1_PRU1。 当内核停止时、它也卡在 WAIT_LOOP 中。

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

    它等待 IEP0 cmp4事件命中、所以你可以检查 IEP0寄存器。 您需要检查以下寄存器  

    • 应设置 IEP_CMP_CFG_REG、第5位  
    • IEP_CMP_STATUS_REG、当 CMP4获得命中时、应设置第4位

    • IEP_CMP4_REG0、该寄存器不应为零  

    另请检查以下事项

    • SysConfig 中 ICSSG1 PRU1 SDFM 的引脚多路复用
    • ICSSG1的 R5F 中断设置
    • 选择正确的 ICSSG1切片 ID


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

    因此、我现在将使用  ICSS_sdfm_three_channel_with_phase_compensation。

    [报价 userid="544168" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1424230/am2431-sddf-not-working-in-icssg1-pru1/5465010 #5465010"]
    • 应设置 IEP_CMP_CFG_REG、第5位  
    • IEP_CMP_STATUS_REG、当 CMP4获得命中时、应设置第4位

    • IEP_CMP4_REG0、该寄存器不应为零
    [报价]

    IEP_CMP_CFG_REG = 0xC、 IEP_CMP_STATUS_REG 保持0、IEP_CMP4_REG0保持0。

    我检查了函数 SDFM_configIepSyncMode、这里写入了0xC。 我找不到任何  更新  IEP_CMP4_REG0值的代码

            /*Enable cmp1 and cmp2 for sync start trigger generation*/
            regVal = HW_RD_REG8((uint8_t *)pruIep + CSL_ICSS_G_PR1_IEP0_SLV_CMP_CFG_REG);
            regVal |= (1<<SDFM_IEP_CMP1_EN_SHIFT)|(1<<SDFM_IEP_CMP2_EN_SHIFT);
            HW_WR_REG32((uint8_t *)pruIep + CSL_ICSS_G_PR1_IEP0_SLV_CMP_CFG_REG, regVal);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="544168" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1424230/am2431-sddf-not-working-in-icssg1-pru1/5465010 #5465010"] SysConfig 中 ICSSG1 PRU1 SDFM 的 PIN 多路复用

    此处只有 V 和 W、因此 未选择通道0和 SD_CHANNEL0_DATA。

    其余的都是一样的

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

    我已经在 LP-AM243X 板和我自己的板上完成了调试。   

    [报价 USERID="622144" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1424230/am2431-sddf-not-working-in-icssg1-pru1/5466891 #5466891"]IEP_CMP_CFG_REG = 0xC、 IEP_CMP_STATUS_REG 保持0、IEP_CMP4_REG0保持0 [/报价]

     一旦在 initSdfmFw 内调用函数 SDFM_enable、IEP_CMP_CFG_REG 就会变为0x2C、IEP_CMP4_REG0就会开始计数。

    SDFM 固件有这个问题吗? 我记得 BissC 固件需要修改才能用于 不同的 PRU

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

    尊敬的 Achala:

    我已经测量了 PRG1_PRU1_GPO19。 当 initSdfmFw 使用 IEP0时、没有 clok 输出。 如果我使用 IEP1、CLK 似乎有效。

    如何将此引脚映射到 IEP0?

    谢谢

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

    昨天、我没有重置系统以便 IEP0和 IEP1都在运行。 在仅配置 IEP0的下电上电后、不会触发 SDFM 中断。

    我当前修改了函数  initSdfmFw、init IEP0和 IEP1。 我认为、如果 PRG1_PRU1_GPO19可以映射到 IEP0、则可以删除此代码

    #if (CONFIG_SDFM0_CLK_FROM_IEP != 0)
        /* IEP clock 300MHz, SD clk = 20Mhz
          Div = 300/20 = 15, one period time = 15 IEP cycles, high plus time = 7 IEP cycles  */
        uint32_t highPulseWidth = 6; /*7 - 1*/
        uint32_t periodTime = 14;  /* 15 - 1*/
        uint32_t syncStartTime = 0; /*clock generation start time.*/
        SDFM_configIepSyncMode(hSdfm, highPulseWidth, periodTime, syncStartTime);
        SDFM_enableIep(hSdfm);   
    
    
        hSdfm->pruicssIep = (void *)(((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->iep1RegBase);
        SDFM_configIepSyncMode(hSdfm, highPulseWidth, periodTime, syncStartTime);
        SDFM_enableIep(hSdfm);
    
        hSdfm->pruicssIep = (void *)(((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->iep0RegBase);
    #endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    修改了函数  initSdfmFw、初始化 IEP0和 IEP1

    完成这些更改后、20MHz 时钟应位于  PRG1_PRU1_GPO19上!

    #if (CONFIG_SDFM0_CLK_FROM_IEP!= 0)

    在此#if 条件下、代码用于通过 IEP 为 SDFM 生成时钟、SDK 示例使用 IEP0、但也可以通过 IEP1生成时钟。

    SDFM 固件不依赖时钟生成!!

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

    否、我已经测量了引脚、仅当也配置了 IEP1时、时钟才输出。

    因此在 SysConfig 中、PRU IEP 部分 V12似乎映射到 IEP1。

    选择 IEP0时、V12变为灰色、不可选择。

    根据您的论点、我认为 V12也可以映射到 IEP0。 但没有时钟。 昨天的项目我必须首先运行 IEP1代码、然后运行 IEP0代码、并获得 SD_Clock。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据您的论点、我相信 V12也可以映射到 IEP0

    否、V12仅映射了 IEP1同步输出!! 要在 PRG1_PRU0_GPIO19引脚上获取时钟、您需要为 IEP0选择 PRG1_PRU0_GPIO19/W7。 对 IEP1引脚进行引脚复用将不适用于 IEP0。

    BR、

    Achala Ram

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

    是的、IEP0和 IEP1的 SYNC 引脚不同、不允许为两个 IEP 选择相同的引脚。  

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

    好的、目前我们的硬件设计是使用 PRG1_PRU1_GPIO19输出20Mhz 时钟。 因此、我似乎必须初始化 IEP0和 IEP1才能获得输出。  

    我们最好将其改回 PRG1_PRU0_GPIO19以便仅使用 IEP0、对吧?

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

    是的、IEP1用于获取  PRG1_PRU1_GPIO19引脚上的时钟、IEP0用于获取用于 SDFM 采样的 IEP0 CMP4命中!

    并且最好将它改回 PRG1_PRU0_GPIO19、以便只使用 IEP0、正确吗?

    是的、正确!!