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:SPI

Guru**** 2454880 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1116625/tms570lc4357-spi

器件型号:TMS570LC4357

王工:μ A

我想用spiTransmitData()和spiReceiveData()替换掉spiTransmitAndReceiveData()为什么接收的数据不同?μ A

代码附上:μ A

#if 0

uint16_t command[1]={RBPR};
uint16_t RxData[19];
uint16_t i=18、j=1;
TransmitAndReceiveData (spiREG4、&g_spi4Config、19、command、RxData);

while (i---){
*pbuffer=RxData[j++];
pbuffer++;

#endif
#if 1.

uint16_t 命令[1];
命令[0]=RBPR;

spiTransmitData (spiREG4、&g_spi4Config、1、command);

spiReceiveData (spiREG4、&g_spi4Config、18、pbuffer);

#endif

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

    英语:

    您好王恭、

    为什么接收到的数据不同?

    当您调用"spiTransmitAndReceiveData"函数时、传输和接收会并行发生。 这意味着、如果发送"N"个帧、并且您将从从从设备接收相同数量的帧。

    但是、如果您单独使用"spiTransmitData"和"spiReceiveData"、则当您使用 "spiTransmitData"发送数据时、 从从从器件接收到的帧将被忽略(在您的情况下、与命令对应的第一个帧将被忽略)。 当您尝试使用 "spiReceiveData"函数接收数据时、将发送虚拟帧"0x00000"以接收从器件发送的数据。

    我注意到您的代码有一个问题、在您的代码中、您声明的命令大小仅为数组1、但您调用 的是块大小为19的"spiTransmitAndReceiveData"函数、 因此、对于第一个帧、它将在 array[0]中发送您的命令、并从从从器件接收一个正常的帧、但在这之后、它只会将源缓冲区递增一以发送下一个帧、在这种情况下、您只会得到数组溢出(因为您声明了 array) 大小为1)、因此某些未知帧将发送到从站。 要消除此阵列溢出、请尝试在使用  "spiTransmitAndReceiveData"时按如下方式声明您的"命令"阵列。

    uint16_t command[19];

    for (uint8_t k=0;k<19;k++)

      如果(k==0)

        命令[k]=  RBPR;

      其他

        命令[k]=  0;

    中国人:
    你好王工,
    
    为什么接收到的数据不一样?
    
    当您调用“spiTransmitAndReceiveData”函数时,传输和接收会并行进行。这意味着如果您发送“N”个帧,您将从从站接收相同数量的帧。
    
    但是如果你分别使用“spiTransmitData”和“SpiTransmitData”,那么当你使用“spiTransmitData”发送数据时,从slave接收到的帧将被忽略(在你的情况下,对应于命令的第一帧将被忽略)。当您尝试使用“spiData”函数接收数据时,将传输虚拟帧“0x00000”以接收来自从站的数据。
    我注意到您的代码存在一个问题,在您的代码中,您声明的命令大小只有数组1,但是您正在调用块大小为19的“spiTransReceivmitAndReceiveData”函数,因此对于第一帧,它将在数组[0]中发送您的命令和从从站接收一帧很好,但之后它只会将源缓冲区增加一以发送下一帧,在这种情况下,您最终会出现数组溢出(因为您将数组大小声明为1),所以一些未知帧将被发送到从机。要消除此数组溢出,请在使用“spiTransmitAndReceiveData”时尝试如下声明您的“命令数组。” 

    uint16_t command[19];

    for (uint8_t k=0;k<19;k++)

      如果(k==0)

        命令[k]=  RBPR;

      其他

        命令[k]=  0;

     

    --

    谢谢、
    Jagadish。

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

    感谢您的详细回答。

    但我认为  我的问题描述不够详细。

    我想通过 SPI 从闪存读取数据。  

    首先、我需要将一个读取命令传输到闪存、然后闪存会回复我的数据。

    第一种方法是使用  spiTransmitAndeData()函数。它起作用,但考虑到其他因素,我需要将 spiTransmitAndeData()替换为 spiTransmitData()和 ReceiveData() 。 因为闪存回复的第一个帧是无用的。

    问题是 ,我在调用 spiTransmitData()后调用 spiReceiveData(),但无法接收数据。

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

    您好!

    我理解了为什么在使用  spiTransmitData()和 spiReceiveData()方法而不是单 个 spiTransmitAndReceiveData()方法时它不起作用。

    如果您看到随附的时序图,则命令和接收数据所有内容都应在单芯片选择活动状态下完成, 这将与 spiTransmitAndReceiveData()方法完全相同。

    但是,如果使用 spiTransmitData()和 spiReceiveData()方法,则选择芯片将在两种方法之间切换,原因是  

    如果您看到 spiTransmitData()方法,则在最后一个帧传输结束时,CSHOLD 位将被清除以禁用芯片选择

    因此,在您使用 spiTransmitData()发送命令后的情况下,芯片选择 将在命令帧后停用。 它将在调用 spiReceiveData()后再次被激活。 但这不应该发生、一旦您在传输之间停用芯片选择、从器件可能会再次进入空闲状态。 但是 spiTransmitAndReceiveData()情况并非如此,在这里,芯片选择 Get activate before transmitting command,它将继续处于活动状态,但仍然接收到从器件的最后一个字节。

    我希望这澄清了你的疑问。

    --

    谢谢、
    Jagadish。