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.

[参考译文] TMS570LC4357:MibSPI 并行模式通信问题基于–从器件到主器件数据损坏

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1508555/tms570lc4357-mibspi-parallel-mode-communication-issue-on-slave-to-master-data-corruption

器件型号:TMS570LC4357

工具/软件:

尊敬的 TI 团队:

我使用的是中配置用于 MibSPI 通信的两个 TMS570LC4357 LaunchPad 并行模式 、使用以下设置:

  • 数据线 :4 (并行模式)

  • 设定的时钟速度 :18.75 MHz

  • 转移组大小 :128

  • 片选 : 0

  • ENA 引脚 :未使用

主器件到从器件通信(工作)

在主器件侧、在 Tx RAM 中填充128个缓冲区并触发 TG0。 从设备在其 Rx RAM 中成功接收到数据、我可以将其复制到本地缓冲区 而不会损坏器件

从器件到主器件通信(问题)

我现在正在尝试传输数据 从从从站切换到主站 。 为了启动传输、我从主器件发送虚拟数据(正如 SPI 全双工模式中预期的那样)、而从器件使用有效数据设置其 Tx RAM 并触发 TG0。 但是、在本例中、是 主器件接收到的数据正在损坏

我怀疑我可能缺少一个步骤或错误排序。 以下是相关代码的简化版本:

主:

mibspiSetData(mibspiREG5, 0ul, dummydata);      // Fill dummy data
mibspiTransfer(mibspiREG5, 0ul);                // Trigger TG0

while (1)
{
    mibspiGetData(mibspiREG5, 0ul, RecvBuf);    // Read received data

    if (RecvBuf[0] == 0xAAA1)                    // Example sync word
    {
        break;
    }
}



从器件:
mibspiTransfer(mibspiREG5, 0);                  // Initially trigger TG0

while (1)
{
    mibspiGetData(mibspiREG5, 0, dummydata);    // Read dummy data from master

    if (dummydata[0] == 0xA5A5)                 // Sync condition
    {
        mibspiSetData(mibspiREG5, 0, source);   // Fill slave Tx RAM with data
        mibspiTransfer(mibspiREG5, 0);          // Re-trigger TG0
    }
}



问题:

  1. 在此设置中、从动启动的传输顺序是否正确?

  2. 从器件应该在接收到虚拟数据之前或之后触发 TG0?

  3. 在并行模式下、正确接收从器件到主器件的数据是否需要任何特定的时序要求或同步机制?


此致、
Naveen R

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

    尊敬的 Naveen:

    您的代码对我来说似乎很困惑、

    我不明白为什么您 在设置数据之前在从端调用 mibspiTransfer、我认为这不是必需的。

    您能否在从设备和主设备上尝试以下代码一次:

    主:

    /*MibSPI 初始化 Master */
    mibspiSetData (mibspiREG5、0ul、dummydata);
    mibspiTransfer (mibspiREG5、0ul);

    while (!(mibspiREG5->FLG 和 RXINTFLG);
    mibspiGetData (mibspiREG5、0ul、rx_data);
    while (1)

    ;
    }

    从器件:

    /*MibSPI Slave*/的初始化
    mibspiSetData (mibspiREG5、0、source);
    mibspiTransfer (mibspiREG5、0);

    while (!(mibspiREG5->FLG 和 RXINTFLG);
    mibspiGetData (mibspiREG5、0、rx_data);
    while (1)

    ;
    }

    使用这些代码后、请确保首先从器件加电、然后是主器件加电。 如果我们这样做、第一个从器件将数据设置到其 RAM 并等待主器件时钟、因此一旦主器件尝试发送数据、从器件将获得时钟、它还与主器件并行传输数据、两者都可以交换数据。

    --
    此致、
    Jagadish。