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.

[参考译文] TMS320F28379D:使用 TI 库、ADC 寄存器不变

Guru**** 2611705 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003876/tms320f28379d-using-ti-libraries-the-adc-registers-do-not-change

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

在程序中,将特定的逻辑块函数初始化为 Init.__()。 不幸的是,由于我不知道的原因,Init.adc ();和 Init.adcsOC ();不执行任何操作,即使调试器指示每行代码正在执行。 但是、器件寄存器不变。


主函数的开始

int main(void)
{
    Uint32 *emubootctrl = (Uint32 *)0xD00;
    EALLOW;
    *emubootctrl = 0x0B5A;
    EDIS;

    InitFlash();
    InitSysPll(XTAL_OSC, IMULT_20, FMULT_0, PLLCLK_BY_2); //200Mhz in the CPU, the flash should be configure for more faster CLK

    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;

    Init.GPIO();
    Init.CLA();
    Init.CLK_SUPPLY_pin();
    Init.PWM();
    Init.ADC();
    Init.ADCSOC();

(...)

init.adc ();和 Init.adcsOC ();它们不是 workinh

#include <stdafx.h>
#include <Init.h>
#include <math.h>
#include <string.h>
#include <IO.h>
#include "F2837xD_sdfm_drivers.h"

class Init_class Init;

(...) //I skipped the rest of classes that are working properly 

void Init_class::ADC()
{
    EALLOW;

    AdcaRegs.ADCCTL2.bit.PRESCALE = 6;
    AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
    AdccRegs.ADCCTL2.bit.PRESCALE = 6;

    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);
    AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    AdcSetMode(ADC_ADCC, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS  = 1;
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS  = 1;
    AdccRegs.ADCCTL1.bit.INTPULSEPOS  = 1;

    // ADCA config
    AdcaRegs.ADCINTSEL1N2.all = 0x0022; //enable ADCINT1 at EOC2
    AdcaRegs.ADCINTSOCSEL1.all = 0x0015; // ADCINT1 triggers SOC0,1,2

    // ADCB config
    AdcbRegs.ADCINTSEL1N2.all = 0x0023; //enable ADCINT1 at EOC3
    AdcbRegs.ADCINTSOCSEL1.all = 0x0055; // ADCINT1 triggers SOC0,1,2,3

    // ADCC config
    AdccRegs.ADCINTSEL1N2.all = 0x0022; //enable ADCINT1 at EOC2
    AdccRegs.ADCINTSOCSEL1.all = 0x0015; // ADCINT1 triggers SOC0,1,2

    EDIS;
}

void Init_class::ADCSOC()
{
    EALLOW;

    // ADCASOC config
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 100;
    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2;
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 100;
    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4;
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = 100;

    // ADCBSOC config
    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = 60;
    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = 60;
    AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2;
    AdcbRegs.ADCSOC2CTL.bit.ACQPS = 60;
    AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3;
    AdcbRegs.ADCSOC3CTL.bit.ACQPS = 60;

    // ADCCSOC config
    AdccRegs.ADCSOC0CTL.bit.CHSEL = 2;
    AdccRegs.ADCSOC0CTL.bit.ACQPS = 100;
    AdccRegs.ADCSOC1CTL.bit.CHSEL = 4;
    AdccRegs.ADCSOC1CTL.bit.ACQPS = 100;
    AdccRegs.ADCSOC2CTL.bit.CHSEL = 14;
    AdccRegs.ADCSOC2CTL.bit.ACQPS = 100;

    EDIS;
}

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

    您好,

    您是如何确定寄存器未更新的? 您能否提供更多详细信息?

    您使用的是 CCS 吗? 如果是,您是否检查了内存窗口/寄存器视图以检查寄存器是否正在更新?

    此致

    Siddharth

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

    我已在 LAUNCHXL 板上检查。 在调试模式下、我在 CCS 中打开了寄存器窗口、我可以看到 ePWM、包括时钟寄存器在内的处理器寄存器以及其他寄存器正在正确更新。  ADC 寄存器不变。

    这是另一个函数、CLA 配置。 这个可以正常工作

    void Init_class::CLA() //Source: Cla_good_exmple
    {
        EALLOW;
    
        CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
    
        //
        // Initialize and wait for CLA1ToCPUMsgRAM
        //
        MemCfgRegs.MSGxINIT.bit.INIT_CLA1TOCPU = 1;
        while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU != 1){};
    
        //
        // Initialize and wait for CPUToCLA1MsgRAM
        //
        MemCfgRegs.MSGxINIT.bit.INIT_CPUTOCLA1 = 1;
        while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1 != 1){};
    
        //
        // Select LS4RAM and LS5RAM to be the programming space for the CLA
        // First configure the CLA to be the master for LS4 and LS5 and then
        // set the space to be a program block
        //
    
        MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 1;
    
        MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 1;
    
        MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
    
        //
        // Next configure LS0RAM and LS1RAM as data spaces for the CLA
        // First configure the CLA to be the master for LS0(1) and then
        // set the spaces to be code blocks
        //
        MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 0;
    
        MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 0;
    
        MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
        MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;
        EDIS;
    
    
        EALLOW;
        Cla1Regs.MVECT1 = (uint16_t)(&Cla1Task1);
    
        Cla1Regs.MVECT2 =
        Cla1Regs.MVECT3 =
        Cla1Regs.MVECT4 =
        Cla1Regs.MVECT5 =
        Cla1Regs.MVECT6 =
        Cla1Regs.MVECT7 =
        Cla1Regs.MVECT8 = (uint16_t)(&Cla1Task1);
    
    //    Cla1Regs.MVECT2 = (uint16_t)(&Cla1Task2);
    //    Cla1Regs.MVECT3 = (uint16_t)(&Cla1Task3);
    //    Cla1Regs.MVECT4 = (uint16_t)(&Cla1Task4);
    //    Cla1Regs.MVECT5 = (uint16_t)(&Cla1Task5);
    //    Cla1Regs.MVECT6 = (uint16_t)(&Cla1Task6);
    //    Cla1Regs.MVECT7 = (uint16_t)(&Cla1Task7);
    //    Cla1Regs.MVECT8 = (uint16_t)(&Cla1Task8);
    
        DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = CLA_TRIG_XINT2;  //ADCCINT1 trigger
    
        Cla1Regs.MCTL.bit.IACKE = 1;
    
        Cla1Regs.MIER.bit.INT1 = 0;
        Cla1Regs.MIER.bit.INT2 = 0;
        Cla1Regs.MIER.bit.INT3 = 0;
        Cla1Regs.MIER.bit.INT4 = 0;
        Cla1Regs.MIER.bit.INT5 = 0;
        Cla1Regs.MIER.bit.INT6 = 0;
        Cla1Regs.MIER.bit.INT7 = 0;
        Cla1Regs.MIER.bit.INT8 = 0;
    
        XintRegs.XINT2CR.bit.ENABLE = 1;
        EDIS;
    
    //    CLA_vars();
    }

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

    您好,

    您的代码是否启用 ADC 外设? 加电时、所有外设被禁用;它们必须被启用才能运行或响应
    寄存器读取/写入。

    如果您使用的是 C2000Ware、则提供了任何 API 来启用外设。

    对于 ADCA、API 调用应如所示

     SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ADCA);

    此致

    Siddharth

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

    这很可能是我的问题。 哪些寄存器负责运行 ADCA? (我提出的原因是我不使用 API 的这一部分)

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

    好的、我找到了它。

    CpuSysRegs.PCLKCR13.bit.ADC_A
    AdcaRegs.ADCREV.bit.REV
    AdcaRegs.ADCSOCPRICTL.bit.RRPOINTER

    谢谢你