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:TMS 570 MIBSPI从属时钟计时和数据不匹配

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1092705/tms570lc4357-tms-570-mibspi-slave-clock-timing-and-data-mismatch

部件号:TMS570LC4357

嘿,团队,

我在 这里问了一个有关从模式下的TMS570 mibspi的问题。 以下查询可视为对该问题的跟进。 我们已经能够设置和测试以下内容(这是测试MIBSPI的设置)-  

  1. TMS570芯片作为具有外部主时钟和外部时钟的从属器件(也是TMS DEV KTI Hercules XL-570LC4357)。  
  2.  从属设备的外部时钟当前来自主TM 570,但实际主板上是来自DSP芯片的自由运行时钟。
  3. 4引脚模式(CS,MOSI Miso,CLK),但在不存在的情况下,我们只能从主控制器->从控制器进行数据传输。因此,我们只能连接MOSI引脚,并使Miso保持浮动。

通过上述设置,我们能够以6.75 MHz通过MIBSPI发送数据(uint16{1,2,3,4,5,6,7,8}),并看到以下行为。

  1. 我们在while循环中从主中继器持续发送此数据。
  2. 在大多数情况下,我们都能在从属设备上看到相同的数据。
  3. 在某些情况下,我们在复制Rx数据时只看到零。 这是在检查 SPI接收寄存器缓冲区中的RXEMPTY位之后。

看到这种行为,我相信抽样并不是在它应该导致销售的时候发生的,它认为它看到了一些数据,但实际上它只是抽样0。 两端的时钟相位和极性为0。

当我们将频率增加到12.5 MHz时,我们根本看不到确切的数据,而看到数据位向左移动({0x10,0x200,0x300,...}),或者在读取Rx缓冲区时看到0的列表。 只有在两次后续转账之间存在相当长的延迟,才能解决这一问题。  

在我们的板上,主器件是一个DSP芯片,它以SPI格式发送数据,输出一个空闲运行时钟作为SPI时钟,并且在发送数据时具有芯片选择的活动低配置。 在这种情况下,我们无法在SPI时钟线路中暂停空闲运行时钟。 后续CS Lows之间的延迟为~25微秒。 我们的VCLK设置为75 MHz。 我们也看到上面提到的多个0或位移问题。

这种行为在TM端是否仍然可以接受,因为理想情况下,它只应在CS变低时查看时钟? 如果是这样,我们如何解决位移和错误采样的问题。 我们的要求 是以25.576 MHz运行mibspi时钟,并以该速率在SPI总线上发送数据。下图是实际SPI事务的样子。  



谢谢  
Cree

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

    您好,Cree:

    SPI输入数据锁定在时钟下降沿上。 如果在CS下降边缘(CS变为低)和第一个数据位(MOSI)之间有额外的时钟脉冲,则接收到的数据是传输数据的1位偏移。  

    如何将您的MOSI数据同步到自由运行时钟信号并满足数据表(7.12)中定义的数据设置和保持时间?

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

    QJ,您好!

    对于初始语句,如果我们发送(0x01,0x00)时钟的另一个下降边缘将为我们提供(0x00,0x80)。我们通常会看到相反的方向的偏移,即(0x02,0x40)等  

    MOSI和自由运行时钟同步发生,因为它们由同一DSP串行输出单元生成,该串行输出单元具有自己的时钟发生器,该端口将根据其配置中定义的时钟边缘输出数据。 设置和保持时间匹配,如下图所示,因为这是TMS到TMS SPI主控到12.5 MHz的从属通信,并将其复制到我们的板上。 我们可以看到正在发生的变化,即使在TMS <-> TMS SPI通信中也可以读取0。

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

    除此之外,对于我们的板载设置,时钟波形如下所示,仍在时钟的下降边缘采样。 我们正在发送的数据是(0x00 0x01  0x00 0x01 0x00 0x01 0x00 0x01) ,我们正在接收的数据显示在下面,其中包含不同频率,我们正在接收的序列的gdb输出以及接收缓冲区时的SPI buf接收寄存器值。

    对于12.5 MHz-

    3570美元 ={0x0,0x2,0x0,0x8,0x0, 0x20,0x0,0x80}
    3571美元= 0x103e0100
    3572美元 ={0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3573美元= 0x103e0100
    3574美元 ={0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3575美元= 0x103e0100
    3576美元 ={0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3577美元= 0x103e0100
    3578美元 ={0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3579美元= 0x803e0000
    3580美元 ={0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3581美元= 0x103e0100
    3582美元 ={0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3583美元= 0x103e0100
    3584美元 ={0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0}
    3585美元= 0x103e0080
    3586美元 ={0x0,0x4,0x0,0x10,0x0, 0x40,0x0,0x100}
    3587美元= 0x803e0000

    对于6.25 MHz-  

    3598美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3599美元= 0x903e0001
    3600美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3601美元= 0x903e0000
    3602美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3603美元= 0x103e0001
    3604美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3605美元= 0x103e0001
    3606美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3607美元= 0x103e0001
    3608美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3609美元= 0x103e0001
    3610美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}
    3611美元= 0x103e0001
    3612美元 ={0x0,0x1,0x0,0x1,0x0, 0x1,0x0,0x1}

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

    TMS570器件上的SPI模块仅在传输数据时生成SPI时钟,且不支持自由运行的SPI时钟。 如果将MibSPI模式用作从属模式,则SPI主节点必须等待6 VCLK,然后再发送时钟以开始事务。 在两次传输之间,存在2个VCLK周期的延迟。  

    如果SPI时钟比VCLK慢得多,则可能工作,因为延迟相对于SPI时钟周期较小。  

    支持的最大SPI时钟为25MHz。  

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

    QJ,您好!

    对于这种延迟,我有两个问题-  

    1. 6 VCLK循环延迟-这是在CS变低和实际数据开始之间。 时钟是否可以在此持续时间内运行,是否会被忽略?
    2. 2 VCLK循环是在每个SPI事务之间进行,而不考虑我们声明的传输组大小,还是在缓冲区中的每个数据之间进行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另外,当我希望接收(0x00FF,0x00FF, 0x00FF, 0x00FF, 0x00FF,  0x00FF, 0x00FF, 0x00FF)我收到一些数据  

    2144美元 ={0xFF0,0xFF00,0x3f000,0x3f0000,0x3fc0000, 0x3fc0万,0xfc0万f,0xf0000}
    2145美元= 0x813e000f (SPIBUF)

    由于spibuf值为 0x813e000f,并且24位(DLNERR)设置为1,这也意味着SPI模块将知道它是否错过了时钟。 TRM表示  

    Data-Length Error in Slave Mode: During a transfer, if the SPI detects a de-assertion of the SPICS pin before its character length counter overflows, then an error flag is set to indicate a data-length error. This situation can arise If the slave SPI misses one or more SPICLK pulses from the master. This error in slave mode implies that both the transmitted and received data were not complete.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    VCLK实际上404.8035万实际上会在数据开始和这个周期之间保持较低的延迟。 时钟是否可以在此持续时间内运行,是否会被忽略?[/QUOT]

    这是CS下降边缘和第一个时钟信号上升边缘之间的延迟。 在这两个信号边缘之间,应该没有SPI时钟信号。

    无论404.8035万无论每个组之间的数据传输大小如何,我们都会声明每个数据传输周期的流量。

    这是两次传输之间的最小延迟。

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

    只是确认一下,当您说两次传输之间的最小延迟时,由于SPI的移位寄存器是16位,接收216位数据之间的最小延迟是吗?  

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

    是的,两次传输之间有2个VCLK周期延迟。

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

    嘿QJ,我有一个关于这个问题的跟进问题。 例如,我已将mibspi5配置为从属设备,并且在提到的行中输入了以下数据。 我已在MIBSPIP模式下配置了它,使用mibspi.c中的pmode功能,并以大约6.25 Mhz clk速率运行2条数据线 -

    我有  
    Simo 0 - 0x00 0x05 0x00 0x05 0x00 0x05 0x00 0x05

    Simo 1 - 0xFF 0xFF 0xFF 0xFF 0x00  0x00 0x00  

    我在我的recv arr中看到的数据如下-  

    recv unsigned short [16]  

    [0]无符号短0xFF00 (Hex) 0x0.8万FB8
    [1] unsigned short 0xFF00 (十六进制) 0x0.8万FBA
    [2]无符号短0xFF00 (Hex) 0x0.8万FBC
    [3]无符号短0xFF05 (十六进制) 0x0.8万FBE
    [4]无符号短0xFF00 (十六进制) 0x0.8万FC0
    [5]无符号短0xFF00 (十六进制) 0x0.8万FC2
    [6]无符号短0xFF00 (Hex) 0x0.8万FC4
    [7]无符号短0xFE05 (十六进制) 0x0.8万FC6
    [8]无符号短0x0000 (十六进制) 0x0.8万FC8
    [9]无符号短0x0000 (Hex) 0x0.8万FCA
    [10]无符号短0x0000 (十六进制) 0x0.8万FCC
    [11]无符号短0x0005 (十六进制) 0x0.8万FCE
    [12]无符号短0x0000 (十六进制) 0x0.8万FD0
    [13]无符号短0x0000 (十六进制) 0x0.8万FD2
    [14]无符号短0x0000 (十六进制) 0x0.8万FD4
    [15]无符号短0x0105 (十六进制) 0x0.8万FD6

    您能否帮助我了解为什么数据会如此转移,以及预期的数据是什么样子?