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.

[参考译文] SK-AM62:如何计算 RCNT/XCNT?

Guru**** 2581045 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1550686/sk-am62-how-is-rcnt-xcnt-calculated

器件型号:SK-AM62


工具/软件:

尊敬的团队:

我尝试通过编程方式检索 XCNT 值、但我不确定该值的实际计算方式。
有人能解释用于推导 XCNT 值的计算方法吗?

我所使用的环境如下:

  • 外部 AHCLKX:24.5MHz
  • 采样频率:48,000 Hz
  • 帧周期:32 fs

我使用以下代码来读取 XCNT 值:

#define MCASP_XCLKCHK_OFFSET     0x00C8
volatile uint32_t *MCASP1_XCLKCHK   = (volatile uint32_t *)(CSL_MCASP1_CFG_BASE + MCASP_XCLKCHK_OFFSET);
#define XCKCHK_MAX 90
#define XCKCHK_MIN 70

void init_mcasp1_xclkchk()
{
    uint32_t val = CSL_REG32_RD(MCASP1_XCLKCHK);

    // clear
    val &= ((0x00 << 16) | (0x00 << 8));

    // Setting MAX/MIN
    val |= (XCKCHK_MAX << 16);
    val |= (XCKCHK_MIN << 8);
    // RPS (McASP system clock divided by 4)
    val |= (2 << 0);
    // write
    CSL_REG32_WR(MCASP1_XCLKCHK, val);
}

void chk_mcasp1_xcnt()
{
    uint32_t xcnt = (CSL_REG32_RD(MCASP1_XCLKCHK) >> 24) & 0xFF;
    uint32_t xmax = (CSL_REG32_RD(MCASP1_XCLKCHK) >> 16) & 0xFF;
    uint32_t xmin = (CSL_REG32_RD(MCASP1_XCLKCHK) >> 8) & 0xFF;
    DebugP_log("[MCASP1]XCNT: %3u | XMAX: %3u | XMIN: %3u\r\n", xcnt, xmax, xmin);
}

void clock_check_main(void *args)
{
    while(true) {
        chk_mcasp1_xcnt();
        DebugP_log("-----------------------------------------\r\n");
        vTaskDelay(pdMS_TO_TICKS(1*1000));
    }
}

下面是一个输出片段:

[MCASP1]XCNT:  82 | XMAX:  90 | XMIN:  70
-----------------------------------------
[MCASP1]XCNT:  81 | XMAX:  90 | XMIN:  70
-----------------------------------------
[MCASP1]XCNT:  82 | XMAX:  90 | XMIN:  70
-----------------------------------------
[MCASP1]XCNT:  82 | XMAX:  90 | XMIN:  70
-----------------------------------------
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    我阅读部分  12.1.1.4.15.6.2 传输时钟故障检查和恢复 、但我仍然不理解 XCNT 值是如何计算的。

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

    尊敬的 

    发送时钟故障 检测技术使用外部时钟和内部时钟的组合来确定外部时钟丢失。 从代码片段中、我可以看到 XCNT 值范围为 81 到 82。 Xmax 和 XMIN 参数似乎配置正确。 停止外部时钟时、您应该会看到 MCASP_XSTAT 寄存器的 XCKFAIL 位的值从 0 变为 1。  
    在您的测试中、您是否能够看到 XCKFAIL 位在时钟丢失时发生变化?
    您如何模拟外部发送时钟故障?

    我 试图找出 XCNT 值背后的数学方法。 会返回到您的位置。  

    此致、
    Ritapravo

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

    尊敬的 Ritapravo:
    感谢您的答复。

    在您的测试中、您是否能够看到 XCKFAIL 位在时钟丢失时发生更改?

    是的、我们在测试环境中确认 XCKFAIL 位随时钟丢失而变化。
    此外、当不是输入时钟时、XCNT 寄存器停止更新并始终返回相同的值。

    您如何仿真外部发送时钟故障?

    我们使用我们的定制设备输入 A2B 时钟、并模拟外部发送时钟故障。

    我正在 尝试找出 XCNT 值背后的数学方法。 会返回到您的位置。  [/报价]

    谢谢你。 我期待您的更新。
    我希望数学分析能够确认 XCNT 值 81 和 82 是有效的结果。

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

    尊敬的 Satoshi:

    感谢您的更新。

    此外、当不输入时钟时、XCNT 寄存器停止更新并始终返回相同的值。
    [/报价]

    如果没有外部时钟、此值不会改变。  

    此致、
    Ritapravo

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

    尊敬的 Ritapravo:
    谢谢你。
    我知道当外部时钟断开时、XCNT 值有效。

    我正在 尝试找出 XCNT 值背后的数学方法。 会返回到您的位置。  [/报价]

    请继续调查此事。

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

    尊敬的 Satoshi:

    XCNT 用于衡量每 32 个 AHCLK 脉冲有多少个 Fclk/XPS 脉冲。

    在您的设置中-  

    1.外部 AHCLKX: 24.5MHz
    2. XPS(XCLKCHK 寄存器 3:0 位) :4.
    3. McASP 功能时钟 (Fclk)- 250MHz

    因此、预期的 XCNT 值-  
      (32 *(Fclk / XPS)/ AHCLKX)
     = (32 *(250MHz / 4)/ 24.5MHz)
     = 81.63

    因此、得到的值大约是 81 和 82。

    此致、
    Ritapravo

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

    尊敬的 Ritapravo:

    谢谢、我现在了解了计算是如何进行的。
    我可以解决这个问题。

    此致、
    Satoshi