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.

[参考译文] TMS320F2.8027万:SPI从属接收

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655610/tms320f28027-spi-slave-receive

部件号:TMS320F2.8027万
主题中讨论的其他部件: C2000WARE

您好,

我正在使用TMS320F2.8027万 Launchpad的SPI。我有与之相关的问题。  

1)什么是SPI的FIFO模式以及使用它的原因和位置。  我不是通过阅读文档而得到任何想法。

2)当我只向从属设备发送数据时(msp432和TMS320充当主设备,不使用回路模式),不使用FIFO模式,不使用SPI中断(用于回路) 那么发送的数据是正确的,但当我尝试 通过发送虚拟数据获取任何数据时,我没有接收任何数据。如何在主模式下接收数据数据,它是否总是需要中断才能接收数据, 如果没有,则如何检查rxbuf是否加载了数据,是否有任何标记或位要检查以接收数据。  

3)当tsm320f2.8027万充当从属设备时,如何在不使用interrup模式的情况下接收数据。

4)当TMS320是主数据器并以8位模式发送数据时,我可以发送数据,但当接收rxbuf显示正确的数据时,当我通过将其定义为uint8_t和uint16_t而复制到变量RDATA时,我可以发送数据。 假设我的rxbuf数据为0xEE时  ,我只接收0x0E。

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

    1.您正在阅读哪些文档? 《SPI用户指南》SPRUG71介绍了SPI和FIFO的功能。 我可以在这里总结一下。 FIFO允许应用程序自动发送/接收数据,而无需CPU干预。 要进行传输,您可以通过写入SPITXBUF寄存器来加载TXFIFO,最多可写入FIFO中的可用空间数。如果它为空,F2802x上的最大FIFO深度为4个字。 然后SPI将第一个字加载到传输移位寄存器,并开始逐位移出数据。该字完成后,RX将从其移入的SPIDAT中获取数据,并将其复制到RX FIFO, 可从SPIRXBUF读取。 SPI将自动抓取TX FIFO中的下一个字并开始传输该字。 在FIFO为空之前会发生这种情况。通过正确设置中断,SPI可以在任何编程的fifo深度中断。如果要读取4个字,则将SPIRXINT设置为在4个字时触发。 如果您要连续传输数据,请将SPITXINT设置为在FIFO几乎为空(或某个中间值)时触发,以使用更多数据连续重新加载FIFO。 我希望这是有道理的。

    2. SPI实质上是一个可编程移位寄存器。当SPI传输一个位时,它也将接收下一个位。 如果每次发送一个单词,并且FIFO模式关闭,则轮询SPIINT位。这表示已收到完整的单词。 此位为您提供了两个关键信息:1) SPI已完成传输最后一个字。您可以写入SPITXBUF以启动下一次传输。 2) SPI已收到完整的字,可从SPIRXBUF寄存器读取。

    3.如上一个项目符号所述,接收的数据始终从SPIRXBUF寄存器读取。您可以轮询SPIINT位以监控是否有完整的事务,然后读取SPIRXBUF。

    4.我不太确定自己是否理解。 也许看到您阅读SPIRXBUF的小段代码将有助于澄清问题。 由于SPIRXBUF是16位寄存器,如果您只需要8位字,则需要屏蔽寄存器的8位上位。

    如果您还有其他问题,请告诉我。

    谢谢!
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Mark,
    这是我正在尝试的代码,我禁用了FIFO,也没有使用中断。我正在发送单个数据,并根据比较结果进行Salve比较和发送响应。
    ""
    uINT8_t sdata; //发送数据
    UINT8_t RDATA //接收数据

    sdata=0x81;
    SpiaRegs.SPICTL.bit.Talk =1; //启用传输路径
    SPI_xmit (sdata << 8); //主中继器传输数据
    while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1); //等待数据接收
    虚拟= SpiaRegs.SPIRXBUF;
    delay_loop();

    SpiaRegs.SPICTL.Bit.Talk = 0; //时钟是生成的
    //禁用传输路径

    while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1);
    SPI_xmit (sdata << 8); //发送虚拟启动TX
    while (SpiaRegs.SPISTS.bit.INT_flag !=1){} //等待直到收到数据
    //此位是否仅用于中断模式?
    RDATA = SpiaRegs.SPIRXBUF;
    delay_loop();
    ""
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ajay,

    上述代码是否不起作用? 您的代码看起来应该正常工作。 您不一定需要操纵通话位,但它不应影响此处的任何内容。

    您是否查看过SPI配置? 验证时钟相位和极性位设置是否正确。 使用Chip select (芯片选择)验证从属设备的要求。是否需要反转? 它是否需要在命令和响应阶段之间保持活动状态?

    如果您使用的位数少于16位,则还应屏蔽在接收阶段读取的数据以清除上面的位数。 跳到我现在正在处理的另一个主题。 您似乎都遇到了类似的问题(e2e.ti.com/.../65.5436万)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Mark:
    我在从属模式下传输和接收时遇到了很多问题。您是否有从属模式传输和接收的示例代码?
    因为在示例代码中没有定义正确的过程代码以在从属模式下运行的代码
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ajay,

    请查看C2000Ware中的示例(路径如下所示)。 虽然此示例适用于F2.8004万x器件,但它可以轻松移植到F2.8027万。 它使用driverlib编程样式,但如果您查看每个函数调用,您将看到正在设置的寄存器和位。 此示例使用中断。

    C:\ti\c2000Ware_1_00_03_00\driverlib\f28004x\examples\SPI\SPI_Ex5_external_loop_fifo_interrups.c</s>2.8004万

    在从属模式下,数据可能随时出现,除非您对流进行编程以控制和预测要传输或发送的数据类型。即创建命令,然后创建响应类型的传输。在命令阶段,从属设备没有任何有效数据可发送, 但一旦收到命令,它将填充在下一次从主中继器传输时发送出去的传输缓冲区。 在SPI中,主控制器始终控制时钟,因此从属控制器无法启动任何传输。

    我可能有另一个例子,但目前找不到。 我明天应该可以访问我需要的内容。

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

    自您上次回复以来已过了几天。 您是否能够启动并运行? 我找不到我要找的示例,它可能在我无法再访问的旧笔记本电脑上。

    谢谢!
    标记