TMS320F28335: McBSP配置成SPI速率问题

Part Number: TMS320F28335

大家好,

           请教个关于McBSP配置成SPI后的速率问题,示波器观测了从将数据写入DXR1到总线上数据实际发送出来的时间,大概550ns的延迟,查阅手册不清楚具体延迟时间是什么导致的。

           示波器图片如下,蓝色线第一个下降沿为数据写入DXR1的时刻,粉色线为MCLKXA,黄色线为MDXA ,波特率配置为9.425MHz

           主要是想了解,1)延时是什么导致的?2)能否延迟,提高带宽利用率?

             McBSP发送代码如下:

Uint16 McbspBSpiTxRx8Bit(Uint16 txByte)
{
Uint16 rxByte = 0U;
Uint16 i = 0U;

while((gMcbspbRegs.SPCR2.bit.XRDY == 0U) && (i < MCBSP_TIMEOUT_LOOP_CTRL_200))
{
DELAY_US(MCBSP_DELAY_TIME_100NS);
i++;
}
gMcbspbRegs.DXR1.all = txByte & 0xFFU; /* send data */

i = 0U;
while((gMcbspbRegs.SPCR1.bit.RRDY == 0U) && (i < MCBSP_TIMEOUT_LOOP_CTRL_200))
{
DELAY_US(MCBSP_DELAY_TIME_100NS);
i++;
}
rxByte = gMcbspbRegs.DRR1.all & 0xFFU; /* receive data */

return rxByte;
}

       MCBSP配置代码如下:

Uint16 McbspConfig(volatile struct mcbsp_regs_t *mcbsp, const TY_SPI_CONFIG *config)
{
mcbsp->SPCR2.all = 0x0000U; /* Reset frame synchronization generator, sample rate generator, transmitter */
mcbsp->SPCR2.bit.FREE = 1U; /* debug, when a breakpoint is encountered, the transfer clock continues to run */
mcbsp->SPCR1.all = 0x0000U; /* Reset receiver, right set word, turn off digital loopback */

mcbsp->PCR.all = 0x0F08U; /* Configure as master */
mcbsp->RCR2.bit.RDATDLY = 1U; /* The data receiving delay bit is set to 1 on the master */
mcbsp->XCR2.bit.XDATDLY = 1U; /* The delay bit for sending data is set to 1 on the master */

mcbsp->SPCR1.bit.DXENA = 1U;

mcbsp->SPCR1.bit.CLKSTP = ((0xA >> 2U)& 0x03U); /* Get the second or third bit */
mcbsp->PCR.bit.CLKXP = ((0xA >> 1U) & 0x01U); /* Get the first bit */
mcbsp->PCR.bit.CLKRP = (0xA & 0x01U); /* Get the 0th bit */

mcbsp->MFFINT.bit.XINT = 0u;
mcbsp->RCR1.bit.RWDLEN1 = 0; /* Configure the word size to receive data, macros available */
mcbsp->XCR1.bit.XWDLEN1 = 0; /* Configure the word size to send data, macros available */
mcbsp->SRGR2.all = 0x2000U; /* Determine the value,CLKSM=1, frame synchronization pulse period FPER =1 CLKG period */
mcbsp->SRGR1.all = 7; /* Used to configure clock rate CLKG and CLKG cycle pulse width */
/* CLKG periodic pulse width defaults to 1 sampling period */
DELAY_US(MCBSP_DELAY_TIME_1US);
mcbsp->SPCR2.bit.GRST = 1U; /* Enable the sample rate generator */
DELAY_US(MCBSP_DELAY_TIME_1US);
mcbsp->SPCR2.bit.XRST = 1U; /* Enable sender from reset */
mcbsp->SPCR1.bit.RRST = 1U; /* Enable the receiver from reset */
mcbsp->SPCR2.bit.FRST = 1U; /* Enable frame sync generator from reset */
}

  • 您好,
    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 好的,感谢您的回复

  • 有没有相关的统计数据,测试过McBSP配置成SPI模式后的最大有效带宽是多少呢

  • 请问有结果了么

  • 您好,

         请问上面提到的McBSP时钟运行在什么频率吗?最大是25MHz。从延迟来看,大约是300ns。

          假设C2000的运行频率为150MHz,这大约是50个时钟周期的延迟。然而,如果我们将其换算成McBSP时钟周期,则大约是7.5个时钟。

         我仍然认为这似乎有点多,也就是说,根据C28x写入数据的时机,我可能会期待McBSP域中有1到2个时钟的延迟,大约在40到80ns之间,再次假设McBSP在25MHz下运行。

  • 您好,DSP运行频率是150MHz,Lspclk是75MHz, SRGR1.CLKGDV配置为7,计算结果时钟应该是9.375MHz

    正如您所说,目前不确定延迟引入的环节,以及延迟为什么这么大

  • 另外,延迟时间从示波器上来看时间大概是500ns

  • 您好,

         因此,在9.375MHz下,McBSP周期为107ns。所以我们看到约5个McBSP时钟周期的延迟,假设从GPIO脉冲到数据开始的时间为500ns。在C28x向McBSP写入寄存器以启动代码的延迟方面,我认为我们可以期待1-2个McBSP时钟周期,具体取决于核心与McBSP之间的时钟对齐情况。因此,我们仍然需要理解约3个时钟周期(约320ns)的延迟。代码是从Flash运行还是从RAM运行?如果是从Flash运行,那么代码执行会因为Flash等待状态设置(我相信最小值是3个等待状态)而有一些额外的延迟;如果是从RAM运行,则不会有这种延迟。从本质上讲,我想看看GPIO脉冲是否可能由于代码执行原因等而显得更延迟。

  • 代码都是在RAM中运行

    您说的1~2个McBSP时钟周期的延迟是否有来源?为什么会有2个McBSP的时钟周期延迟呢?

    代码分配在L4~L7 SARAM和L0~L3 SARAM对于运行时间的影响是否会有引入200~300ns延迟?

    还请协助帮忙分析一下,谢谢

  • 感觉L4~L7 SARAM应该不会引入这么大的延迟时间

  • 您好,

         我将1-2 McBSP延迟基于时钟域的差异以及最坏情况假设,即当从CPU写入McBSP传输时,我们落在本地McBSP时钟转换后紧接着的时钟上。

        代码在RAM中是最好的,这样我们可以消除闪存等待状态作为潜在的时序问题。

        另外,还有没有其他系统中断可能会干扰,比如来自ADC等的中断,造成写入延迟?

         或者为了调试的方便,我是否应该仅考虑McBSP/C28x处于活动状态。

  • 感谢您的回复

    1、对于您说的"即当从CPU写入McBSP传输时,我们落在本地McBSP时钟转换后紧接着的时钟上。",这句话怎么理解,是说CPU时钟和McBSP时钟的是异步的,还是其他意思?

    2、验证McBSP功能时,所有的中断都处于关闭状态;另外您说的造成写入延迟,是指应用程序写入DXR1的时间么,这部分通过示波器来看,现在的延迟在于写入DXR1后,数据发送的延迟,不在于应用程序写入DXR1;

    3、“或者为了调试的方便,我是否应该仅考虑McBSP/C28x处于活动状态”,这句话如何理解?

    期待您的回复

  • 你好,我想请问您一下,mcbsp配置成spi模式时,此时spi传输数据的波特率为多少,是用Lspclk/(SRGR1.CLKGDV+1)来算的波特率吗

  • 是的,按照我上面贴的代码,波特率计算是这样的。

    也可以参照一下手册里面的框图

  • 您好,工程师。

    请问有新的进展了么

  • 您好,

         还在内部确认,请等待后续回复。

  • 好的,感谢,期待您的回复

  • 您好,

    1、对于您说的"即当从CPU写入McBSP传输时,我们落在本地McBSP时钟转换后紧接着的时钟上。",这句话怎么理解,是说CPU时钟和McBSP时钟的是异步的,还是其他意思?

    它们不是异步的,因为 McBSP 时钟是从 CPU 系统时钟派生的;但是 McBSP 时钟是从 CPU 时钟分频得到的。因此,从 CPU 域发起的写入 McBSP 寄存器可能会发生在 McBSP 时钟之间,从而产生延迟。

    2、验证McBSP功能时,所有的中断都处于关闭状态;另外您说的造成写入延迟,是指应用程序写入DXR1的时间么,这部分通过示波器来看,现在的延迟在于写入DXR1后,数据发送的延迟,不在于应用程序写入DXR1;

    是的,但设置 GPIO 的 CPU/指令将在写入 DXR1 之前至少1个 SYSCLK,这取决于 C28x CPU 的流水线。但公平地说,这在 150MHz 下只是几次 CPU 时钟的延迟。

    3、“或者为了调试的方便,我是否应该仅考虑McBSP/C28x处于活动状态”,这句话如何理解?

    我的意思是代码没有执行其他任何操作,比如ADC中断服务例程或其他可能导致数据写入DXR延迟的操作。