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.

[参考译文] MSPM0G1507:真随机发生器(TRNG)自检失败(错误的负结果)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1405708/mspm0g1507-true-random-generator-trng-self-test-fail-false-negative-result

器件型号:MSPM0G1507

工具与软件:

以下初始化代码不起作用、但如果将 TRNG_POST_TEST_CMD_DELAY 增加到520、则会起作用(返回 true)。

但是、如果使用以下代码段、以及稍后使用 CCS 将调试器附加到 while (1)并检查寄存器 TRNG->TEST_RESULTS、结果为0xFF (PASS)。

您能否提供一种方法来检查数字测试是否已完成?

MCLK= 32MHz

//See mspm0g1507 datasheet 7.23.2
#define TRNG_STARTUP_DELAY_US           520
//Weird, why do we need this
#define TRNG_POST_TEST_CMD_DELAY        400
static bool rng_init(void) {
    DL_TRNG_reset(TRNG);
    DL_TRNG_enablePower(TRNG);
    hal_delay_us(TRNG_STARTUP_DELAY_US);
    DL_TRNG_setClockDivider(TRNG, DL_TRNG_CLOCK_DIVIDE_2);  //Make sure in 9.6MHz - 20MHz range
    DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_NORM_FUNC);
    while (!DL_TRNG_isCommandDone(TRNG));
    DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_TEST_DIG);
    while (!DL_TRNG_isCommandDone(TRNG));
    hal_delay_us(TRNG_POST_TEST_CMD_DELAY);
    if (DL_TRNG_DIGITAL_HEALTH_TEST_SUCCESS != DL_TRNG_getDigitalHealthTestResults(TRNG)) {
        ////////code fall to here.
        // set_led_operation(LED_AMBER, LED_OP_ON);
        while(1);
        return false;
    }
    DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_TEST_ANA);
    while (!DL_TRNG_isCommandDone(TRNG));
    hal_delay_us(TRNG_POST_TEST_CMD_DELAY);
    if (DL_TRNG_ANALOG_HEALTH_TEST_SUCCESS != DL_TRNG_getAnalogHealthTestResults(TRNG)) {
        // set_led_operation(LED_GREEN, LED_OP_ON);
        while(1);
        return false;
    }
    DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_NORM_FUNC);
    while (!DL_TRNG_isCommandDone(TRNG));

    DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
    DL_TRNG_setDecimationRate(TRNG, DL_TRNG_DECIMATION_RATE_8);
    DL_TRNG_clearInterruptStatus(TRNG, (DL_TRNG_INTERRUPT_CAPTURE_RDY_EVENT));
    // DL_TRNG_enableInterrupt(TRNG, (DL_TRNG_INTERRUPT_CAPTURE_RDY_EVENT));

    //Discard the 1st output
    while (!DL_TRNG_isCaptureReady(TRNG));
    DL_TRNG_getCapture(TRNG);
    return true;
}

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

    您好、 

    请参阅 TRM 24.2.4.1数字块启动自检:

    The test sequence includes eight tests.
    Each test requires 1024 TRNG clock cycles to complete, 
    as 1024 samples are input to the digital block for each test.

    我想它需要400多 us。

    此致、

    Helic

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

    您是否意味着 cmd_done 标志不指示正在完成数字测试?

    模拟测试呢? 我记得参考手册中说要设置 cmd_done 标志。

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

    您好、 

    我认为器件需要超过400us 才能完成 数字测试。

    总共需要1024 * 8个时钟周期、一个周期为32MHz /2 = 16MHz。

    1/16000000 * 1024 * 8大到400us。

    模拟测试怎么样?

    您可以详细了解 24.2.4.2模拟块启动自检。

    它们将进行计算。

    此致、

    Helic

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

    我 问:

    cmd_done 标志是否指示自检完成?

    文档 slau846a (RM) 24.2.5.2部分、步骤5a 和5b 完全没有提及延迟。 此文档是否有问题? 6A 和6B。

    这是我更新的源代码、 由  Luke Ledbetter 在电子邮件中推荐:在执行下一个命令之前清除 CMD_DONE 标志、然后标志轮询为实数。

    问题现已解决、不再需要延迟。

    谢谢大家。

    //See mspm0g1507 datasheet 7.23.2
    #define TRNG_STARTUP_DELAY_US           520
    #define TRNG_POST_TEST_CMD_DELAY_US     1000
    
    static bool rng_init(void) {
        DL_TRNG_reset(TRNG);
        DL_TRNG_enablePower(TRNG);
        hal_delay_us(TRNG_STARTUP_DELAY_US);
        DL_TRNG_setClockDivider(TRNG, DL_TRNG_CLOCK_DIVIDE_2);  //Make sure in 9.6MHz - 20MHz range
        DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
        DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_NORM_FUNC);
        while (!DL_TRNG_isCommandDone(TRNG));
        DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
        DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_TEST_DIG);
        while (!DL_TRNG_isCommandDone(TRNG));
        DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
        hal_delay_us(TRNG_POST_TEST_CMD_DELAY_US);
        if (DL_TRNG_DIGITAL_HEALTH_TEST_SUCCESS != DL_TRNG_getDigitalHealthTestResults(TRNG)) {
            return false;
        }
        DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_TEST_ANA);
        while (!DL_TRNG_isCommandDone(TRNG));
        DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
        hal_delay_us(TRNG_POST_TEST_CMD_DELAY_US);
        if (DL_TRNG_ANALOG_HEALTH_TEST_SUCCESS != DL_TRNG_getAnalogHealthTestResults(TRNG)) {
            return false;
        }
        DL_TRNG_sendCommand(TRNG, DL_TRNG_CMD_NORM_FUNC);
        while (!DL_TRNG_isCommandDone(TRNG));
        DL_TRNG_clearInterruptStatus(TRNG, DL_TRNG_INTERRUPT_CMD_DONE_EVENT);
        DL_TRNG_setDecimationRate(TRNG, DL_TRNG_DECIMATION_RATE_8);
        // DL_TRNG_enableInterrupt(TRNG, (DL_TRNG_INTERRUPT_CAPTURE_RDY_EVENT));
    
        //Discard the 1st output
        while (!DL_TRNG_isCaptureReady(TRNG));
        DL_TRNG_clearInterruptStatus(TRNG, (DL_TRNG_INTERRUPT_CAPTURE_RDY_EVENT));
        DL_TRNG_getCapture(TRNG);
        return true;
    }