wingis 发表于 2018-4-26 23:37

GD32F190的 SPI主模式无法输出NSS信号

      spi_parameter_struct spi_init_struct;

        gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_15);
        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);



   
    /* SPI0 parameter config */
    spi_init_struct.trans_mode         = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size         = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_8;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);

数据发送和接收都是正常的,但是就是没有NSS信号发出,电路上肯定没问题的,因为原来是STM32F0的板子,只是换了GD32F190上去,我使用PA15做NSS输出,也有配置PA15到AF0,外部有上拉10K电阻,但是芯片工作后NSS始终被拉低,郁闷,有大神支招不?

zzyybb22 发表于 2018-4-27 10:32

配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改

wingis 发表于 2018-4-27 10:51

zzyybb22 发表于 2018-4-27 10:32
配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改

        gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_15);
        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);

        SPI_CTL0(SPI0)&= ~SPI_CTL0_SPIEN;         //----Disable SPI
       
        SPI_CTL0(SPI0)=(uint32_t)(
                (0 << 15) |        //--0=两线单向--1=单线双向
                (0 << 14) |        //--0=单线双向只接收--1=单线双向只发送
                (0 << 13) |        //--0=CRC计算禁止--1=CRC计算使能
                (0 << 12) |        //--0=下一发送值来自发送寄存器--1=下一发送值来自CRC寄存器
                (1 << 11) |        //--0=8位帧长度--1=16位帧长度
                (0 << 10) |        //--0=两线单向全双工--1=两线单向只接收不发送
                (0 <<9) |        //--SSM0=NSS脚从硬件管理--1=起用SSI从软件管理
                (1 <<8) |        //--SSI当SSM位为1时,此位值决定了NSS引脚电平
                (0 <<7) |        //--0=先发送MSB--1=先发送LSB
                (0 <<6) |        //--0=禁止SPI设备--1=开启SPI设备
                (4 <<3) |        //--(0-7)波特率控制,为PCLK的分频倍数(2,4,8,16,32,64,128,256)
                (1 <<2) |        //--0=配置为从设备--1=主设备
                (0 <<1) |        //--时钟极性
                (0 <<0));        //--时钟相位

        SPI_CTL1(SPI0)=(uint32_t)(
                (0 <<7) |        //--0=TBE中断屏蔽--1=TBE中断不屏蔽
                (0 <<6) |        //--0=RBNE中断屏蔽--1=RBNE中断不屏蔽
                (0 <<5) |        //--0=错误中断屏蔽--1=错误中断不屏蔽
                (1 <<2) |        //--0=主模式下SS输出禁用--1=起用
                (0 <<1) |        //--0=TX的DMA缓冲禁止--1=启用   
                (0 <<0));        //--0=RX的DMA缓冲禁止--1=启用
       
        //SPI_STAT(SPI0)                //----状态寄存器
        //SPI_DATA(SPI0)                //----数据寄存器       
        //SPI_CRCPOLY(SPI0)                //----CRC多项式
        //SPI_RCRC(SPI0)                //----接收CRC计算结果
        //SPI_TCRC(SPI0)                //----发射CRC计算结果
        SPI_I2SCTL(SPI0)=0;
        //SPI_I2SPSC(SPI0)
        //SPI_QCTL(SPI0)
       
        SPI_CTL0(SPI0)|=SPI_CTL0_SPIEN;                //----Enable SPI
        //NVIC_SetPriority(SPI0_IRQn,1);
        //NVIC_EnableIRQ(SPI0_IRQn);



重新改写了SPI0的初始化函数,效果一样(数据发送和接收正常,就是NSS信号一直被拉低),请帮忙检查和指正一下问题。谢谢!

wingis 发表于 2018-4-28 10:57

咋没人关注我的问题呢?

静听风易 发表于 2018-4-28 15:28

我也没法用硬件NSS,使用软件操作NSS就好了。

wingis 发表于 2018-4-28 16:15

静听风易 发表于 2018-4-28 15:28
我也没法用硬件NSS,使用软件操作NSS就好了。

就是没搞懂是为什么,估计是哪里设置没对,GD32的手册说的太简单,反复看了几遍手册还是没明白哪里有问题。

wingis 发表于 2018-4-28 16:18

这个是将STM32的项目迁移到GD的,原打算节前迁移完成,现在只有停下先了,郁闷。

wingis 发表于 2018-4-28 16:31

刚刚测试了SPI1

B12---->NSS
B13---->SCK
B14---->MISO
B15---->MOSI

还是一样的现象,数据收发正常,但就是没有硬件NSS信号发出。

vivilzb1985 发表于 2018-4-28 22:51

该管脚自身的内部下拉电阻的是怎样设置的?

vivilzb1985 发表于 2018-4-28 22:51

还有该管教室外部是不有下拉电阻设计的?

wingis 发表于 2018-4-29 10:50

vivilzb1985 发表于 2018-4-28 22:51
还有该管教室外部是不有下拉电阻设计的?

内部设置推挽输出,外部悬空测量的。

wingis 发表于 2018-5-3 18:41

都没人关注!

smilingangel 发表于 2018-5-8 20:34

这个NSS信号的不要的也可以的吧

comeon201208 发表于 2018-5-8 22:18

先看下该管脚的是否又被其他模块调用的

CharryW 发表于 2018-5-9 09:55

/*!
    \brief      SPI NSS output enable
    \paramspi_periph: SPIx(x=0,1,2)
    \param none
    \retval   none
*/
void spi_nss_output_enable(uint32_t spi_periph)
{
    SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV;
}
NSS输出使能。

此外 :
主机硬件NSS 模式:为NSS 输出,NSSDRV=1 时,为单主机模
式,NSSDRV=0 时,为多主机模式。
从机硬件NSS 模式:为NSS 输入,作为从机的片选信号。

firstblood 发表于 2018-5-12 19:07

SPI总线的设计还是非常不错的

chuntian2016 发表于 2018-5-15 19:53

关于SPI总线的设计还是比较难的

wingis 发表于 2018-5-17 23:32

反正我还是没搞定,现在还是只能手控NSS。当然我也没去搞了。

yywyai 发表于 2018-6-20 13:01

NSS输出使能后,当SPI使能时,如果NSS引脚配置为输出模式,NSS引脚在主模式时被拉低。也就是NSS脚在SPI使能后一直是低电平

xixihahaa 发表于 2024-7-21 22:40

确实垃圾 GD32E230也一样 NSS脚一直为低
页: [1] 2
查看完整版本: GD32F190的 SPI主模式无法输出NSS信号