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.

[参考译文] TMS320F28388D:SPI 通信

Guru**** 2555630 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1070925/tms320f28388d-spi-communication

部件号:TMS320F28388D

你好

我执行了如下 SPI 配置

UINT16_t sData = 0;
UINT16_t RDATA = 0;

//mySPI0初始化
SPI_disableModule (mySPI0_base);
SPI_setConfig (mySPI0_base,device_LSPCLK_FREQ,SPI_PROT_POL0PHA1,//***,device_LSPCLK_FREQ=50MHz,//! 模式1。 极性0,相位1。 上升边缘延迟。
SPI_MODE_MASTER,1000000,8);//SPI 主模式,8位数据宽度
//SPI_disableFIFO (mySPI0_base);
SPI_enableFIFO (mySPI0_base);//启用发射和接收 FIFO。
SPI_enableLoopback (mySPI0_base);
SPI_setEmulationMode (mySPI0_base, SPI_emonization_fix_free _run);///!set,这样断点不会干扰 xmission
SPI_enableModule(mySPI0_base);

我正在通过启用环回来传输和接收数据。

sData = 0x0a0b;

SPI_writeDataBlockingFIFO (mySPI0_base,sData);/FIFO 已启用
X = SPI_getTxFIFO 状态(mySPI0_base);
RDATA = SPI_readDataBlockingFIFO (mySPI0_base);//FIFO 已启用

我对  SPI_setConfig() 函数有疑问,在此函数 中,我将数据宽度设置为8位。

因此,根据 SPI_setConfig()函数解释 ,应该放弃下8位数据,并且只能接收上8位数据。

但 接收 到的数据为 RDATA=0x0b0a。

因此,不是只获得0x000a 数据, 为什么接收到的数据是0x0b0a?

请提前感谢

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

    阿鲁纳

    当 SPI 事务的字符长度小于16位时,您需要离开位。 在您的情况下,您正在尝试启动1字节(8位)的 SPI 事务,因此您需要将字节偏移8位,如下所示。

    字符长度=8;

    SPI_writeDataBlockingNonFIFO (基本,数据<<(16U - charLength));

    我们还准备好了发射字节的功能。 请检查驱动程序库函数中的 SPI_DRIByte 函数。此函数会自动为您处理左移等问题。

    SPI_COMMITTEByte (基,txData)

    请参阅使用这些函数的 SPI_ex6_EEPROM 示例。

    此致,

    马诺伊

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

    您好,

    你们中的任何人能帮助我了解以下两种功能之间的区别,以及我应该在哪种情况下使用哪种功能?

    1) SPI_writeDataNonBlocking 2) SPI_writeDataBlockingFIFO

    同样,请阅读“大小写”。

    此致,
    Jay

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

    Jay,

    SPI_writeDataBlockingFIFO -等待 FIFO 在写入 SPI 传输缓冲区之前有一些空间

    SPI_writeDataNonBlocking  -此函数不检查 FIFO 是否为空。 它直接写入 SPI 传输缓冲区

    SPI_readDataBlockingFIFO -在读取 SPI 接收缓冲区之前,等待 RX FIFO 不为空

    SPI_readDataNonBlocking  -此函数不检查 RX FIFO 是否有任何接收到的内容(或)。 它只是读了出来  

                                                     SPI 接收缓冲区

    此致,

    马诺伊

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

    我对 FIFO 模式下的传输/接收操作顺序有点困惑,

    请详细说明一下吗?

    此致,
    Jay

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

    Jay,

    这是一个开放式问题。 您的困惑到底是什么?

    此致,

    马诺伊

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

    是的,根据我的理解, FIFO 传输阵列首先被填充,然后在到达 FIFO 中断级别(全级别)时生成中断,然后我们将来自 FIFO 阵列的数据置于传输缓冲区以传输数据  

    在接收端,当接收 FIFO 达到 FIFO 全电平时,中断将生成,我们将从接收 FIFO 接收数组读取数据

    这是如何执行操作还是我漏掉了什么?

    此致,
    Jay

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

    Jay,

    [引用 userid="509687" url="~ë/support/moncs/c2000-monics)- group/CC2000 /f/c2000-微控制器- forum/1070925/tms320f28388d-SPI-communicity/3971446#3971446"] FIFO 传输阵列先被填充,然后到达 FIFO 级(全级)时,数据将从 FIFO 中断阵 列传输到数据[,然后我们将数据传输到 FIFO 数据传输到 FIFO 中断阵列,并将数据传输到 FIFO 数据传输到 FIFO 中断]

    否,如果要发送的 TX FIFO 的字数小于 TXFFIL (TXFFST <= TXFFIL),则会生成中断。

    [引用 userid="509687" url="~ë/support/monca-monca-group/c2f/c2000- monca-forume/1070925/tms320f28388d-spi-communicity/3971446#3971446"]在接收端,当接收 FIFO 达到完整级别时,中断将生成并读取接收 FIFO 阵列数据[引用]

    是的,您的理解是正确的。

    此致,

    马诺伊