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:配置为从器件时出现 MibSPI 问题

Guru**** 2478765 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/959538/tms570lc4357-mibspi-issue-when-configured-as-slave

器件型号:TMS570LC4357

大家好、

 在我们的应用中、我们将 MibSPI 接口用于 TMS570LC4357和 FPGA 之间的通信、其中 FPGA 配置为主模式、而 TMS570LC4357 配置 为从模式。

建立的通信处于4引脚模式(即 SOMI、MISO、CS、CLK)。 其中主时钟(FPGA)为10MHz。 我们已将 TMS570LC4357 系统时钟配置为180MHz、将外设时钟配置为30MHz、如下所示:

 并使用以下代码将 MibSPI (使用 MibSPI2)配置为从器件(Halcogne 生成的代码):

void mibspiInit (void)

uint32 i;

/*用户代码开始(2)*/
/*用户代码结束*/


/**@b 初始化@b MIBSPI2 */

/**使 MIBSPI 退出复位*/
mibspiREG2->GCR0 = 0U;
mibspiREG2->GCR0 = 1U;

/**启用 MIBSPI2多缓冲模式并启用缓冲 RAM */
mibspiREG2->MIBSPIE =(mibspiREG2->MIBSPIE & 0xFFFFFFFEU)| 1U;

/** MIBSPI2主控模式和时钟配置*/
mibspiREG2->GCR1 =(mibspiREG2->GCR1 & 0xFFFFFFFCU)|((uint32)((uint32) 0U << 1U)/* CLOKMOD */
|0U);/*主设备*/

/** MIBSPI2使能引脚配置*/
mibspiREG2->INT0 =(mibspiREG2->INT0 & 0xFEFFFFFFU)|(uint32)((uint32) 0U << 24U);//启用 HICHZ */

/**-延迟*/
mibspiREG2->delay =(uint32)((uint32) 0U <<24U)/* C2TDELAY */
|(UINT32)((UINT32) 0U <<16U)/* T2CDELAY */
|(UINT32)((UINT32) 0U <<8U)/* T2EDELAY */
|(uint32)((uint32) 0U << 0U);// C2EDELAY *

/**-数据格式0 */
mibspiREG2->FMT0 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 2U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/

/**-数据格式1 */
mibspiREG2->FMT1 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/

/**-数据格式2 */
mibspiREG2->FMT2 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/

/**-数据格式3 */
mibspiREG2->FMT3 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/

/**-默认芯片选择*/
mibspiREG2->DEF =(uint32)(0xFFU);

/**-在访问 MibSPI 寄存器之前等待缓冲器初始化完成*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
while ((mibspiREG2->FLG & 0x01000000U)!= 0U)

}/*等待*/

/**启用 MIBSPI RAM 奇偶校验*/
mibspiREG2->PAR_ECC_CTRL =(mibspiREG2->PAR_ECC_CTRL & 0xFFFFFFF0U)|(0x00000005U);

/**-初始化传输组*/
mibspiREG2->TGCTRL[0U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32) 0U << 8U);//开始缓冲区

mibspiREG2->TGCTRL[1U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32) 8U << 8U);//开始缓冲区

mibspiREG2->TGCTRL[2U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U)<< 8U);//开始缓冲区

mibspiREG2->TGCTRL[3U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U)<<8U);//开始缓冲区

mibspiREG2->TGCTRL[4U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U)<<8U);//开始缓冲区

mibspiREG2->TGCTRL[5U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区

mibspiREG2->TGCTRL[6U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区

mibspiREG2->TGCTRL[7U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(UINT32)((UINT32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区


mibspiREG2->TGCTRL[8U]=(uint32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U)<< 8U;

mibspiREG2->LTGPEND =(mibspiREG2->LTGPEND & 0xFFFF00FFU)|(UINT32)((((UINT32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+1U-)-1U))<<8U);

 /*未复制配置 RAM 组的代码*/

/**- MIBSPI2端口输出值*/
mibspiREG2->PC3 =(uint32)((uint32) 1U <<0U)/* SCS[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *

/**- MIBSPI2端口方向*/
mibspiREG2->PC1 =(uint32)((uint32) 0U <<0U)/* SCS[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *

/**- MIBSPI2端口开漏使能*/
mibspiREG2->PC6 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *


/**- MIBSPI2端口上拉/下拉选择*/
mibspiREG2->PC8 =(uint32)((uint32) 1U <<0U)/* scs[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(uint32)((uint32) 1U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */


/**- MIBSPI2端口上拉/下拉使能*/
mibspiREG2->PC7 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *


/* MIBSPI2将所有引脚设置为功能*/
mibspiREG2->PC0 =(uint32)((uint32) 1U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(uint32)((uint32) 1U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */

/**-最后启动 MIBSPI2 */
mibspiREG2->GCR1 =(mibspiREG2->GCR1 & 0xFEFFFFFFU)| 0x01000000U;

在该配置中、通过 MIBSPI 发送数据时、我们看到 MIBSPI-RAM 中的数据写入正确、但 FPGA 是 MSB 位设置为1的数据。

示例:如果我们正在发送0x01、0x02、0x03、FPGA 正在接收0xC001、0xC002、0xC003...

不确定导致此问题的实际根本原因。我们还尝试了将 MIBSPI-RAM 配置为不同的 MPU 配置,如严格排序、设备可共享和直写式,但无法正常工作。

 在调试时、我们观察到 SPI-INTFLAG 在传输后被设置为位错误和数据长度错误(值为 INTFLAG = 0x0251)、并且 RxBUF/EMU 被写入0x81000000。

但是、当我们将 VCLK1时钟从30MHz 增加到90MHz (如图 I 所示)时、我们不会看到这个问题、并且 INTFLAG 中没有设置错误标志(如图所示)。 (二)。 此外,RxBUF/Emu 被读取为0x8000FFFF,数据正在 FPGA 上正确接收。

图 I:-

 

 

 

图 二:-

 

我们还尝试了60MHz 的 VCLK1、但我们看到在 INTFLAGS 中设置了位错误、如下所示:

请告诉我们此处是否缺少任何配置。

 

 

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

    您好!

    在受控模式下、SPICLK 引脚上的最大输入频率为 VCLK 频率/2。 如果从器件配置为3引脚或4引脚(无 SPIENA)模式、那么、在最后一个 SPICLK 结束和下一个缓冲器的 SPICLK 开始之间、至少应有6个 VCLK 周期的延迟。

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

    您好、Wang、

    感谢你的答复。 对您的回复还有一些疑问。

    受控模式下、SPICLK 引脚上的最大输入频率为 VCLK 频率/2。  

      如果我们将 VCLK 配置为30MHz 或60MHz、对于从器件 SPICLCK 引脚上的最大时钟、分别为15MHZ 或30MHz、但我们仍然看到数据传输问题以及位错误和数据长度错误设置。

      令人惊讶的是、如果我们将 VCLK 配置为90MHz、数据传输在没有设置错误位的情况下运行良好。 不确定为什么增加频率可以解决该问题。

    如果 从机配置为3引脚或4引脚(无 SPIENA)模式、那么在最后一个 SPICLK 结束和下一个缓冲器的 SPICLK 开始之间、至少应有6个 VCLK 周期的延迟。

     如果需要至少6个 VCLK 周期的延迟、那么我们想知道它如何适用于90MHz 时钟? 不适用于30或60MHz。

    此外、请务必与我们分享相关文档、其中介绍了具有不同时钟配置的从机模式下 SPICLK 引脚的行为。

    此致、

    Srhari

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

    您好 Srhari、

    我将设置我的板以执行类似的测试、然后返回给您。 很抱歉我的回答延迟。

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

    您好 Srhari、

    我在 VCLK=37.5MHz、SPICLK=1MHz 的情况下进行了测试。 在我的测试中、SPI1是主器件、SPI3是从器件。  

    我运行循环大约9000次、没有错误。

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

    我的测试基于标准 SPI 模式:SPI1和 SPI3。 我将尝试多缓冲模式

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

    您好、Wang、

    感谢您测试 SPI。

    我们正在寻找以下配置来用于 MibSPI。

    我们还观察到一个问题、如果我们按如下方式配置时钟、MibSPi 就会工作、但我们观察到 DAP 复位问题的频繁发生。

    此致、

    Srihari

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

    您好!

    是否可以增大 C2TDELAY? 我看到主器件端接收到的数据不正确的问题。 下面是我捕获的波形。 通道1为 nCS、通道3为 SIMO、通道4为 SOMI 信号。 SOMI 和 SIMO 上的数据应该为0x5A5A。 但 SOMI 数据被右移1位。 这意味着从器件从第二个时钟边沿开始输出信号。

    MibSPI3在我的测试中是从器件。 如 TRM 中所述、如果 SPIENA 未被使用、主器件应该在发送时钟开始传输前等待6个 VCLK 周期。 在我增加 C2TDELAY 后、从器件输出正确的数据。 我知道您使用不同的从器件、这些从器件可能具有不同的设置时间要求。   

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

    您好 Srihari、

    插入 C2TDELAY 是否有助于您的情况?

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

    您好、Wang、

    我们尝试插入 C2TDEALY、但它没有帮助。

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

    感谢您的努力、我将进一步调查此问题。