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.

[参考译文] TMS320F28388D:500kHz 时为16或12位 SPI

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1304350/tms320f28388d-spi-16-or-12-bits-at-500-khz

器件型号:TMS320F28388D

您好!

我想问的是、能否将 SPI 波特率设置为500kHz、16位或12位。 我尝试进行设置、使能信号脉宽将消失。 我假设时钟脉冲变得太宽、无法容纳使能引脚的长度。 如何在不丢失使能信号的情况下将波特率设置为500kHz、16位。

上波形为16位900kHz。 在500kHz 时、信号会消失。

我遇到的另一个问题是、在1 MHz 16位时、我要尝试向主器件发送从器件信号、但它在特定周期内不会与使能引脚同步变为高电平。  

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

    您好、Yousef、

    SPI 在传输12或16位时应能够支持500kHz 的波特率。 此外、查看以下附加的 TRM 部分、SPISTE 上的低电平有效允许模块传输似乎与您的示波器屏幕截图匹配的数据。 您能否解释一下您所说的"它在特定周期内不会与使能引脚同步变为高电平"的意思?

    一些后续问题、以确保两个器件按预期相互通信:

    1. F2838x 和您的其他主器件处于什么模式(它们应该相同)? 如果您尚未这样做、请确保主器件满足其他器件的时序要求、否则会导致从器件 错误地传输数据。

    2. 您的 LSPCLK 和 SPIBRR 是否设置 为与500kHz 波特率相匹配?

    艾什瓦里亚

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

    您好 Aishwarya:

    谢谢你的答复。

    SPI 在传输12或16位时应能够支持500kHz 的波特率。 此外、查看以下附加的 TRM 部分、SPISTE 上的低电平有效允许模块传输似乎与您的示波器屏幕截图匹配的数据。 您能否解释一下您所说的"它在特定周期内不会与使能引脚同步变为高电平"的意思?

    [/报价]

    我知道 MISO 引脚与有关信号序列的使能引脚相连。 如果使能端为高电平、MISO 引脚也为高电平、表示无数据传输;当 SPISTE 为低电平时、MISO 传输数据。 每个周期传输两个字。  

    2. 您的 LSPCLK 和 SPIBRR 是否设置 为与500kHz 波特率相匹配?

    [/报价]

    我使用 setconfig 函数来设置比特率。 我假设设置为 SPI 波特率= LSPCLK / 4、对于尖峰0、1、2、该值等于12.5MHz。

    1. F2838x 和您的其他主器件处于什么模式(它们应该相同)? 如果您尚未这样做、请确保主器件满足其他器件的时序要求、否则会导致从器件 错误地传输数据。

    [/报价]

    void initSPIAMaster(void)
    {
        //
        // Must put SPI into reset before configuring it
        //
        SPI_disableModule(SPIB_BASE);
     //  SPI_disableTalk(SPIB_BASE);
      //  SPI_reset(SPIB_BASE);
        //
        // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
        //
    //    SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
    //                  SPI_MODE_MASTER, 1000000, 16);
        SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
                      SPI_MODE_MASTER, 1000000, 16);
        SPI_disableLoopback(SPIB_BASE);
        SPI_setEmulationMode(SPIB_BASE, SPI_EMULATION_FREE_RUN);
      // SpibReg. OVERRUNINTENA:0;             // 4 Overrun Interrupt Enable
    
        //
        // FIFO and interrupt configuration
        //
    
        SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RXFF);
        SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_TXFF);
        SPI_enableFIFO(SPIB_BASE);
        SPI_setFIFOInterruptLevel(SPIB_BASE, SPI_FIFO_TX8, SPI_FIFO_RX8);
    
    //   SPI_enableInterrupt(SPIB_BASE, SPI_INT_RXFF);
       //SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RXFF_OVERFLOW);
      // SPI_enableInterrupt(SPIB_BASE, SPI_INT_TXFF);
    
    //   SPI_disableInterrupt(SPIB_BASE, SPI_INT_TXFF);
    //   SPI_disableInterrupt(SPIB_BASE, SPI_INT_RXFF);
    
        //
        // Configuration complete. Enable the module.
        //
      // SPI_enableTalk(SPIB_BASE);
        SPI_enableModule(SPIB_BASE);
    
    
    }
    

    我将使用 TI 集线站作为从站和主站对其进行测试。 主从器件的时序和相位/极性是相同的。  

    主器件发送数据通知从器件开启。 从器件读取三个整数。

    但是、从器件会读取85,147等值、以及代码中不存在的值。 我想了解这些值的来源。  

        

    void initSPIBSlave(void)
    {
        //
        // Must put SPI into reset before configuring it
        //
        SPI_disableModule(SPIB_BASE);
    //   SPI_disableTalk(SPIB_BASE);
    
        //
        // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
        //
       // SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
         //             SPI_MODE_SLAVE, 1000000, 12);
    SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
                      SPI_MODE_SLAVE, 1000000, 16);
        SPI_disableLoopback(SPIB_BASE);
        SPI_setEmulationMode(SPIB_BASE, SPI_EMULATION_FREE_RUN);
    
        //
        // FIFO and interrupt configuration
        //
          SPI_enableFIFO(SPIB_BASE);
    //    SPI_disableFIFO(SPIB_BASE);
          SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RXFF);
          SPI_setFIFOInterruptLevel(SPIB_BASE, SPI_FIFO_TX2, SPI_FIFO_RX2);
          SPI_enableInterrupt(SPIB_BASE, SPI_INT_RXFF);
    
        //
        // Configuration complete. Enable the module.
        //
        SPI_enableModule(SPIB_BASE);
    
    }
    

     以下是 SPI clk、MISO、MOSI 和 SPISTE 引脚的波形。 它们看起来很正常。

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

    您好、Yousef、

    在 initSPIAMaster 中、您将引用 SPIB_BASE 而不是 SPIA_Base。 最好使用与每个 INIT 函数关联的 SPI 名称、这样在执行时就不会产生混淆。

    在这两个 INIT 中、 TXFF 和 RXFF 中断都需要与 FIFO 级别一起设置、清除中断状态、并启用中断。 在 initSPIA 中、 spi_enableInterrupt"被注释掉、在 initSPIB 中、仅启用 RXFF。

    发送/接收 FIFO 中断级别似乎也因两个内联中断不同而异、但发送和接收中断级别应该相同、以确保每个 FIFO 级别都没有欠运转/溢出。

       SPI_setFIFOInterruptLevel (SPIB_BASE、SPI_FIFO_TX8、SPI_FIFO_RX8);

       SPI_setFIFOInterruptLevel (SPIB_BASE、SPI_FIFO_TX2、SPI_FIFO_RX2);

    如果您尚未了解 spi_ex4_loopback_fifo_interrupts、它们详细介绍了上述及其他信息。