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.

[参考译文] TMS320F28069:通过 SPI 通信发送4个以上的字

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1051811/tms320f28069-sending-more-than-4-words-with-spi-communication

器件型号:TMS320F28069

void spi_fifo_init()
{
// Initialize SPI FIFO registers
   SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI

   SpiaRegs.SPICCR.all=0x001F;       //16-bit character, Loopback mode
   SpiaRegs.SPICTL.all=0x0017;       //Interrupt enabled, Master/Slave XMIT enabled
   SpiaRegs.SPISTS.all=0x0000;
   SpiaRegs.SPIBRR=0x0063;           // Baud rate
//   SpiaRegs.SPIFFTX.all=0xC022;      // Enable FIFO's, set TX FIFO level to 4
   SpiaRegs.SPIFFTX.all=0xC021;      // Enable FIFO's, set TX FIFO level to 1
//   SpiaRegs.SPIFFRX.all=0x0022;      // Set RX FIFO level to 4
   SpiaRegs.SPIFFRX.all=0x4021;      // Set RX FIFO level to 1
   SpiaRegs.SPIFFCT.all=0x00;
   SpiaRegs.SPIPRI.all=0x0010;

   SpiaRegs.SPICCR.bit.SPISWRESET=1;  // Enable SPI

   SpiaRegs.SPIFFTX.bit.TXFIFO=1;
   SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}

Void NVM_TX_HWI()
{
    Uint16 i;

    SpiaRegs.SPITXBUF = 0x06;               // Set write enable latch (WREN)
    SpiaRegs.SPITXBUF = 0x02;               // Write memory data (WRITE)
    SpiaRegs.SPITXBUF = 0x00;               // Memory address of write location (MSB)
    SpiaRegs.SPITXBUF = 0x00;               // Memory address of write location
//    SpiaRegs.SPITXBUF = 0x00;               // Memory address of write location (LSB)
    SpiaRegs.SPITXBUF = rdata_point++;                // Data to Write

    DELAY_US(1000000L);

    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
}

Void NVM_RX_HWI()
{
    Uint16 i;

    rdata[rcount++]=SpiaRegs.SPIRXBUF;     // Read data
    if(rcount>=4) rcount=0;

    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
}

我正在尝试测试从 SPI 环回示例中利用的 SPI 代码。 我正在尝试发送和接收4个以上的字、但我不知道如何发送和接收。 我已经连接了我的配置(SPI_Fifo_init())以及通过 BIOS 硬件中断处理消息发送和接收的发送和接收中断。 我可以做什么来发送和接收超过4个字?

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

    Andrew、

    F28069只有4级 FIFO。 您在 ISR 中写入的数据过多。  您必须轮询 TXFFST 位以确定 FIFO 中剩余的空间、然后再写入 FIFO。  

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

    那么、如果我不使用 ISR 并轮询 TX 缓冲区、那么我可以发送更多4个字吗?

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

    您仍然可以使用 ISR、只需在写入前轮询 FIFO 状态、以确保在写入新数据之前 FIFO 中有空间。 请记住、SPI 以远低于 CPU 写入的速度移动数据。  

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

    在每个字被发送后、芯片选择线路是否被禁用?

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

    只要 FIFO 中有数据、片选线路就会保持激活状态。  

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

    我的代码现在正在轮询 TXFFST、直到它为空、然后再发送下一条消息。 这意味着芯片选择在每次发送后将被停用? 因此、我需要至少发送下一条消息、TXFFST 中至少还有1条消息、以便使芯片选择保持活动状态?

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

    在芯片选择被禁用前、最后的数据必须被移出 SPITXBUF。 因此、我认为您的问题的答案实际上取决于您的代码是否在 SPITXBUF 为空之前向 TXFIFO 写入新值。 您是否使用示波器探测了芯片选择线路?  

    从技术上讲、在写入 FIFO 之前、无需等待 FIFO 完全空。  如果 TXFFST=4 (即 FIFO 满)、您只需要暂停写入。 下面是来自 driverlib 的示例代码(F28069很遗憾不支持)。

    SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data)
    {
        //
        // Check the arguments.
        //
        ASSERT(SPI_isBaseValid(base));
    
        //
        // Wait until space is available in the receive FIFO.
        //
        while(SPI_getTxFIFOStatus(base) == SPI_FIFO_TXFULL)
        {
        }
    
        //
        // Write data to the transmit buffer.
        //
        HWREGH(base + SPI_O_TXBUF) = data;
    }