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.

[参考译文] 关于 McSPI 发送和接收过程轮询方法

Guru**** 2585145 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/605207/about-mcspi-transmit-and-receive-procedure-polling-method

您好!

我想实现 SPI 主从设备同时发送和接收5字节数据、
我使用以下三个步骤、但有一些问题

(DRA75x_DRA74x_SR2.0_SR1.x_NDA_TRM_VAD)

表24-301. MCSPI 全局初始化
表24-304. MCSPI 发送和接收模式初始化
表24-308. 发送和接收过程–轮询方法

,表24-308 μ H

在将数据放入 MCSPI_TXx 之前、我必须等到 spim.MCSPI_CHxSTAT [2:0]= 0x3?
(主器件和从器件执行相同的程序)

2.在表24-308中,
如果我有5个字节用于发送和接收、那么以下过程是否正确? 但我无法获得 spim.MCSPI_CHxSTAT [2:0]= 0x3
(主设备和从设备是否设置相同?)
=>在 MCSPI_TXx 中设置字节1
"等待 spim.MCSPI_CHxSTAT [2:0]= 0x3"
=>从 MCSPI_Rxx 获取字节1
=>"Wait spim.MCSPI_CHxSTAT [2:0]= 0x3"
=>设置字节2 MCSPI_TXx
=>...

PS:时钟为12MHz

谢谢。

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

    我已将您的问题转交给 SPI 专家。

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

    ePol = 1

    POL = 0
    主器件、PHA = 1
    从器件、PHA = 0
    测试模式为0xAA 0xAB 0xAC 0xAD 0xAE

    它似乎能够同时发送和接收测试模式、
    但(主设备或从设备)有时会出现错误、如下所示
    例如:
    0xAA 0xAA 0xAB 0xAC 0xAD

    0xAA 0xAB 0xAB 0xAB 0xAC

    0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA

    我是否应该修改任何位置或流程?

    谢谢。

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

    您的环路是正确的、但效率不高。 这对主器件来说不是一个大问题、但从器件对时间非常敏感、因为无论从器件是否就绪、只要主器件准备好、传输就会发生。 从机必须以某种方式确保它始终为传输做好准备。

    这意味着:

    主器件写入其第一个发送字节之前、从器件需要写入其第一个发送字节、否则 McSPI 将只发送仍然在发送寄存器中的任何内容(即发送的最后一个字节)。

    2.一旦允许、从器件必须对下一个发送字节进行排队。 如果它等待直到接收到第一个字节、它可能太晚、当主器件开始下一次传输时、McSPI 将再次发送垃圾。 它还需要在下一次传输完成之前读取每个字节、否则字节将丢失。

     

    我建议启用发送和接收 FIFO。 然后、您只需将所有传输数据排队、让 McSPI 为您处理各个字节的传输、然后随意读取接收到的数据:

    #define WAIT_ENT(Condition) DO /*NOTE*/;while (!(Condition) void
    
    DO _SPI_TX_Rx( int count, u8 *rxdata,u8 const *txdata )
    {
    assert( count <= FIFO_SIZE /2);
    
    for( int i = 0; i < count;i++){
    assert(! MCSPI_CHxSTAT.TXFFF );
    MCSPI_TXx = txdata[ i ];
    }
    
    for (int i = 0;i < count;i++){
    wait_until (! MCSPI_CHxSTAT.RXFFE );
    rxdata[ i ]= MCSPI_Rxx;
    }
    

    如果出于任何原因而不想启用 FIFO、则应使用发送/接收循环、该循环在可能的情况下执行读取或写入操作、而无需使用特定的序列:

    void DO _SPI_TX_Rx (int count、u8 * rxdata、u8 const * txdata)
    {
    int ti = 0、ri = 0;
    
    while (ri < count){
    if (ti < count && MCSPI_CHxSTAT.tXS)
    MCSPI_TXx = txdata[ ti++];
    
    if (MCSPI_CHx+)
    
    = rxSPI_RXS+=]];if (MCSPI_RXSPI_RXS+)= txDATA+= rx+)
    

     

    当然、这些策略还可用于使主器件更高效、但这会使从器件更具时间关键性。

     

    此外、请确保在从器件上启用 TX0_underflow 和 RX0_overflow IRQ。 那么、至少您将知道传输何时损坏、因为从站没有及时准备好。