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.

[参考译文] AM5728:SPI 问题

Guru**** 2551110 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595046/am5728-spi-issues

器件型号:AM5728

您好!

我的客户在尝试使用 AM5728修订版2.0 EVM 板上的 SPI3、SPI4时遇到问题

当前目标是使主器件 SPI3仅用于 Tx从器件 SPI4仅用于 Rx、这两个引脚复用为 P16连接器

请参阅相关摘录...

 

  • (笑声) 从 boardPadDelayInit.c:boardPadDelayCfg_t pad[]:

   /* SPI4从器件、D1上的 Tx;Rx 未使用*/

/* SPI3 - B12上的 clk (P16-GPIO5_10:34)*
    {0x16D4、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI3 - A11上的 D1 (P16-GPIO5_11:4); MOSI Tx *
    {0x16D8、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
B13上的/* SPI3 - d0 (P16-GPIO5_12:33);   MISO (未使用)*
    {0x16DC、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI3 - A12上的 cs0 (P16-GPIO5_17:3)*/
    {0x16E0、0x90003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、

   /* SPI4从器件、D0上接收;Tx 未使用*/
/* SPI4 - N7上的 clk (P16-VIN3A_HSYNC:9)*
    {0x1460、0xD0008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI4 - R4上的 D1 (P16-VIN3A_VSYNC:37);   MISO (未使用)*/
    {0x1464、0x90008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
N9上的/* SPI4 - d0 (P16-VIN3A_DE0:14);   黄色;MOSI (Rx 输入)*
    {0x1468、0xD0008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI4 - P9上的 cs0 (P16-VIN3A_FLD:44)*/
    {0x146C、0xD0008、{0x0、0、0}、 {0x0、0、0}、{0x0、0、 0}}、

  • (笑声) 从 evmAM572x_clock.c:Board_moduleClockInit():

/*添加了对主器件回送的 SPI3支持*/

   CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI3_CLKCTRL_REG、
       L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI3_CLKCTRL_REG_MODULEMODE、ENABLE);
/*添加了对从器件回送的 SPI4支持*/
   CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI4_CLKCTRL_REG、
       L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI4_CLKCTRL_REG_MODULEMODE、ENABLE);

  • (笑声) 从 main_mcspi_slave_mode.c:spi_test_mst_SLV_xfer ():


#define MCSPI3_base 0x480b8000
#define MCSPI4_base 0x480ba000
#define WR_REG (reg、val)(*(uint32_t*)(reg)= val)
#define RD_REG (reg、var)(var =*(volatile UINT32_t*) reg)
#define SPI3_CH1CONF (MCSPI3_base + 0x12c)
#define SPI4_CH1CONF (MCSPI4_base + 0x12c)

 

   如果(主机== true)
   {
       transaction.txBuf =(ptr) masterTxBuffer;
       transaction.rxBuf =(ptr) addrMasterRxBuf;
       /*设置主设备 D0_IN D1_OUT */
       RD_REG (SPI4_CH1CONF、CNF);
       cnf |= 1 << 16;
       cnf &=~((1 << 18)|(1 << 17));
       WR_REG (SPI4_CH1CONF、CNF);
   }
   其他
   {
       transaction.txBuf =(ptr) slaveTxBuffer;
       transaction.rxBuf =(ptr) addrSlaveRxBuf;
       /*设置从器件 D0_IN D1_OUT */
       RD_REG (SPI3_CH1CONF、CNF);
       cnf |= 1 << 16;
       cnf &=~((1 << 18)|(1 << 17));
       WR_REG (SPI3_CH1CONF、CNF);
   }

--------
然后、它们在 P16上成对互连引脚、以便 SPI3主器件可以发送到 SPI4从接收器:
34-9 (clk)
4-14 (数据)
3-44 (cs0)

(笑声) 然后、它们继续单步执行 main_mcspi_slave_mode.c

   /*启动 SPI 传输*/
   transferOK = SPI_transfer (SPI、事务);

   if (transferOK){
/*... *


它们既不会在 masterRxBuffer 中接收任何消息、也不会在 slaveRxBuffer 中接收任何消息、尽管通过查看示波器、主 SPI 正在传输。

  • 另一个结果是、当交换主从角色以便 SPI3为从器件、SPI4为主器件、然后 SPI3从器件正确接收消息时、SPI4主器件不接收任何内容。
  • 另一个结果是、在尝试 system_test 时、将 SPI4上的时钟设置为高电平、并在 SPI3寄存器上读取1、正如预期的那样、检测到、但在 SPI3上设置时钟并在 SPI4上读取时、检测到0

(在我看来、如果 SPI4时钟输入由于未知原因而无法正常工作、这种情况就像这样。 或者、我也可能错过器件配置中的某个内容?)

请给我一些提示吗?

提前感谢您、

此致、

Alberto

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

    这是什么软件? Linux、RTOS……
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Biser、

    这是 TI-RTOS、因为没有适用于 Linux 的 SPI 从站就绪驱动程序。
    在需要的地方(例如 SPI system_test)、我的客户正在使用直接寄存器寻址。
    请告诉我您的反馈。

    谢谢、
    Alberto
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Alberto。 我已通知 RTOS 团队。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    阿尔贝托

    您能否在这两种情况下都指定 MCSPI_SYST 设置。 SPI4的 SPIENDIR、SPIDATDIR0和 SPIDATDIR1是否在代码中正确设置?

    另一个需要注意的事项是、为了使主控模式上的 spim_SCLK 信号正常工作、相应 CTRL_CORE_PAD_x 寄存器的 INPUTENABLE 位应设置为0x1、因为这样做是为了进行重定时。 在"主模式的基本 MCSPI 引脚"说明下将此注释添加到 TRM 中。

    此致、
    Rahul

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

    进行测试时、我的客户注意到可能会有另一种影响 SPI 实验结果的影响。
    简要:
    •当通过连接到运行 TI-RTOS 的 XDS560仿真器加载/运行应用程序时、他们会面临上述问题。
    •当通过 XDS100加载/运行应用程序时、XDS100仅在首次引导 TI-RTOS 后连接、然后他们移除 SDCard、然后重新引导器件(ceteris paribus)、SPI4将按预期运行。

    由于目前他们对整个 SDcard 引导至应用程序运行链没有足够的控制、无法轻松重现、我建议我继续简化操作、直到他们能够向我们发送包含案例说明的完整包。

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

    为了安全起见、让我们确保启用这些引脚上的 RX 缓冲器。 对于 SPI3、所有寄存器值应为0xD0003;对于 SPI4、它们都应为0xD0008。

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

    艾哈迈德

    是的、该引脚自开始启用。

    我的客户在使 Sitara 上的 SPI 正常工作方面取得了一些进展。

    他现在正在解决比特率问题。 请查看6MHz 和12MHz 的示波器图片、其中包含字节到字节或位0到位7的时间光标。

    奇怪的行为是显而易见的。 无论它们设置的比特率是多少(高于1.5MHz)、字节到字节的延迟似乎保持大致相同、真正的比特率也是如此。

    它们在2小时读取的 BIOS 应用程序中使用 SPI3和 SPI4、这是 SDK 示例的修改版本、即具有主线程和从线程。

    它们还使用非 DMA 中断模式。

    他们检查了 MCSPI_MODULCTRL[0] SINGLE = 1、CHxCONF[9] Turbo = 1、CHxCONF[28、29] ffer、FFEW = 1、这应确保使用启用了 FIFO 的单通道 Turbo 模式-如果我正确...

    请您指出一个可能的方向、以便更深入地进行探讨吗?

    请注意、此问题现在非常紧急、如果无法快速解决、则需要上报。

    谢谢、

    此致、

    Alberto

    e2e.ti.com/.../Screen-Captures.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    作为更多信息、我要求客户测试 IDK、使用此工具的结果也是一样的。
    请紧急答复。
    谢谢
    Alberto
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    阿尔贝托

    最好从我们提供的主从器件示例中了解代码中发生了哪些变化、而不是 SPI 时钟设置。
    另一个要检查的是在传输期间、多线程应用程序中使用了 Task_sleep 值、可以对此值进行优化。 McSPI 驱动程序仅具有 initDelay 配置、没有其他固定延迟。

    如果驱动器配置为阻塞模式、则驱动器挂起以布置信标。 驱动程序是配置为阻塞模式还是回调模式? 或者检查配置并指定它是非 DMA 中断模式、轮询模式还是非 DMA 回调模式。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    默认情况n`t 下、驱动器禁用 Turbo 模式(CHxCONF[9] Turbo = 0)、我们已经在 Turbo 模式下测试了时钟计时(尽管规格指示它用于多字传输)。 您能否在非涡轮模式下测试此设置? 此外,确认它们是否正在使用驱动程序的 initDelay 和 TCS0的默认配置,或者是否已修改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    解决此问题的方法是将 McSPI 驱动程序从 PRSDK 3.2更新到 PRSDK 3.3、PRSDK 3.3具有基于 EDMA 的驱动程序实现。