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.

[参考译文] LAUNCHXL-F28P55X:最新的 C2000Ware 中缺少 ADC 开路/短路自检示例代码

Guru**** 2837210 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1576563/launchxl-f28p55x-adc-open-short-circuit-self-test-example-code-missing-in-latest-c2000ware

器件型号: LAUNCHXL-F28P55X
主题中讨论的其他器件: C2000WARE

工具/软件:

您好:

我正在努力在 TMS320F28P55x 上实现 ADC 开路和短路自检

我可以看到 器件 TRM 的模拟子系统部分中提到的与开路/短路自检相关的寄存器、但我 在最新的 C2000Ware 版本中找不到任何相应的示例代码。

请确认:

  1. 无论任何 C2000Ware 版本中是否提供此测试的示例实现代码或驱动程序支持?

  2. 如果没有、是否有任何建议的步骤或寄存器配置来手动触发和验证开路/短路自检?

也欢迎参考与此功能相关的应用手册或示例工程。

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

    很遗憾、C2000Ware 中没有相关示例。 我最近为 F29 器件创建了一个应该相似的例程、因此我可以在这里分享一个相关的片段、并解释我做了什么。

    首先为要测试的通道设置 ADC/SOC、 一些具体信息:

    • 仅使用软件触发器可能最有意义。
    • 您可以设置 ADC 中断来在转换完成时发出信号。
    • 您将在 TRM 中看到一条注意事项、由于使用此模式时具有高驱动阻抗、因此需要更长的 S+H 持续时间。 我刚用 512 开始,但你可以做一些计算,并得到一个较短的持续时间。

    然后循环使用不同的 OSDETECT 模式。 对于每个转换、设置模式、稍等片刻以提供稳定时间(我使用了 2 微秒,但您可能需要进行调整)、触发 ADC 转换、等待完成、然后获得结果。 您不一定需要执行所有模式。 下面片段中显示的 4 应该足够了。

        /*
         * Test full scale
         */
        ADC_configOSDetectMode(adcBase, ADC_OSDETECT_MODE_VDDA);
        SysCtl_delay(settlingTime);
        ADC_clearInterruptStatus(adcBase, ADC_INT_NUMBER1);
        ADC_forceSOC(adcBase, ADC_SOC_NUMBER0);
        while(!ADC_getInterruptStatus(adcBase, ADC_INT_NUMBER1))
        {
            ; /* Wait for conversion to complete */
        }
        testResults[FULL_SCALE] = ADC_readResult(adcResBase, ADC_SOC_NUMBER0);
    
        /*
         * Test 7/12 scale
         */
        ADC_configOSDetectMode(adcBase, ADC_OSDETECT_MODE_7BY12_VDDA);
        SysCtl_delay(settlingTime);
        ADC_clearInterruptStatus(adcBase, ADC_INT_NUMBER1);
        ADC_forceSOC(adcBase, ADC_SOC_NUMBER0);
        while(!ADC_getInterruptStatus(adcBase, ADC_INT_NUMBER1))
        {
            ; /* Wait for conversion to complete */
        }
        testResults[SEVENbyTWELVE_SCALE] = ADC_readResult(adcResBase, ADC_SOC_NUMBER0);
    
        /*
         * Test 5/12 scale
         */
        ADC_configOSDetectMode(adcBase, ADC_OSDETECT_MODE_5BY12_VDDA);
        SysCtl_delay(settlingTime);
        ADC_clearInterruptStatus(adcBase, ADC_INT_NUMBER1);
        ADC_forceSOC(adcBase, ADC_SOC_NUMBER0);
        while(!ADC_getInterruptStatus(adcBase, ADC_INT_NUMBER1))
        {
            ; /* Wait for conversion to complete */
        }
        testResults[FIVEbyTWELVE_SCALE] = ADC_readResult(adcResBase, ADC_SOC_NUMBER0);
    
        /*
         * Test zero scale
         */
        ADC_configOSDetectMode(adcBase, ADC_OSDETECT_MODE_VSSA);
        SysCtl_delay(settlingTime);
        ADC_clearInterruptStatus(adcBase, ADC_INT_NUMBER1);
        ADC_forceSOC(adcBase, ADC_SOC_NUMBER0);
        while(!ADC_getInterruptStatus(adcBase, ADC_INT_NUMBER1))
        {
            ; /* Wait for conversion to complete */
        }
        testResults[ZERO_SCALE] = ADC_readResult(adcResBase, ADC_SOC_NUMBER0);
    
        ADC_configOSDetectMode(adcBase, ADC_OSDETECT_MODE_DISABLED);

    然后您可以查看结果。 如果我在未连接引脚的情况下对 EVM 运行测试、则 VDDA、7BY12、5BY12 和 VSSA 模式的结果分别约为 4,095,25025001800 和 0、允许的错误为+/- 100。 不过、预期的结果和可接受的误差量将取决于您的系统以及您连接到引脚的内容、如 TRM 中所述。

    Whitney

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



    这是 adc.h 中 f28p55x 的 configOSDetectMode 代码
    C2000Ware v6.00.00.00

    此处 ADC 和 AnalogSubsystem 配置将如何更改??
    您能给我分享一下相关更新代码吗?

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

    抱歉、我没有意识到 F28P55x 的 OSDETECT 结构略有不同。  

    区别似乎在于 OSDETECT 是模拟子系统的一部分并在 ADC 实例之间共享。 可以使用 ADC_configOSDetectMode 除了采用之外、看起来几乎相同 ANALOGUESUBSYS_BASE 基址。 还有一个单独的启用/禁用位、所以您需要使用 ADC_enableOSDetectMode ADC_disableOSDetectMode

    最后调用一个函数 ASysCtl_setAnalogReferenceB 这似乎可以选择 OSDETECT 电路连接到哪个实例。 根据 TRM、 ASYSCTL_TESTANA1_ENABLE 使用 OSDETECT 时、选项应该用于 modeVal 参数。 然后、您可以将其设置回 ASYSCTL_TESTANA0_TESTANA1_DISABLE 自动关闭。

    我会在下周初找到一些时间来尝试自己并更新你,但我想现在分享信息,以防你想看看你是否可以让它在那之前工作。

    Whitney

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

    感谢您的耐心。 我附上了一些在 F28P55x 上适用于我的示例代码。

    e2e.ti.com/.../f28p55x_5F00_osdetect.c

    遗憾的是、在使其正常运行时、我们发现了一些 driverlib 错误。 我将分享以下更新后的函数:

    ADC.h:

    //*****************************************************************************
    //
    //! Enables Open/Shorts Detection Circuit logic.
    //!
    //! \param base is the base address of the ASYSCTL.
    //!
    //! This function enables the open/short detection circuit logic. Use
    //! ADC_configOSDetectMode() to configure the mode of open/shorts detection
    //! circuit.
    //!
    //! \return None.
    //
    //*****************************************************************************
    static inline void
    ADC_enableOSDetectMode(uint32_t base)
    {
        //
        // Check the arguments.
        //
        ASSERT(ADC_isBaseValid(base));
    
        //
        // Enable open/shorts detection circuit.
        //
    
        EALLOW;
        HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ADCOSDETECT) |= ASYSCTL_ADCOSDETECT_OSDETECT_EN;
        HWREGH(base + ADC_O_CONFIG2) = 0x2U;
        EDIS;
    }
    
    //*****************************************************************************
    //
    //! Disables Open/Shorts Detection Circuit logic.
    //!
    //! \param base is the base address of the ASYSCTL.
    //!
    //! This function disables the open/short detection circuit logic.
    //!
    //! \return None.
    //
    //*****************************************************************************
    static inline void
    ADC_disableOSDetectMode(uint32_t base)
    {
        //
        // Check the arguments.
        //
        ASSERT(ADC_isBaseValid(base));
    
        //
        // Disable open/shorts detection circuit.
        //
    
        EALLOW;
        HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ADCOSDETECT) &= ~ASYSCTL_ADCOSDETECT_OSDETECT_EN;
        HWREGH(base + ADC_O_CONFIG2) = 0x0U;
        EDIS;
    }

    asysctl.h:

    //*****************************************************************************
    //
    //! Configure the analog reference B.
    //!
    //! \param adcInst is the instance of the ADC.
    //! \param modeVal is the desired ADC Test Mux mode.
    //!
    //! This function configures the analog reference B for ADC. The \e modeVal
    //! parameter selects which mode needs to be configured for the desired
    //! \e adcInst. Valid values for \e modeVal can be referred from the enum
    //! \e ASysCtl_ADCTestMuxMode.
    //!
    //! \return None.
    //
    //*****************************************************************************
    static inline void ASysCtl_setAnalogReferenceB(ASysCtl_AdcInst adcInst,
                                                    ASysCtl_ADCTestMuxMode modeVal)
    {
        uint32_t shiftVal;
    
        shiftVal = adcInst + ASYSCTL_REFCONFIGB_ADC_ATB_ENA_S;
    
        EALLOW;
        HWREG(ANALOGSUBSYS_BASE + ASYSCTL_O_REFCONFIGB) =
                        (HWREG(ANALOGSUBSYS_BASE + ASYSCTL_O_REFCONFIGB) &
                        ~((uint32_t)0x3 << shiftVal)) |
                        ((uint32_t)modeVal << shiftVal);
        EDIS;
    }
    
    

    我们将在未来的 C2000Ware 版本中修复这些问题。

    Whitney

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

    我运行了您共享的示例代码以及中建议的更改 adc.h asysctl.h 。 但是、每次我尝试运行测试都会失败。

    我正在使用 LAUNCHXL-F28PF28P55x LaunchPad 测试用例。
    我是否缺少此设置所需的特定功能?

    请帮助我了解使此测试正常工作是否需要任何其他步骤或配置。

    谢谢、
    Dikshith

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

    能否查看 LaunchPad 上 F28P55x 的器件版本? 我应该已经提到,你至少需要一个修订版 A 设备才能正常工作 — 修订版 0 没有启用此功能。

    Whitney

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

    您好  Whitney、

    我查看了器件版本。
    我最初有一个 Rev 0 器件、它无法按预期工作。
    然后、我在 Rev A 器件上测试了相同的代码、并且运行正常。

    感谢您为我指明正确的方向。

    此致、
    Dikshith