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:TMS320F28379D GPIO 和 ADC

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/861424/tms320f28379d-tms320f28379d-gpio-and-adc

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

大家好、

我将 TMDSCNCD28379D controlCARD 用于一个新项目、但我有两个问题。

第一个涉及输入模式下的 GPIO:

  • 当涉及 GPIO A 或 GPIO B 时、没有问题(例如、将 GPIO30配置为输入)
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;//在 GPIO30
GpioCtrlRegs.GPAMUX2.bit.GPIO30上启用上拉;//在 GPIO30
GpioCtrlRegs.GPADIR.bit.GPIO30上启用 GPIO = 0;//将 GPIO30配置为输出 
  • 但当涉及 GPIO C 时、我需要禁用上拉电阻(例如、将 GPIO74配置为输入)
GpioCtrlRegs.GPCPUD.bit.GPIO74 = 1;//禁用 GPIO74
GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 0;// GPIO74 = GPIO74
GpioCtrlRegs.GPCDIR.bit.GPIO74 = 0;// GPIO74 =输入 

这是硬件问题吗?

第二点不是问题,而是问题:

之前,我使用 TMS320F2812;要进行连续的 ADC 转换,我可以执行以下操作:

-开始 SEQ1转换:  

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; 

- 等待 EOS 上的中断(序列结束):  

while (AdcRegs.ADCST.bit.INT_SEQ1 = 0) 

-清除 SEQ1中断标志位:

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; 

-转换再次开始。

现在、对于28379D、我想使用软件触发器(INT1)。 我的工作方式如下:

ADC 配置:

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // SOC0将转换 ADC-A 上的引脚 A0
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; // SOC1将转换 ADC-A 上的引脚 A1
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; // SOC2将转换 ADC-A 上的引脚 A2
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; // SOC3将转换 ADC-A 上的引脚 A3

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3; // SOC3结束将在 ADC-A 上设置 INT1标志 

-开始转换:

AdcaRegs.ADCSOCFRC1.ALL = 0x000F;// SOC3、SCO2、SOC1和 SOC0 用于 ADC-A -转换开始 

- 等待 EOS 上的中断(序列结束):  

while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0); 

清除中断标志位:

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //确认 ADC-A 上的 INT1标志 

-但转换不会再次启动,我需要再次使用该指令:

AdcaRegs.ADCSOCFRC1.ALL = 0x000F;// SOC3、SOC2、SOC1和 SOC0 用于 ADC-A -转换开始 

这是正常的吗? 我是否每次都必须启动新的转换?

感谢您的回答。

此致、

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

    由于美国假期、您可以在12月3日之前收到回复

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

    您好、Electrocc、

    您能否澄清 GPC 组中输入的具体问题?  在这两种情况下、是否使用相同的源来驱动输入?  这是 GPC 上的任何输入、还是仅 GPIO74上的任何输入?  

    就 ADC 而言、是的、转换不会自动重启。  您可以通过软件再次强制转换、也可以设置 ADCINT1通过 SOC3重新触发 SOC0。  这种重新触发是通过 ADCINTSOCSEL1和 ADCINTSOCSEL2寄存器配置的。     

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

    您好 Devin、

    感谢您的回复。

    我今天无法进行测试、但我记得、我也尝试过 GPIO 64、GPIO72、同样出现了问题。

    谢谢你

    电极电路

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

    是的、我使用了完全相同的源来驱动输入。

    当上拉电阻使能时、输入被设置为1并且永不改变、在输入上为0或1。

    禁用上拉时、如果我们修改输入电平(0或1)、则输入会发生变化

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

    您好!

    2其他有关 ADC 的问题:

    • 对于旧的 MCU (F2812),我必须使用这些线路:
      while (AdcRegs.ADCST.bit.INT_SEQ1 ==0){}//等待 EOS 上的中断(序列结束)
      //软件等待=(HISPP*2)*(ADCCLKPS*2)*(CPS+1)个周期
      // =(1*2) *(3*2) *(0+1)= 12个周期
      asm (" RPT #12 || NOP"); 

      这是强制性的吗?

    • 我想使用 ADCINT1来启动一个新的转换、而不是每次使用软件启动一个新的转换。 但有问题:
      void Init_ADC (void)
      {
      
      EALLOW;//启用对受保护空间的写访问*//
      
      --复位 ADC。 这是一种良好的编程实践。
      DevCfgRegs.SOFT13.bit.ADC_A = 1;// ADC-A 复位
      DevCfgRegs.SOFTPRES13.bit.ADC_A = 0;// ADC-A 从复位中释放
      
      AdcaRegs.ADCSOC0CTL.bit.ACQPS = 30; // SOC0将在 ADC-A 上使用30个 SYSCLK 周期的采样持续时间
      AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; // SOC1将在 ADC-A 上使用30个 SYSCLK 周期的采样持续时间
      AdcaRegs.ADCSOC2CTL.bit.ACQPS = 30; // SOC2将在 ADC-A 上使用30个 SYSCLK 周期的采样持续时间
      AdcaRegs.ADCSOC3CTL.bit.ACQPS = 30; // SOC3将在 ADC-A 上使用30个 SYSCLK 周期的采样持续时间
      
      //---配置 ADC-A 基址寄存器
      AdcaRegs.ADCCTL1.ALL = 0x0004; //主 ADC 配置
      
      AdcaRegs.ADCCTL2.ALL = 0x000E; // ADC-A 时钟配置
      
      AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //为 ADC-A 加电
      
      DELAY_US (1000); //延迟1ms 以允许 ADC 加电时间
      
      AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; //禁用 INT1标志
      
      AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; //在用户清零 ADCINT1标志(在 ADCINTFLG 寄存器中)之前不会再产生 ADCINT1脉冲。
      
      AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3; // EOC3为 ADCINT1触发
      
      AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 1; // ADCINT1将在 ADC-A 上触发 SOC0
      AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 1; // ADCINT1将在 ADC-A 上触发 SOC1
      AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1; // ADCINT1将在 ADC-A 上触发 SOC2
      AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1; // ADCINT1将在 ADC-A 上触发 SOC3
      
      AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // SOC0将转换 ADC-A 上的引脚 A0
      AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; // SOC1将转换 ADC-A 上的引脚 A1
      AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; // SOC2将转换 ADC-A 上的引脚 A2
      AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; // SOC3将转换 ADC-A 上的引脚 A3
      
      EDIS;/*禁用对受保护寄存器的写入访问*/
      } 

      void main (void)
      {
      int Result1、Result2、Result3、result4、result5、 result6、result7、result8
      
      //
      //步骤1。 初始化系统控制:
      // PLL、看门狗、启用外设时钟
      //此示例函数位于 F2837xD_sysctrl.c 文件中。
      //
      InitSysCtrl();
      
      //
      //步骤2。 初始化 GPIO:
      //此示例函数位于 F2837xD_GPIO.c 文件中,
      //说明了如何将 GPIO 设置为其默认状态。
      //
      InitGpio();//针对本例跳过
      
      //
      //步骤3。 清除所有中断并初始化 PIE 矢量表:
      //禁用 CPU 中断
      //
      Dint;
      
      //
      //将 PIE 控制寄存器初始化为默认状态。
      //默认状态是禁用所有 PIE 中断并
      清除标志//。
      //此函数位于 F2837xD_PIECTRL.c 文件中。
      //
      InitPieCtrl();
      
      //
      禁用 CPU 中断并清除所有 CPU 中断标志:
      //
      IER = 0x0000;
      IFR = 0x0000;
      
      //
      //初始化 PIE 矢量表,其中包含指向 shell 中断
      //服务例程(service routines,ISR)的指针。
      //这将填充整个表,即使在
      本示例中未使用中断//也是如此。 这对于调试很有用。
      //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
      //此函数可在 F2837xD_PieVect.c 中找到
      //
      InitPieVectTable();
      
      //
      配置 ADC 并为其加电
      //
      init_adc ();
      
      
      //
      //启用全局中断和更高优先级的实时调试事件:
      //
      EINT;//启用全局中断 INTM
      ERTM;//启用全局实时中断 DBGM
      
      
      //
      在循环
      中无限地进行转换//
      操作
      {
      //
      //启用 ADCINT 标志
      //
      EALLOW;
      AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
      AdcaRegs.ADCINTFLGCLR.ALL = 0x0001;
      EDIS;
      
      //
      //软件强制启动 SOC0到 SOC3
      //
      AdcaRegs.ADCSOCFRC1.ALL = 0x000F;
      
      //等待 ADC-A 完成,然后确认标志
      //
      while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
      
      Result1 =((AdcaResultRegs.ADCRESULT0 >> 4));
      Result2 =((AdcaResultRegs.ADCRESULT1 >>4));
      Result3 =((AdcaResultRegs.ADCRESULT2 >> 4));
      result4 =((AdcaResultRegs.ADCRESULT3 >> 4));
      
      //等待 ADC-A 完成,然后确认标志
      //
      while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
      AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; 
      
      result5 =((AdcaResultRegs.ADCRESULT0 >> 4));
      result6 =((AdcaResultRegs.ADCRESULT1 >>4));
      result7 =((AdcaResultRegs.ADCRESULT2>> 4));
      result8 =((AdcaResultRegs.ADCRESULT3 >> 4));
      
      //
      //禁用 ADCINT1标志以停止采样
      //
      EALLOW;
      AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;
      EDIS;
      
      //
      //软件断点,再次点击运行以获取更新的转换
      //
      asm (" ESTOP0");
      } while (1);
      } 

      但他的软件在粗体显示的行之前停止。 我认为第二次转换不会启动。为什么?

    谢谢你。

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

    您好 、Electrocc、

    在同一个线程中、我们会遇到太多不同的问题(我们根据器件型号和 IP 分配 e2e 线程并为其提供服务)。  您能否为 GPIO 问题和有关 F2812 ADC 的问题制作新主题?

    对于 ADC 代码、该序列是否工作一次(到达第一个 Estop)或从未到达断点?

    根据粗略的外观、您的 ADC 配置似乎是正确的。   

    您可能需要在"Expressions"窗口中查看 ADC 寄存器、以查看是否所有配置都实现了这一点。 具体而言、我怀疑您在配置过程中调用的延迟函数; 您不应调用 EALLOW/EDIS 块中的任何其他函数、因为该函数可能会修改访问设置。    

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

    您好 Devin、

    我们不会打开一个新的线程,而是逐步进行;首先是 ADC。

    上述问题已得到解决。 重新启动笔记本电脑和控制卡后、现在每次都开始转换。

    但是、我是否需要在转换后使用这些线路、比如 F2812?

    软件等待=(HISPPC*2)*(ADCCLKPS*2)*(CPS+1)个周期
    // =(1*2) *(3*2) *(0+1)= 12个周期
    asm (" RPT #12 || NOP"); 

    此致、



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

     您好、电电路、

    如果 ADC 处于延迟中断模式、则一旦 ADCINT 标志变为高电平、最后一个结果就准备好立即读取。  通常需要使用此模式、尤其是在使用自旋等待循环而不是 ISR 的情况下。   

    如果 ADC 处于早期中断模式、则可能需要添加一些延迟。  您需要的最大延迟约为10.5个 ADCCLK (在12位模式下)。  您可以通过数据表中的 ADC 时序表来确定确切的时序。  您可以减去读取其他3个结果所需的时间(确定该时间的最佳方法可能是通过 CCS 中的分析器)。   如果您使用的是 ISR、则还可以减去 ISR 延迟。

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

    您好 Devin、

    感谢您的回答。

    您能不能只确认我的一点:我想计算转换序列的持续时间。
    如果我在早期中断模式中使用12位模式、4个信号进行转换(ADC-A 上的 SOC0至 SOC3)、持续时间为:

    T =(采集时间+转换时间)* 4个通道
    采集时间= SYSCLK *(ACQPS + 1)
        转换时间= 10、5 ADCCLK

    对吗?

    谢谢你。

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

    您好、Electrocc、

    是的、这大概是时间、但要获得准确的时间、请参阅数据表中的时序图:

    http://www.ti.com/document-viewer/TMS320F28377D/datasheet/adc-timings-in-12-bit-mode-sysclk-cycles-spruhm89183#spruhm89183

    这将告诉您触发和第一个 S+H 启动之间的增量以及转换阶段的 SYSCLK 周期的确切数量(大约为10.5个 ADCCLK、但根据所选的 SYSCLK 到 ADCCLK 分频器略有不同)。

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

    谢谢、

    因此、如果我想缩短转换序列的时间、那么使用4个 ADC、但仅使用 SOC0是好方法吗?
    通常时间将减少4?

    此致、

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

    您好、Electrocc、

    是的、通常在所有4个 ADC 上填充 SOC0插槽、并在任何 ADC 上使用 SOC1之前并行使用它们。  由于 SOC 将并行转换、因此这将快得多。  您通常需要将 S+H 设置为所有4个 SOC0所需的最长 S+H、以便 ADC 以锁步方式运行。   

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

    非常感谢、我明天将进行测试、我将告诉您。

    要结束本主题、您对我的 GPIO 问题有什么看法吗?
    如果我使用 GPIO C、则必须禁用上拉电阻才能将 GPIO74用作输入。

    此致、

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

    如果您不禁用上拉电阻、会发生什么情况?

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

    你好、Nima、

    如果我不禁用上拉电阻、那么即使我发送了低电平、GPIO74上的电平也始终为高电平(调试模式)。

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

    GPIO74没有什么不同。

    1、默认情况下禁用 GPIO 上拉电阻

    2.如果使用 GPIO 作为输入:

    • 通过设置 MUX 将引脚配置为 GPIO
    • 将 GPIO 配置为输入(方向)

    3.您是启用还是禁用上拉电阻器、都取决于您的原理图以及硬件的连接方式。 确保电路板未向 GPIO 输入路径添加任何其他信号。

    调试模式也意味着什么? 当您没有连接调试器时、它会起作用吗? 我非常怀疑这与你的问题有关。  

    您的应用中的某个位置有用于更改 GPIO 设置的代码、或者与该特定 GPIO 的硬件连接有一个您不希望看到的元件。

    NIMA Eskandari

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

    您好!

    您可能是对的、我认为这是一个硬件问题。

    谢谢你。

    此致、