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:[AM5728]尽管观察到有效波形、MCSPI1 仅在 MISO (SPI1_D1) 上接收 0x00

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1535021/am5728-am5728-mcspi1-receives-only-0x00-on-miso-spi1_d1-despite-valid-waveform-observed

器件型号:AM5728


工具/软件:

您好:

我正在使用 AM5728 并面临这样的问题 MCSPI1 始终读取 0x00 来自 MISO 引脚 (SPI1_D1) (即使从设备正在正确发送数据)。



1.焊盘配置

CTRL_CORE_PAD_SPI1_D1 (F16)= 0x00040000

CTRL_CORE_PAD_SPI1_D0 (B25)= 0x00010000

CTRL_CORE_PAD_SPI1_CLK (A25)= 0x00010000

CTRL_CORE_PAD_SPI1_CS0 (A24)= 0x00010000

2. MCSPI 寄存器设置

MCSPI_MODULCTRL = 0x00000001

MCSPI_CHxCONF = 0x181E0FC0

观察结果

  • 从器件通过 MOSI 正确接收数据。

  • 示波器显示 MISO 线路上的有效数据。

  • 但是、当我从 MCSPI1 RX 寄存器读取时、所有值都是 0x00

您能帮助我了解哪些内容可能缺失或配置错误吗?

提前感谢。

e2e.ti.com/.../am5728-am5728-mcspi1-receives-only-0x00-on-miso-spi1_d1-despite-valid-waveform-observed

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

    尊敬的 Daewon:

    您能告诉我您正在使用什么 SDK 吗?

    -Josue

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

    您好:

    我使用的 SDK processor_sdk_rtos_am57xx_09_03_00_00
    不过、 SPI 驱动器在裸机中实现 、不使用 SDK 提供的驱动程序。

    谢谢你。

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

    Daewon,

    遗憾的是、有定制的驱动程序实现 不支持 视频。 您可以比较和对比 RTOS SDK 中包含的 SPI 驱动程序 、以确保配置正确。 我会告诉您、我看到出现此问题时、是因为在 Linux 实现中、另一个尝试使用相同引脚的软件发生了冲突。

    祝您好运、

    Josue

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

    我尝试了中的相同设置 TI-RTOS 环境 、如您所建议的、
    但遗憾的是、 仍会出现同样的问题 —RX 寄存器始终读取0x00

    另外、请注意这一点 仅 A15_0 内核正在运行 ;所有其它内核当前都处于非活动状态。

    下面是我使用的代码的简化版本:

    MCSPI_Handle gMcSpiHandle;

    Uint8_t mcspiInit()

    MCSPI_Params spiParams;

    *(volatile uint32_t *) 0x4A0097F0 =(uint32_t) 0x00000002;//时钟启用
    while ((*(volatile uint32_t *) 0x4A0097F0)>> 16)!= 0);

    *(volatile uint32_t *) 0x4A0037A4 =(uint32_t) 0x00010000;// SCLK
    *(volatile uint32_t *) 0x4A0037A8 =(uint32_t) 0x00040000;// D1
    *(volatile uint32_t *) 0x4A0037AC =(uint32_t) 0x00010000;// D0
    *(volatile uint32_t *) 0x4A0037B0 =(uint32_t) 0x00010000;// CS0

    /*初始化 SPI 驱动程序*/
    MCSPI_init ();

    /*默认 SPI 配置参数*/
    MCSPI_Params_init (&spiParams);

    spiParams.bitrate = 48000000;// 48MHz
    spiParams.dataSize = 32;

    /*打开 QSPI 驱动器*/
    gMcSpiHandle = MCSPI_OPEN (0、0、&spiParams);

    IF(!(gMcSpiHandle))

    返回–1;
    }
    返回 0;
    }

    int mcspiTransfer(uint32_t * txData、uint32_t * rxData、uint32_t 大小)

    SPI_Transaction spiTransaction;

    memset (&spiTransaction、0、sizeof (SPI_Transaction));
    spiTransaction.count = size;
    spiTransaction.txBuf =(void*)txData;
    spiTransaction.rxBuf =(void*)rxData;

    bool 状态= MCSPI_TRANSFER (gMcSpiHandle、&spiTransaction);
    if(!status)
    返回–1;

    返回 0;
    }

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

    我在度假时不在办公室。  

    此致、

    Josue

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

    尊敬的 Daewon:

    我已将您的线程重新分配给我们的 RTOS 工程师。

    -Josue

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

    尊敬的 Daewon:

    您能否使用以下焊盘和寄存器配置尝试相同的 SPI 测试、并告诉我们您是否能够收到 Rx 值?

    CHxCONF (0x4809812C)     :0x200403FC
    MODULCTRL (0x48098128)  :0x00000001
    CLK_EN (0x4A0097F0)       :0x00000002
    SCLK (0x4A0037A4)         :0x000C0000
    D1 (0x4A0037A8)            :0x000C0000
    D0 (0x4A0037AC)           :0x000C0000
    CS0 (0x4A0037B0)          :0x00060000

    此致、

    Karthik

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

    您好:
    我已应用您建议的配置、并确认环回测试现在正在成功运行。
    根据此配置、我计划执行几项附加测试以进一步验证结果。
    您是否可以解释哪一部分配置对行为产生了影响?
    再次感谢您的支持。

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

    尊敬的 Daewon:

    感谢您的更新。

    您是否可以解释配置的哪一部分对行为有影响?
    [/报价]

    您能否请参阅上述 TRM 中工作和非工作场景的寄存器值。

    此致、

    Karthik

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

    您好:

    我们目前正在使用您提供的配置进行测试、我们将在此主题中发布结果。

    首先、焊盘设置如下:

    CTRL_CORE_PAD_SPI1_SCK = 0x00000000
    CTRL_CORE_PAD_SPI1_CS0 = 0x00000000
    CTRL_CORE_PAD_SPI1_D0 = 0x00000000
    CTRL_CORE_PAD_SPI1_D1 = 0x00040000

    根据数据表、MUX 值设置为 0。 在四个 SPI1 引脚中、我们将除 D1 以外的所有引脚都配置为输出、因为它们提供输出功能。 D1 (MISO) 配置为输入。

    此外、由于初始设置无法正常工作、我们在进一步测试期间尝试切换内部上拉和下拉设置。 但是、问题仍然存在、并且仍然无法正常运行。

    至于时钟配置、正如您所描述的、它已经设置好、因此我们跳过了进一步的更改。

    后续 McSPI 寄存器配置如下:

    MCSPI1_MODULECTRL = 0x00000001
    MCSPI1_CH0CONF = 0x181E0FC0
    -使用读/写 FIFO
    -手动控制 CS 引脚
    -涡轮模式已启用
    - IS = 1 (D0:MOSI、D1:MISO)
    - DPE1 = 1
    - DPE0 = 0
    - TRM = 0(发送和接收模式)
    - WL = 1F(32 位)
    - ePol = CS 引脚低电平有效
    - CLKD = 0 (48MHz)
    - POL/PHA = 0

    应用上述设置后、执行 McSPI。 但是、我们继续观察到通过 MISO 线路的串行输入无法正常工作。

    之后、根据您提供的焊盘和寄存器设置、我们按如下方式重新配置:

    CTRL_CORE_PAD_SPI1_SCK = 0x000C0000
    CTRL_CORE_PAD_SPI1_CS0 = 0x00060000
    CTRL_CORE_PAD_SPI1_D0 = 0x000C0000
    CTRL_CORE_PAD_SPI1_D1 = 0x000C0000

    MCSPI1_CH0CONF = 0x381C0FC0

    应用这些设置并物理连接 MOSI 和 MISO 以进行环回测试后、通信成功验证。

    谢谢你。

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


    然后我们继续使用这些设置进行测试。
    但是、在这种配置下、我们无法从连接到实际 MCU 的 FPGA 接收 SPI 信号。

    在进一步审查寄存器配置时、我们检查了 McSPI 方框图并得出了一个合理的推理:

    我们认为在此配置下 McSPI 无法正常工作的原因如下。
    参考 McSPI 方框图、它显示了 移位寄存器 发送数据时使用内部时钟。
    但是、为了接收数据、时钟源来自 SCLK 引脚输入

    这表明 SCLK 引脚 不受 DPE0/DPE1(数据线选择)设置控制。
    相反、其方向(输入/输出)由决定 MS(主器件/从器件)位字段 在中 模块控制寄存器
    因此、可以配置 SCLK 引脚以允许 包括输入和输出 (例如,焊盘配置为输入,MS 位设置为主模式以输出 SCLK)。

    在此配置中、SPI 主器件的 SCLK 信号输出可以立即环回到输入缓冲器、并用作 RX 缓冲器的接收时钟。

    因此、我们发现所有其他设置可以像以前一样保留、并仅启用 接收使能位字段 中的CTRL_CORE_PAD_SPI1_SCK值足以使 SPI 通信正常运行。

    谢谢你。

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

    尊敬的 Daewon:

    感谢您的详细说明。 是否需要对此问题提供进一步支持? 如果没有、可以关闭该主题吗?

    此致、

    Karthik