成熟芒果箱 发表于 2025-4-27 19:57

GD32配置硬件SPI时NSS一直为低电平(已解决)

本帖最后由 成熟芒果箱 于 2025-4-28 11:05 编辑

在GD32F405RET6中配置SPI2,使用PA15PC10PC11PC12分别作CS SCK MISO MOSI,使用硬件NSS模式时,PA15一直拉低,SCK和MOSI输出看起来都比较正常,请问下这是什么原因造成的,如何进行改进

成熟芒果箱 发表于 2025-4-27 20:01

补充:这两张分别是SCK和NSS、SCK和MOSI的示波器输出。

成熟芒果箱 发表于 2025-4-27 20:02

补充:以下是SPI2配置的代码段
void spi2_config(void) {
    /* 使能GPIO和SPI2时钟 */

      spi_parameter_struct spi_init_struct;
    rcu_periph_clock_enable(RCU_GPIOC);   // 使能GPIOC时钟
    rcu_periph_clock_enable(RCU_GPIOA);   // 使能GPIOA时钟(PA15)
    rcu_periph_clock_enable(RCU_SPI2);    // 使能SPI2时钟




    /* 配置引脚复用功能 */
    // CS PA15 : 复用推挽输出
      gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
    gpio_af_set(GPIOA, GPIO_AF_6, GPIO_PIN_15);

    // SCK PC10 : 复用推挽输出
      gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
    gpio_af_set(GPIOC, GPIO_AF_6, GPIO_PIN_10);
    // MISO PC11: 复用浮空输入
      gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
    gpio_af_set(GPIOC, GPIO_AF_6, GPIO_PIN_11);

    // MOSI PC12: 复用推挽输出
   gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
         gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
    gpio_af_set(GPIOC, GPIO_AF_6, GPIO_PIN_12);

    /* 复位并配置SPI2 */
    //spi_i2s_deinit(SPI2);

    /* configure SPI1 parameter */
    spi_init_struct.trans_mode         = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size         = SPI_FRAMESIZE_16BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_HARD;
    spi_init_struct.prescale             = SPI_PSC_64;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI2, &spi_init_struct);
      //SPI_CTL0(SPI2) = ((uint32_t)0x0000084cU);
      spi_nss_output_enable(SPI2);

    /* 使能SPI2 */
    spi_enable(SPI2);
}

dffzh 发表于 2025-4-28 09:05

大致看了配置,没有明显问题吧;
你可以确认一下是否是NSS引脚外围的硬件电路拉低了,比如NSS与GND短路了等等

成熟芒果箱 发表于 2025-4-28 09:16

dffzh 发表于 2025-4-28 09:05
大致看了配置,没有明显问题吧;
你可以确认一下是否是NSS引脚外围的硬件电路拉低了,比如NSS与GND短路了等 ...

好的,感谢,看了下原理图,PA15是直接连接的排针引出来的应该没有短路问题,目前怀疑是JTAG没有禁用,PA15引脚是JTAG中的JTDI引脚

dffzh 发表于 2025-4-28 09:32

成熟芒果箱 发表于 2025-4-28 09:16
好的,感谢,看了下原理图,PA15是直接连接的排针引出来的应该没有短路问题,目前怀疑是JTAG没有禁用,   ...

类似的问题,我之前在其他厂商MCU上还真遇到过;
那你加上下面代码再试试:
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE)

成熟芒果箱 发表于 2025-4-28 11:04

dffzh 发表于 2025-4-28 09:32
类似的问题,我之前在其他厂商MCU上还真遇到过;
那你加上下面代码再试试:
gpio_pin_remap_config(GPIO_ ...

感谢,这个已经尝试过了,gd32f4的库函数版本里面没有这个库函数。不过问题已经解决了,不使用它的硬件NSS,使用GPIO通用输出模拟片选就可以了,它的硬件NSS可能有问题,后面NSS换了PA4好像仍然没有动作。

cuyebiren 发表于 2025-4-29 08:39


使用硬件SPI的NSS时,需要在传输结束时,失能SPI;在传输开始时,使能SPI。
因为一旦使能SPI,NSS就会一直为低电平,失能后才会变为高电平。
STM32、AT32等mcu也都是这个情况。

成熟芒果箱 发表于 2025-4-29 11:02

cuyebiren 发表于 2025-4-29 08:39
使用硬件SPI的NSS时,需要在传输结束时,失能SPI;在传输开始时,使能SPI。
因为一旦使能SPI,NSS就会一直 ...

我尝试过失能SPI,但是示波器仍然抓不到NSS拉高的状态,也可能是我示波器没配置好。

xionghaoyun 发表于 2025-4-29 15:56

怎么解决的

成熟芒果箱 发表于 2025-4-30 15:46

xionghaoyun 发表于 2025-4-29 15:56
怎么解决的

7楼有提,不使用硬件NSS,用PA15的通用输出模拟片选,项目中SPI只需要做配置,所以不需要考虑占用CPU,所以这个方法影响不大

xionghaoyun 发表于 2025-5-3 08:31

成熟芒果箱 发表于 2025-4-30 15:46
7楼有提,不使用硬件NSS,用PA15的通用输出模拟片选,项目中SPI只需要做配置,所以不需要考虑占用CPU,所 ...

谢谢
页: [1]
查看完整版本: GD32配置硬件SPI时NSS一直为低电平(已解决)