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

[复制链接]
196|17
 楼主 | 2018-4-26 23:37 | 显示全部楼层 |阅读模式
        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始终被拉低,郁闷,有大神支招不?
| 2018-4-27 10:32 | 显示全部楼层
配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改
 楼主 | 2018-4-27 10:51 | 显示全部楼层
zzyybb22 发表于 2018-4-27 10:32
配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改
  1.         gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_15);
  2.         gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
  3.         gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);

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

  21.         SPI_CTL1(SPI0)=(uint32_t)(
  22.                 (0 <<  7) |        //--  0=TBE中断屏蔽--  1=TBE中断不屏蔽  
  23.                 (0 <<  6) |        //--  0=RBNE中断屏蔽--  1=RBNE中断不屏蔽  
  24.                 (0 <<  5) |        //--  0=错误中断屏蔽--  1=错误中断不屏蔽  
  25.                 (1 <<  2) |        //--  0=主模式下SS输出禁用--  1=起用
  26.                 (0 <<  1) |        //--  0=TX的DMA缓冲禁止  --1=启用   
  27.                 (0 <<  0));        //--  0=RX的DMA缓冲禁止--  1=启用
  28.        
  29.         //SPI_STAT(SPI0)                //----状态寄存器
  30.         //SPI_DATA(SPI0)                //----数据寄存器       
  31.         //SPI_CRCPOLY(SPI0)                //----CRC多项式
  32.         //SPI_RCRC(SPI0)                //----接收CRC计算结果
  33.         //SPI_TCRC(SPI0)                //----发射CRC计算结果
  34.         SPI_I2SCTL(SPI0)=0;
  35.         //SPI_I2SPSC(SPI0)
  36.         //SPI_QCTL(SPI0)
  37.        
  38.         SPI_CTL0(SPI0)|=SPI_CTL0_SPIEN;                //----Enable SPI
  39.         //NVIC_SetPriority(SPI0_IRQn,1);
  40.         //NVIC_EnableIRQ(SPI0_IRQn);
复制代码




重新改写了SPI0的初始化函数,效果一样(数据发送和接收正常,就是NSS信号一直被拉低),请帮忙检查和指正一下问题。谢谢!
 楼主 | 2018-4-28 10:57 | 显示全部楼层
咋没人关注我的问题呢?
| 2018-4-28 15:28 | 显示全部楼层
我也没法用硬件NSS,使用软件操作NSS就好了。
 楼主 | 2018-4-28 16:15 | 显示全部楼层
静听风易 发表于 2018-4-28 15:28
我也没法用硬件NSS,使用软件操作NSS就好了。

就是没搞懂是为什么,估计是哪里设置没对,GD32的手册说的太简单,反复看了几遍手册还是没明白哪里有问题。
 楼主 | 2018-4-28 16:18 | 显示全部楼层
这个是将STM32的项目迁移到GD的,原打算节前迁移完成,现在只有停下先了,郁闷。
 楼主 | 2018-4-28 16:31 | 显示全部楼层
刚刚测试了SPI1

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

还是一样的现象,数据收发正常,但就是没有硬件NSS信号发出。
| 2018-4-28 22:51 | 显示全部楼层
该管脚自身的内部下拉电阻的是怎样设置的?
| 2018-4-28 22:51 | 显示全部楼层
还有该管教室外部是不有下拉电阻设计的?
 楼主 | 2018-4-29 10:50 | 显示全部楼层
vivilzb1985 发表于 2018-4-28 22:51
还有该管教室外部是不有下拉电阻设计的?

内部设置推挽输出,外部悬空测量的。
 楼主 | 2018-5-3 18:41 | 显示全部楼层
都没人关注!
| 2018-5-8 20:34 | 显示全部楼层
这个NSS信号的不要的也可以的吧
| 2018-5-8 22:18 | 显示全部楼层
先看下该管脚的是否又被其他模块调用的
| 2018-5-9 09:55 | 显示全部楼层
/*!
    \brief      SPI NSS output enable
    \param[in]  spi_periph: SPIx(x=0,1,2)
    \param[out] 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 输入,作为从机的片选信号。
| 2018-5-12 19:07 | 显示全部楼层
SPI总线的设计还是非常不错的
| 2018-5-15 19:53 | 显示全部楼层
关于SPI总线的设计还是比较难的
 楼主 | 2018-5-17 23:32 | 显示全部楼层
反正我还是没搞定,现在还是只能手控NSS。当然我也没去搞了。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

分享 快速回复 返回顶部 返回列表