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/TMS320F28335:PWM 中断中的 SPI 接收数据

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676986/ccs-tms320f28335-data-reception-by-spi-in-pwm-interrupt

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我有两个 TMS320C2000实验板套件、它们分别为28335和 B。通过使用 EPWMSYNCO I/O 在两个电路板上应用同步的7kHz PWM 中断、并且效果良好。

电路板进入 PWM 中断后、它将在完成一些计算后通过 SPI 发送16位数据(波特率:9.375MHz)。 供参考、SPI 传输前的计算时间约为30us。

对于 B 板、它会在进入 PWM 中断后立即等待 SPI 数据接收。

在16位数据传输和同步7kHz PWM 中断的情况下、我认为 B 板接收 PWM 中断中 SPI 数据的时间应该足够长。

但是、我发现 B 板需要中断的整个时间来等待数据。 这是从示波器测量的时序。

B 板接收到的数据也不完整。 缺少一些数据点。

SPI 设置如下:

1) 1)电路板:  

void SPI_init()

   SpiaRegs.SPICCR.bit.SPISWRESET = 0;//在更改 SPI 配置之前清除此位
   SpiaRegs.SPICCR.ALL = 0x000F;         //复位打开,写入:上升沿;读取:下降沿
                                     //无回路,16位字符位
                                     // 0000 1111

   SpiaRegs.SPICTL.ALL = 0x0006;          //启用主控模式、正常相位(无延迟半周期)、
                                     //启用 TALK、禁用 SPI int。
                                     // 0000 0110

   SpiaRegs.SPIBRR = 0x0000;            // LSPCLK/4、37.5MHz/4 = 9.375MHz
   SpiaRegs.SPICCR.ALL = 0x008F;         //从复位中撤回 SPI、1100 1111
   SpiaRegs.SPIPRI.bit.FREE = 1;          //设置断点以使断点不会干扰 xmission

void SPI_xmit (uint16 A)

   volatile UINT16 dummy_x = 0;

   GpioDataRegs.GPACLEAR.bit.GPIO19=1;
   SpiaRegs.SPITXBUF=A;

   while (SpiaRegs.SPISTS.bit.INT_flag = 0){}
   dummy_x = SpiaRegs.SPIRXBUF;
   GpioDataRegs.GPASET.bit.GPIO19=1;

2) 2) B 板:

void SPI_init()

   SpiaRegs.SPICCR.bit.SPISWRESET = 0;//在更改 SPI 配置之前清除此位
   SpiaRegs.SPICCR.ALL = 0x000F;         //复位打开,写入:上升沿;读取:下降沿
                                    //无回路,16位字符位
                                    // 0000 1111

   SpiaRegs.SPICTL.ALL = 0x0002;         //启用从机模式、正常相位(无延迟半周期)、
                                    //启用 TALK、禁用 SPI int。
                                    // 0000 0010

   SpiaRegs.SPIBRR = 0x0000;          // LSPCLK/4、37.5MHz/4 = 9.375MHz
   SpiaRegs.SPICCR.ALL = 0x008F;        //从复位中撤回 SPI、1100 1111
   SpiaRegs.SPIPRI.bit.FREE = 1;        //设置断点以使断点不会干扰 xmission

void SPI_receive()

   while (SpiaRegs.SPISTS.bit.INT_flag = 0){}
   drive_data = SpiaRegs.SPIRXBUF;

由于我研究中的应用、PWM 中断是必需的、因此此处不考虑 SPI 数据接收的中断。

是否有人有办法解决这个问题? 感谢您的任何帮助。

谢谢。 )

Hung-Yen

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

    请为我澄清:在黄色信号的下降沿、电路板 A 将传输 SPI 数据、电路板 B 将捕获绿色信号上的数据?

    您能否共享以下信号的标注范围图?
    黄色:相同
    绿色-在调用 SPI_receive()之前设置为0,在退出 SPI_receive()之后立即设置为1。
    粉色:相同
    蓝色:SPISIMO 或 SPICLK。 两种方法都可以正常工作。
    (EPWMSYNCO)上升沿触发
    以仅查看一个周期

    一旦电路板 B 看到预期的完整数据字(16位)、它将触发 INT_FLAG、并且您应该能够读取 SPIRXBUF。

    您的问题是电路板 B 何时未获得数据?
    您的数据是否正确? 我想确保 SPI 不会不同步、并且能够获得正确的数据、即使它很晚也是如此。


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

    Mark、

    您请求的图如下:

    计算完成后、数据通过 SPI 从电路板 A 传输。 计算和 SPI xmit 都在 PWM 中断内完成。

    我的问题是电路板 B 无法从电路板 A 获取完整数据。这里是分别记录在电路板 A 和电路板 B 中的数据。

    我从电路板 A 发送的数据是具有22个直流偏移的80Hz 正弦波、每个数据点由电路板 A 计算并在每次中断中传输

    我在每个 DSP 中使用一个数组来记录每个中断中的数据、并将其输出到 Matlab 以获取该图。

    请注意、由于我手动开始和停止在每个 DSP 中记录数据、因此它们不是同相的。

    接收到的数据处于从电路板 A 传输的正弦波范围内、并且非常失真。

    我希望这些信息有助于澄清。 感谢你能抽出时间。

    Hung-Yen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关此问题的更新:
    正弦波可以被电路板 B 正确接收、因此不再失真。 导致此问题的原因似乎是 SPISTE 引脚的连接。
    但是,SPI_Receive()仍然需要整个中断时间来获取数据(请参阅上面我的答复中的第一个图),这显然是不可取的。
    我希望任何人都能有一个想法来帮助我解决这个问题。 谢谢!

    Hung-Yen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    进一步更新:
    SPISTE 问题解决后,我尝试将 SPI_receive()放入 PWM 中断之外的 while 循环中,而不是放在中断内部。 现在一切都运行良好。

    Hung-Yen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴听到您说它可以正常工作。 是的、由于您处于 SPI 的轮询环路中、因此它将在等待下一次接收时阻止任何其他活动。 对收到的数据进行去耦通常是这种情况的最佳做法。

    -Mark