NXP MCU 技术论坛
直播中

独当一面

11年用户 877经验值
擅长:可编程逻辑
私信 关注
[问答]

S32G3 DSPI_1无法驱动BSP41中的gpio片选怎么办?

我有四个相同的 SPI 器件连接到我们定制板上的 DSPI_1。其中 3 个使用原生片选(0、3 和 4),而 1 个使用基于 GPIO 的片选(PC_12)。我在设备树中使用 cs-gpios 指定了所有芯片选择。
但是,只有使用 native chip select 的三个器件才能正常工作。基于 GPIO 的片选器件不返回有效数据。有趣的是,如果我使用 GPIO 命令手动切换 GPIO CS 引脚(在读取前将其拉低,在读取后将其拉高),我可以完成一个事务。但是,我必须为每笔后续交易再次切换密码。
从示波器来看, SPI 控制器似乎根本不驱动 GPIO CS。您知道是否需要任何其他配置才能使 GPIO 芯片选择正常工作?
作为参考,我在下面包含了我的设备树代码段。此外,我在 dmesg 中注意到一条错误消息,但我不确定它是否相关。
[ 0.669149] OF: /soc/spi@401d8000: 无法获取
谢谢
XD
&spi1 {        pinctrl-0 = <&dspi1_pins>;        pinctrl-names = "default";        status = "okay";        spi-num-chipselects = <5>;        cs-gpios = <0>, <&gpio 44 0>, <3>, <4>;        tcan1146@0 {                status = "okay";                compatible = "rohm,dh2228fv";                spi-max-frequency = <4000000>;                reg = <0>;                fsl,spi-cs-sck-delay = <100>;                fsl,spi-sck-cs-delay = <100>;        };        tcan1146@1 {                status = "okay";                compatible = "rohm,dh2228fv";                spi-max-frequency = <4000000>;                reg = <1>;                fsl,spi-cs-sck-delay = <100>;                fsl,spi-sck-cs-delay = <100>;        };        tcan1146@3 {                status = "okay";                compatible = "rohm,dh2228fv";                spi-max-frequency = <4000000>;                reg = <3>;                fsl,spi-cs-sck-delay = <100>;                fsl,spi-sck-cs-delay = <100>;        };        tcan1146@4 {                status = "okay";                compatible = "rohm,dh2228fv";                spi-max-frequency = <4000000>;                reg = <4>;                fsl,spi-cs-sck-delay = <100>;                fsl,spi-sck-cs-delay = <100>;        };};  
                                                                                                                                                                                                                                                                                                        

回帖(1)

哔哔哔-

2025-4-16 18:11:34

针对 S32G3 DSPI_1 无法驱动 GPIO 片选的问题,以下是逐步解决方案:




1. 设备树配置验证


a. 检查 cs-gpios 属性



  • 确保 GPIO 片选引脚(如 PC_12)已正确映射到设备树,格式应为 <&gpio控制器 引脚编号 激活极性>。例如:
    cs-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>,  /* 原生 CS0 */
             <&gpio0 3 GPIO_ACTIVE_LOW>,  /* 原生 CS3 */
             <&gpio0 4 GPIO_ACTIVE_LOW>,  /* 原生 CS4 */
             <&gpio0 12 GPIO_ACTIVE_LOW>; /* GPIO PC_12 */

  • 关键点:确认 引脚编号 是否正确。例如,PC_12 的实际 GPIO 编号可能为 (C组编号 * 32) + 12(需参考芯片手册)。


b. 设置 num-cs 属性



  • DSPI 控制器的 num-cs 必须覆盖所有原生片选 + GPIO 片选。例如,若原生支持 0~4,则:
    num-cs = <5>; /* 支持 CS0~CS4 + GPIO CS */




2. GPIO 配置检查


a. 引脚复用控制 (Pinctrl)



  • 确保 PC_12 已配置为 GPIO 功能而非其他复用功能(如 UART、PWM):
    pinctrl_spi1: spi1grp {
      fsl,pins = <
          S32G3_PC12_GPIO /* 将 PC_12 设为 GPIO */
          ... /* 其他 SPI 引脚配置 */
      >;
    };


b. GPIO 驱动能力与方向



  • 在设备树中明确设置 GPIO 为输出模式:
    gpio@40081000 { /* GPIO 控制器 */
      ...
      pc12 {
          gpio-hog;
          gpios = <12 GPIO_ACTIVE_LOW>;
          output-high; /* 初始化为高电平 */
          line-name = "spi1-cs-gpio";
      };
    };




3. SPI 控制器驱动支持


a. 确认混合片选支持



  • 查阅 S32G3 DSPI 驱动文档,确认是否支持混合使用原生 CS 和 GPIO CS。

  • 常见问题:某些驱动要求 GPIO CS 必须位于 cs-gpios 列表末尾。


b. 检查驱动日志



  • 通过 dmesg 查看内核日志,搜索错误信息:
    dmesg | grep spi

  • 常见错误:spi driver rejected cs-gpiosinvalid GPIO CS




4. 传输参数配置


a. 设置 cs_change 属性



  • 在 SPI 传输描述中设置 cs_change = 1,确保片选在传输间保持有效:
    struct spi_transfer t = {
      .tx_buf = tx_data,
      .len = len,
      .cs_change = 1, /* 保持 CS 有效 */
    };


b. 调整片选时序



  • 若 SPI 设备要求片选在时钟之前拉低,检查设备树中的 spi-cpolspi-cpha
    spi-device@3 {
      compatible = "vendor,device";
      reg = <3>;
      spi-max-frequency = <1000000>;
      spi-cpol; /* 根据设备要求设置 */
      spi-cpha;
    };




5. 硬件信号验证



  • 示波器测量:触发 SPI 传输,观察以下信号:

    • SCLK:确认时钟信号正常。

    • MOSI/MISO:验证数据是否发送/接收。

    • GPIO CS:检查是否在传输开始时拉低,结束时拉高。





6. 驱动补丁或更新



  • 若确认配置无误但问题依旧,可能是驱动存在限制或 Bug:

    • 查阅 NXP 官方 Errata 文档或社区论坛(如 S32G 官方论坛)。

    • 尝试升级内核版本或应用已知补丁。





最终配置示例


&dspi1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_spi1>;
    num-cs = <5>; /* 覆盖 CS0~CS4 */
    cs-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>,
               <&gpio0 3 GPIO_ACTIVE_LOW>,
               <&gpio0 4 GPIO_ACTIVE_LOW>,
               <&gpio0 12 GPIO_ACTIVE_LOW>; /* PC_12 作为 GPIO CS */

    spi-device@3 {
        compatible = "vendor,device";
        reg = <3>; /* 对应 cs-gpios 中的第四个条目 */
        spi-max-frequency = <1000000>;
    };
};

&pinctrl {
    pinctrl_spi1: spi1grp {
        fsl,pins = <
            S32G3_PC12_GPIO /* 确保 PC_12 复用为 GPIO */
            S32G3_PA0_DSPI1_SIN  /* 其他 SPI 引脚配置 */
            S32G3_PA1_DSPI1_SOUT
            S32G3_PA2_DSPI1_SCK
        >;
    };
};

通过以上步骤,应能解决 GPIO 片选未被驱动的问题。如仍遇到问题,建议在驱动代码中添加调试打印,跟踪片选切换逻辑。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分