MSPI_DebugSop

Revision History

Revision NO.
Description
Data
1.0 Initial release 03/30/2024

1. 概述

MSPI在使用过程中,问题发生不频繁,多是对特殊场景的需求。本文提供几种情况用于参考调试。

包含数据发送异常,数据接收异常,通讯timeout等,提供排查流程图以及各步骤的说明。

各平台的mspi内部寄存器基本不变,CLKGEN,PADMUX,BDMA寄存器会存在差异。排查时请以实际平台为准。


2. Keyword

  • GPIO mode:PAD可以被通过padmux复用成mspi引脚,也可以被设定成GPIO引脚,当被设定成GPIO mode时,复用mspi优先级较低,会受影响。

  • PADMUX: PADMUX设定bank为PADTOP,用于指定复用关系。

  • CLKGEN: source clock设定寄存器,用于选取IP的时钟源。

  • BDMA: mspi dma mode需要BDMA这个IP来协助工作,作用是在内存与mspi之间完成数据搬运的功能。


3. 数据异常

数据发送异常,包含没有波形,数据错误,个别引脚(CS/CK/MOSI)没有波形。其中,没有波形可能伴随出现timeout err log,可以查看timeout章节。

3.1. 排查流程图


数据异常检查流程

3.2. 步骤说明

流程节点
节点说明
出口 需提供的分析数据
A 抓取波形,这是通讯问题最直观的分析方法 B
C
-
B 对比波形解析和预期数据是否一致 D
E
F
-
C 无波形的情况,一般发生在引脚错误(设为GPIO并拉高拉低确认引脚是否正确),padmux错误,以及clk没有enable导致的通讯无法进行,也有可能只是设定的触发条件刚好是个别引脚问题,尝试设定其他引脚作为触发条件,当出现个别引脚异常时,判断GPIO mode是否被打开,以及硬件影响 G
H
I
J
-
D 数据丢失,可能是设定的发送字节长度不对 K
L
mspi bank register
bdma bank register
E 数据错误 L
M
-
F 是否个别引脚无波形 N -
G 抓取波形的引脚错误,重新与HW确认应该抓取的引脚 O -
H padmux寄存器设定错误,重新设定 P -
I clkgen没有使能,查找CLKGEN register table,确认gate bit是否打开(SPI0 REG:0x1038 0x33 bit[0]; SPI1 REG:0x1038 0x33 bit[8],对应bit如果为1,则表示clk被关闭) Q -
J LA或示波器的触发条件引脚刚好无动作 - -

4. timeout

出现mspi timeout err log时,一般为代码触发时间节点不合理、双系统都开了MSPI、或者clkgen没有enable,请直接提供code branch,mspi bank和clkgen bank。

如riscv 端在使用spi时没有clk的话,可以排查下是否arm端的spi节点都disabled了,但是dts对应的spi clk节点需要增加ignore 属性,例如:

pcupid.dtsi

spi0: spi@1f222000 {
        compatible = "sstar,mspi";
        mspi-group = <0>;
        clocks = <&CLK_mspi0>;
        reg = <0x0 0x1F222000 0x0 0x200>;
        #address-cells = <1>;
        #size-cells = <0>;
        interrupts = <GIC_SPI INT_IRQ_MSPI_0 IRQ_TYPE_LEVEL_HIGH>;
        dma-enable;
        cs-num = <1>;
        //cs-ext = <PAD_UNKNOWN>;
        //4to3-mode;
        //clk-out-mode = <27000000>;
        status = "disabled";

        spidev0@0 {
            compatible = "lwn,bk4";
            spi-max-frequency = <2000000>;
            reg = <0>;
        };

    };

pcupid-clks.dtsi

CLK_mspi0: CLK_mspi0 {
    #clock-cells = <0>;
    compatible = "sstar,composite-clock";
    clocks = <&CLK_mpll_432m_div4>,<&CLK_mpll_288m_div2>,<&CLK_xtali_12m>,<&CLK_spi_synth_pll>,<&CLK_VOID>,<&CLK_VOID>,<&CLK_VOID>,<&CLK_VOID>;
    reg = <0x0 REG_CKG_MSPI0_BASE 0x0 0x4>;
    mux-shift = <2>;  //2+REG_CKG_MSPI0_OFFSET
    mux-width = <3>;
    gate-shift = <0>;  //0+REG_CKG_MSPI0_OFFSET
    // auto-enable = <0>;
    ignore = <1>;
};

5. 寄存器bank

  1. mspi bank

    mspi0 mspi1
    bank 0x1110 0x1119
  2. clkgen bank

    mspi0 mspi1
    bank 0x1038 0x1038
  3. bdma bank

    bdma bdma2 bdma3
    bank 0x1002 0x100a 0x100b