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.
大家好、
我将 TMDSCNCD28379D controlCARD 用于一个新项目、但我有两个问题。
第一个涉及输入模式下的 GPIO:
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;//在 GPIO30 GpioCtrlRegs.GPAMUX2.bit.GPIO30上启用上拉;//在 GPIO30 GpioCtrlRegs.GPADIR.bit.GPIO30上启用 GPIO = 0;//将 GPIO30配置为输出
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 的问题:
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");
这是强制性的吗?
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、
是的、这大概是时间、但要获得准确的时间、请参阅数据表中的时序图:
这将告诉您触发和第一个 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 作为输入:
3.您是启用还是禁用上拉电阻器、都取决于您的原理图以及硬件的连接方式。 确保电路板未向 GPIO 输入路径添加任何其他信号。
调试模式也意味着什么? 当您没有连接调试器时、它会起作用吗? 我非常怀疑这与你的问题有关。
您的应用中的某个位置有用于更改 GPIO 设置的代码、或者与该特定 GPIO 的硬件连接有一个您不希望看到的元件。
NIMA Eskandari
您好!
您可能是对的、我认为这是一个硬件问题。
谢谢你。
此致、