打印

STM32的SPI MASTER方式发送数据时NSS引脚能否硬件自动拉低?

[复制链接]
16786|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alien2006|  楼主 | 2009-4-21 01:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   如题,原来预期在用SPI MASTER方式下,SPI_NSS引脚由硬件控制,平时都是高电平,当我要操作SPI口传输的时候,NSS自动拉低,数据传输完成则自动拉高。不过试了很多次,发现NSS不管怎么设置都是低电平,似乎不会自动拉低。
     我的程序部分如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
    SPI_SSOutputCmd(SPI1, ENABLE);//使能SPI1的SPI1_NSS(PA4)输出
  SPI_Cmd(SPI1, ENABLE);
  while(1)
  {
     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
     SPI_I2S_SendData(SPI1, 0xcc);
   }
   SPI_NSS_Hard也试过了都是如此,NSS引脚不会自动拉低。不知道是不是我哪里还有地方设置的不对呢,还请大家指点指点
   
沙发
香水城| | 2009-4-21 07:24 | 只看该作者

只要SPI处于Master,NSS既自动输出低电平

这是SPI规范所规定的。

使用特权

评论回复
板凳
zhang..yb| | 2009-4-21 10:22 | 只看该作者

有没有可能当SPI MASTER方式发完后由硬件产生一个脉冲?

使用特权

评论回复
地板
香水城| | 2009-4-21 10:54 | 只看该作者

你要求的这种操作方式是I2S的方式,而不是SPI

3楼要求的功能可以通过软件实现。

使用特权

评论回复
5
alien2006|  楼主 | 2009-4-21 12:41 | 只看该作者

版主起这么早啊,7点24分就回复了呀,辛苦了啊,感谢:)

    
    这段内容我反复研究过了,主模式、SSOE使能、NSS引脚的设置, 我观测到NSS的电平始终是为低,即使是SPI不传输期间也为低,实验了多次都是如此,在ST英文论坛上也找了相关的帖子,很多人都有反映这样的情况。我在想是不是必须在NSS引脚上加上拉电阻平时把它拉高才行呢,到时候我再试试

使用特权

评论回复
6
zhang..yb| | 2009-4-21 13:36 | 只看该作者

软件可行,只是忙坏了芯片了

使用特权

评论回复
7
alien2006|  楼主 | 2009-4-21 14:58 | 只看该作者

刚才用逻辑分析仪做了测试

时序如下
https://bbs.21ic.com/upfiles/img/20094/2009421145033856.gif

   反复试验,发现SPI_NSS引脚的自动硬件控制与想象的不同,无论是否外加上拉,只要一使能SPI,SPI_Cmd(SPI1, ENABLE); SPI_NSS引脚就一直处于低电平,直到SPI_Cmd(SPI1, DISABLE);这个需要用程序来控制。  而用过其他芯片则是发送完成自动会拉高,这点是要注意的

使用特权

评论回复
8
niefuwu| | 2009-7-26 12:31 | 只看该作者

小弟也研究了一下

果真如alien2006大哥所说的那样,只要使能了SPI,NSS就一直是低电平,虽然你可以通过GPIO_SetBits(GPIOA, GPIO_Pin_4)把NSS在“软件”上拉高,但是,通过万用表测量,NSS还是低电平。
不过,当我们如alien2006大哥那样把SPI的管脚配置好了之后,如果我们再单独的把NSS管脚配置成普通的推挽式输出,则,我们可以任意的控制NSS管脚,就像是普通的IO口那样。

使用特权

评论回复
9
zhxi| | 2009-12-29 23:45 | 只看该作者
问题解决了没有啊?我也是遇到了这个问题,不想用软件实现啊。

使用特权

评论回复
10
airwill| | 2010-2-10 10:08 | 只看该作者
我也遇到这个问题, 在 LM3SXXX 里 SPI 没有这样的问题, NSS 完全由硬件自动来改变电平, 为什么 STM32 就不可以呢?
由软件来完成, 不合理呀, 要等待发送完成, 或者多个中断服务

使用特权

评论回复
11
Swd21ic| | 2010-6-22 21:44 | 只看该作者
当初看DATASHEET的时候对这个也很困惑..

这样的缺陷的使得SPI不太适合用DMA传输... 只好用软件控制CS. 然后用死等的方法.

使用特权

评论回复
12
elec921| | 2012-4-5 12:37 | 只看该作者
BUG一大堆啊

使用特权

评论回复
13
it_yrj| | 2013-8-16 12:12 | 只看该作者
看来只能通过软件来实现NSS传输完成拉高了

使用特权

评论回复
14
zhongs98| | 2017-11-3 16:35 | 只看该作者
,我现在也是设置成Master模式,NSS只要发送数据,就会被一直拉低。回不了高电平

使用特权

评论回复
15
Cheas_Tong| | 2018-12-15 11:42 | 只看该作者
本帖最后由 Cheas_Tong 于 2018-12-15 11:46 编辑

参考手册上说的很清楚了,主模式下,在硬件驱动NSS情况下,NSS只有在SPE位=1的时候被拉低,只有在SPE=0的时候才被禁止(实际证明还不是拉高,是开漏模式)。而一般初始化SPI之后,SPE是为1的。这也就说明为什么NSS会一直为低了,因为你初始化之后就打开了SPI(即SPE位=1).

使用特权

评论回复
16
st代理| | 2018-12-17 11:52 | 只看该作者

使用特权

评论回复
17
bear1| | 2020-9-24 15:29 | 只看该作者
10年了,st的bug不会还没解决吧??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

136

帖子

6

粉丝