[导读]

SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚,硬件模式)相连。真正作用的是内部NSS引脚(内部NSS引脚才真正连接到SPI通信控制器上)
SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚,硬件模式)相连。真正作用的是内部NSS引脚(内部NSS引脚才真正连接到SPI通信控制器上)

SPI从模式的配置(MSTR=0)

1.硬件模式:SSM=0,当外部NSS为低电平时,内部NSS也为低电平,此时可以传送数据。
2.软件模式:SSM=1,并SSI=0.让内部NSS引脚为低电平,此时可以传送数据。

相比较而言: 让stm32工作在软件从模式,还是硬件从模式,取决于主从之间的通讯协议,通讯协议中是否需要NSS控制。如果让STM32模拟一个存储器芯片W25Q16的话,则需工作在硬件模式。
如果通讯协议不需要NSS控制,也能达到要求,就可以选择软件模式,可以释放出一个GPIO引脚做它用。

SPI主模式配置(MSTR=1)

1.硬件模式:SSM=0
A:输入模式:SSOE=0,在外部NSS引脚为高电平,即内部NSS引脚也为高电平时,才能进行数据传输。 如果要使能从设备,还需要一个GPIO引脚。
B:输出模式:SSOE=1, 外部NSS引脚会输出低电平,使能从设备,进行数据传输。 不需要额外的GPIO引脚就能控制从设备。
2.软件模式:SSM=1,SSI=1,将内部NSS引脚设置为高电平。这样随时可以传输数据。当然多数情况还需要一个GPIO引脚输出低电平,来使能从设备,让从设备可以接收数据。

以驱动W25Q16为例, SPI主模式配置的优劣可以想象到,硬件的输入模式,占用外部NSS引脚和GPIO引脚,一共两个引脚;
硬件的输出模式和软件模式,都只占用一个引脚,他们的不同在于,硬件输出模式必须使用某固定的端口,而软件模式可以使用任意GPIO端口。

在实际中,stm32通常用作主模式,选择软件模式。

关于这个NSS我曾经为它头痛了很久,看手册,看程序,看视频,看帖子,我都没有彻底搞明白它。曾经几次想彻底解决它,但是都夭折了,只能把自己写好的笔记抛弃。还因此多虑导致气血不足,上火,由此导致牙痛,嘴唇干裂。简直痛苦不已。那时候,我真的觉得我可能永远搞不明白了。就这样算了吧。老师说,让我先做做技术,再去追求原理,后来我通过接手了一个用SPI控制ADXL345加速度传感器的任务并结合了一个SPI全双工的实例,才由此慢慢使谜团浮出水面,再通过学会调试技术,终于搞明白了。SPI真的很复杂,不过复杂而有趣。我以一个菜鸟的身份,写出我对STM32 SPI NSS的相关理解。希望大家指正。
这个NSS到底是怎么作用呢?回答是片选。
主设备和从设备在进行SPI通信的时候,从设备都有个CS片选信号,低电平有效,我们通常都要用这个NSS连到从设备的CS上。但是这里只是大体让大家大体明白怎么回事,东西很多,关于这个NSS,还有很多东西呢,下面让我娓娓道来。

先看输入输出模式.

对于每个SPI的NSS可以输入,也可以输出。所谓输入,就是NSS的电平信号给自己,所谓输出,就是将NSS的电平信号发送出去,给从机。配置为输出,还是不输出,我们可以通过SPI_CR2寄存器的SSOE位。当SSOE为1时,并且SPI处于主模式控制时,NSS就输出低电平,也就是拉低,因此当其他SPI设备的NSS引脚与它相连,必然接收到低电平,则片选成功,都成为从设备了。NSS的输出就介绍到这里
下面介绍NSS的输入。
我们都知道NSS输入又分为硬件输入和软件控制输入两种模式,那么就从这两种模式入手,来揭开它的面纱吧。
先说软件模式吧
1 对于SPI主机来说
需要设置SPI_CR1寄存器的SSM为1和SSI位为1,SSM为1是为了使能软件管理。,NSS有内部和外部引脚。这时候,外部引脚留作他用(可以用来作为GPIO驱动从设备的片选信号)。内部NSS引脚电平则通过SPI_CRL寄存器的SSI位来驱动。SSI位为1是为了使NSS内电平为高电平。这时候,不免产生疑问,为什么主设备的内部NSS电平要为1呢?
STM32手册上说,要保持MSTR和SPE位为1,也就是说要保持主机模式,只有NSS接到高电平信号时,这两位才能保持置1.也就是说对于STM32的SPI,要保持为主机状态,内部输入的NSS电平必须为高。当然这里在硬件模式下也是如此。

2 对于SPI 从机来说

主机自己的内部NSS高电平解决了,那么SPI从机的NSS片选低电平也得解决啊。
如果从机选择STM32的一个SPI,譬如主机选为SPI1,从机选为SPI2,则要按照以下操作手册说,NSS引脚在完成字节传输之前必须连接到一个低电平信号。在软件模式下,则需要设置SPI_CR1寄存器的SSM为1(软件管理使能)和SSI位为0.果然如此。SSI必须要为0,也就是SPI2的片选为低,则片选成功。
若从机为一个其他的SPI芯片,譬如我那个ADXL345加速度传感器。那么,我们可以有两种方法
一种方法,是把芯片的CS接到GND上,另一种方法是,用一个GPIO口去输出低电平来控制CS片选成功。这个GPIO可以是任何一个GPIO口,当然我们上面提到当SPI的主机配置为软件模式,外部NSS引脚留作他用了,它就是一个GPIO了,我们也可以用它。这时候,我们可以设置它推挽输出为低电平,然后用线跟从机的CS相连,那么就可以片选从芯片了。
再说说硬件模式。
对于主机,我们的NSS可以直接接到高电平,对于从机,NSS接低就可以。
当然我们上面提过当一个主机的SSOE为1时,主机工作在输出模式,而且NSS拉低了,我们要让从机片选,只要将CS接到主机的NSS上,CS自动拉低。
这便是,ST公司设计的STM32 SPI NSS的工作流程。下面用实例向大家介绍。
我们介绍一个STM32上SPI1和SPI2全双工通信的程序,具体的程序,可以加QQ843538946,问我要。这里只介绍SPI配置方面的程序。
[cpp] view plain copy /* SPI1 Config -------------------------------------------------------------/ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master,//这里设置SPI1为主模式,设置SSI为1 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;//这里设置SSM为1,软件管理 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); / SPI2 Config -------------------------------------------------------------*/ SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;//这里设置SPI2为从模式SSI为0 //因为SPI2和SPI1用的是同一个SPI_InitStructure,所以SSM位已经为1 SPI_Init(SPI2, &SPI_InitStructure);
对于SPI2的配置,和SPI1用的是同一个结构体,只需要把模式和SSI一改就行,其他的譬如软件使能,还有时序什么的都不用改。这样SPI1和SPI2就配置好了。以后就可以传输数据了。

STM32 SPI 软件NSS和硬件NSS解读相关推荐

  1. #STM32标准固件库的硬件SPI(NSS为软件)封装函数库

    #基于STM32标准固件库的硬件SPI(NSS为软件)封装函数库: 最近来回顾之前写过的SPI_Flash,打算重写一次SPI配置文件 spi协议最大的特点大概就是全双工了,因此stm32硬件spi的 ...

  2. stm32 spi nss硬件模式配置参考程序

    By: Ailson Jack Date: 2020.11.27 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/ ...

  3. STM32 SPI NSS 引脚为不能拉高问题

    使用过 STM32 的SPI 的朋友可能都会发现一个问题,那就是其NSS引脚 在硬件模式下无法自动拉高,可能也因为这个原因致使  .大部分朋友在使用SPI时候都是优先选用软件 控制NSS引脚的工作模式 ...

  4. STM32 SPI NSS 作用

    STM32 SPI NSS 作用 原创 2017年06月16日 11:18:14 142 SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚, ...

  5. STM32 SPI NSS大揭秘

    SSM可以控制内部NSS引脚与SSI(一个寄存器,软件模式)相连,还是与NSS外部引脚(真正的STM32引脚,硬件模式)相连.真正作用的是内部NSS引脚(内部NSS引脚才真正连接到SPI通信控制器上) ...

  6. STM32 SPI 的NSS引脚问题

    STM32 SPI 的NSS引脚如果使用软件管理模式,在主机从机都是用中断方式接收和发送时会出现问题.整了一周多,问题表现为,主机发送的数据从机能正确接收,但是从机发送的问题主机接收出错,收到一坨乱的 ...

  7. 解决STM32 SPI 半残废 NSS无法拉高

    众所周知,STM32  SPI是个半残废,NSS无法自动拉高,所以使用SPI 从机会一直使能,当主机是一对多的时候,就会出现SPI从机互相干扰的问题. 我利用GPIO中断,代替NSS引脚,使用过程如下 ...

  8. 关于STM32 SPI NSS的讨论

    源:关于STM32 SPI NSS的讨论 转载于:https://www.cnblogs.com/LittleTiger/p/8784643.html

  9. 一、关于STM32 SPI NSS的讨论

    关于STM32 SPI NSS问题的探讨. 对于STM32的SPI ,Reference Manual中是给出的schematic如下: 按照标准的SPI协议,当SPI被配置为主机模式后,通过SPI对 ...

最新文章

  1. NetBeans 时事通讯(刊号 # 117 - Sep 16, 2010)
  2. Elasticsearch-单机部署避坑指南
  3. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格
  4. boost::mpl模块实现unique相关的测试程序
  5. PATB1014福尔摩斯的约会
  6. 罗马数字转整数(C实现)
  7. 2021公益数字化研究报告
  8. Linux内核深入理解系统调用(2):vsyscall 和 vDSO 以及程序是如何运行的(execve)
  9. innodb下的mvcc_InnoDB的MVCC实现原理
  10. quartus调用74系列的芯片
  11. 将netcat-openbsd替换成为netcat-traditional
  12. MySQL 之 query cache
  13. spring中将静态代理修改为动态代理
  14. 国防科大 计算机原理考研试题,国防科技大学考研2003年计算机原理试题
  15. 大话设计模式之爱你一万年:第八章 结构型模式:外观(门面)模式:冬天有你不再寒冷:1.外观模式概念
  16. Linaro ABE(高级构建环境)构建GNU交叉工具链
  17. 风险投资的TS和DD
  18. sklearn 学习笔记 —— Nearest Neighbors
  19. 太棒了,Github 上面星标10K+ 的阿里巴巴社招面试感悟!(附海量面试复习资料)
  20. 【职场攻略】送礼给老板有讲究

热门文章

  1. 前端开发规范(二)——CSS 命名规范
  2. Whale帷幄 - 门面的力量丨提升进店客流
  3. 飞机大战(案例详解)
  4. 二见钟情之组合查询(vb.net版)
  5. 非常实用的cmd命令
  6. Tina_Linux_WiFi_RF测试_使用指南
  7. Android百度地图测距功能
  8. Android开发——集成友盟社会化分享遇到的坑(一)
  9. 齐岳:FITC/Rhodamine/Cy7荧光标记半乳糖Galactose/松醇D-Pinitol/甘露糖Mannos
  10. BadUSB+ProMicro+Arduino做一个插入U盘自动攻击