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.

[参考译文] TMS320F2809:填充 SPI TX FIFO 寄存器

Guru**** 2526700 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/874778/tms320f2809-filling-spi-tx-fifo-registers

器件型号:TMS320F2809
主题中讨论的其他器件:MOTORWARE

我正在编写一些代码、以便与使用类似 SPI 的通信的外部外设进行交互。 我给它一个时钟、它给我数据、所以我将使用外设、如下所示:

  1. 读取 SPI 的 RX FIFO 中的数据
  2. 处理数据
  3. 填充 Tx FIFO

此例程在 SYS-BIOS 中以1kHz 的频率运行。 问题是、我会遇到如下所示的布线:  

顶部(CLK)迹线上的间隙导致外设超时、并认为下一个字是一个新的事务。

下面是填充 TX FIFO 的代码:

//填充 FIFO 以准备新样本。
for (int word_need=4;word_need>0;word_need---){
SPI_Handle_->SPITXBUF = 0xFFFF;
//等待缓冲区清空
while (SPI_getTxBufferStatus (SPI_Handle_)=SPI_TxBufferStatus_Full);
} 

这不是原子的、因此当中断时、填充过程可能会延迟。 我要做的是在 SPI_enableTx()之后放置一个 SPI_disableTx(),但出于某种原因,当您禁用 TX 时,它不会停止外设计时,这会破坏这一想法。  


希望能在这方面提供一些帮助!

谢谢!

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

    Daniel:

    您尝试将 SPI 连接到哪个器件? 您是否正在尝试使用 F2809.SPI 作为主器件?

    如何启用/禁用传输功能? 如何使用 TX/RX FIFO?

    此致、

    曼诺伊

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

    嗨、Manoj!

    这是我针对 SPI 外设的整个设置

    //设置外设时钟
    SPI_setClkPolarity (SPI_Handle_、SPI_ClkPolarity_OutputFallingEdge_InputRisingEdge);
    SPI_setClkPhase (SPI_Handle_、SPI_ClkPhase_Normal);
    //设置为主模式
    SPI_setMode (SPI_Handle_、SPI_Mode_Master);
    /
    SPI_Handle 1 (SPI_RBoost_1
    );SPI_1 (SPI_1);SPI_1 (SPI_1)
    1 (SPI_1);SPI_1 (SPI_1) 1 (SPI_1);SPI_1 (SPI_1 (SPI_1 (SPI_1) 1 (SPI_1 (SPI_1)、SPI_1 (SPI_1)、SPI_1 (SPI_1)
    SPI_DisableOverRunInt (SPI_Handle_);
    //禁用 TX 以便 periph 不会写入 MOSI (引脚用于其他用途)
    SPI_DisableTx (SPI_Handle_);
    //不会出现 TX 延迟,因为我们将执行大于16位的连续写入
    ;SPI_setTxDelay (SPI_Handle_
    );SPI_FifxHandle_
    
    
    ;SPI_Fifo_;SPI_Handle_Rifo_;SPI_Handle_ FifxHandle_;SPI_Fif_Rifo_;SPI_Fif_RxHandle_ 4;SPI_Handle_;SPI_Fif_Rifo_;SPI_Fif_Rif_R句 柄
    

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

    Daniel:

    我不熟悉这些功能? 这些是您的定制驱动程序吗?

    此外、您要尝试将哪个器件连接到 SPI?

    此致、

    曼诺伊

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

    您是否正在使用 TX FIFO? TX FIFO 和 RX FIFO 深度相同。

    我在您的代码中看不到 TX FIFO 配置。

    此致、

    曼诺伊

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

    Manoj、

    这些是 TI 的 MotorWare 驱动程序。 SPI FIFO 字长度是一个单寄存器、用于确定传输的字的长度、控制 RX 和 TX、因为它们都来自外设中的同一缓冲区。 使用 SPI-B 外设、连接使用类似 SPI 接口的编码器。 问题是、在保持 SPI CLK 处于复位状态时、我无法填充 TX 缓冲区(TALK 位不会停止时钟运行、而 RESET 位也会复位 FIFO、因此一旦清除复位、它就会复位 FIFO 指针。)

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

    Daniel:

    当您将 SPI 配置为主器件时、它仅在 SPI 传输数据时提供 SPICLK。 一旦一个字的传输完成、SPICLK 不应像您所示那样切换。

    我建议您查看下面提供的 SPI 示例代码。

    C280x、C2801x C/C++头文件和外设示例

    此致、

    曼诺伊

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

    我把它配置为主器件、正如您看到的、您所说的不是真的。 当 TX 位被禁用时、它会切换。 但是、我通过将 FIFO 填充移动到中断 FIFO 填充的中断中来解决该问题、因此现在没有更高的优先级来中断 FIFO。