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.

[参考译文] CCS/TMS320F28069M:当我尝试使用通过 SPI 接口接收的数据时、程序停止运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/611963/ccs-tms320f28069m-program-stops-running-when-i-try-to-use-the-data-received-through-spi-interface

器件型号:TMS320F28069M
主题中讨论的其他器件:DAC128S085EVM

工具/软件:Code Composer Studio

您好!

我使用 C2000板从 ADC (MAX1202)收集数据、我还使用 DAC Booster Pack (DAC128S085EVM)。 从这些器件发送或接收数据没有问题、但是、当我尝试使用从 ADC 接收到的数据进行一些计算时、我的程序停止运行。

项目内容如下 https://db.tt/QHnD94zKVM

代码相当大、主要问题是:

1) spibphb = SpibRegs.SPIRXBUF;
   while (SpibRegs.SPIFFRX.bit.RXFFST!=1){}
   spibphc = SpibRegs.SPIRXBUF;

2)我组合从 ADC 获取的数据:(spibphb<5)|(spibphc>3);

3) 3)为其分配变量:v1x =(spibphb<<5)|(spibphc>>3);

4) 4)现在、如果我尝试使用 v1x 进行任何算术运算、我的代码将停止。 如果我不使用 v1x、则代码运行正常。

例如:如果我在以下位置使用它:BETA = QMUL (OneBySqrrtThree、v1x、15)- QMUL (OneBySqrrtThree、v3、15);

其中#define QMUL (x、y、n)(int16)(((int32)(x)*(int32)(y)))>n)、代码停止工作。

我通过输入使用 v1x 停止我的代码的断点来找到它。

请帮助我解决此问题、我将不胜感激。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

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

    "代码停止工作"是什么意思? 器件是否复位? 您是否在某个地方达到 ESTOP0?

    您能否尝试在导致问题的语句中使用常量值交换 v1x? 发生什么事了?

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

    EPWM 中断停止工作、器件未复位。 是的、用一个常量值交换 v1x 会启用中断。 但是、在计算中使用 ADC 的值会禁用 ePWM 中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否放置断点来查看 v1x 的值以及 QMult 计算的结果、以确保它们处于预期范围内? 这些计算与 PWM 之间是否存在连接? 您是否使用它们来配置 PWM?

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

    感谢您的回复。

    1)是、v1x 的值在预期范围内、数据未损坏

    2) 2)我使用该值执行 abc 到 DQ 变换、ePWM 的周期寄存器不受影响。 我不配置 PWM、它是固定的。

    我还注意到了周末的情况:

    a)当我尝试只读 ADC 数据并通过 DAC 通道发送时,代码工作正常(工作代码--https://db.tt/tQ01tniytk )

    b)之前、我对 SPIA 和 SpiB 使用了单独的函数、我将这两个函数都放在一个函数中、并且几乎将我的整个代码放在 ISR 源文件中。 现在、仅当 ADC 的电源断开时、中断工作正常。 每当我尝试为 ADC 加电时,中断被禁用,代码停止工作,这是代码--> https://db.tt/txOeHgCEhs。

    以下是 ePWM 初始化:

    void Init_Epwm7 (void){

    EPwm7Regs.TBCTL.bit.CTRMODE = 0;// up 00、dw = 1、up_down = 2
    EPwm7Regs.TBCTL.bit.PHSEN =0;
    EPwm7Regs.TBCTL.bit.PRDLD =0;
    EPwm7Regs.TBCTL.bit.SYNCOSEL =3;
    EPwm7Regs.TBCTL.bit.SWFSYNC =0;
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0x0;
    EPwm7Regs.TBCTL.bit.CLKDIV = 0x0;
    EPwm7Regs.TBCTL.bit.PHSDIR = 0x0;
    EPwm7Regs.TBCTL.bit.FREE_SOFT = 3;

    EPwm7Regs.TBPRD = dPrdscale;//4000L

    EPwm7Regs.TBCTR = 0;


    EPwm7Regs.CMPA.half.CMPA = dPrdscale/2;// 0x6000;
    EPwm7Regs.CMPB = dPrdscale/2;// 0x3000;

    EPwm7Regs.CMPCTL.ALL = 0x0000;


    EPwm7Regs.AQCTLA.bit.ZRO = 2;
    EPwm7Regs.AQCTLA.bit.PRD = 0;//升级
    EPwm7Regs.AQCTLA.bit.CAU = 1;
    EPwm7Regs.AQCTLA.bit.CAD = 0;
    EPwm7Regs.AQCTLA.bit.CBU = 0;
    EPwm7Regs.AQCTLA.bit.CBD = 0;

    EPwm7Regs.AQCTLB.bit.ZRO = 2;
    EPwm7Regs.AQCTLB.bit.PRD = 0;
    EPwm7Regs.AQCTLB.bit.CAU = 0;//升级
    EPwm7Regs.AQCTLB.bit.CAD = 0;
    EPwm7Regs.AQCTLB.bit.CBU = 1;
    EPwm7Regs.AQCTLB.bit.CBD = 0;

    EPwm7Regs.DBCTL.bit.OUT_MODE = 0;
    EPwm7Regs.DBCTL.bit.POLSEL = 2;
    EPwm7Regs.DBCTL.bit.IN_MODE = 0;//pwma 同时用于 A 和 B
    EPwm7Regs.DBCTL.bit.HALFCYCLE = 1;

    EPwm7Regs.ETSEL.bit.INTSEL = 1;
    EPwm7Regs.ETSEL.bit.INTEN = 1;// ppt 中的 pg 54

    EPwm7Regs.ETPS.bit.INTPRD = 3;

    EPwm7Regs.DBFED = 100;
    EPwm7Regs.DBRED = 100;




    是否有人猜测在其他器件上电时会导致中断被禁用?ADC 的电源是通过电池供电的。

    在 ISR 中是否有调用函数的最佳方法?

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

    问题得到解决,在 PieCtrlRegs 中,我没有清除 ACK3标志。 我在结束 ISR 之前放置代码的这一部分。

    EPwm7Regs.ETCLR.bit.INT = 1;//清除此计时器的 INT 标志
    PieCtrlRegs.PIEACk.bit.ACK3=1;//写入1会清除此标志
    EPwm8Regs.ETCLR.bit.INT = 1;//清除此计时器的 INT 标志
    PieCtrlRegs.PIEACk.bit.ACK3=1;//写入1会清除此标志

    感谢您的快速回复、非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到您发现问题!

    惠特尼