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

发布者:变形金刚最新更新时间:2018-12-12 来源: eefocus关键字:STM32  SPI  NSS  拉高问题 手机看文章 扫描二维码
随时随地手机看文章

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


最近想用 SPI 直接 DMA 对一传感器进行数据通信,想直接用SPI的硬件NSS控制模式来操作SPI(之前一直是软件模式,这次对 CPU时间比要求较高,不想再用软件去切换引脚 ):


引脚配置 及 SPI DMA 配置如下:


/* 引脚配置 */

  GPIO_InitStructure.GPIO_Pin =  SPI_MASTER_PIN_NSS | SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI | SPI_MASTER_PIN_MISO; // 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


  GPIO_Init(SPI_MASTER_GPIO, &GPIO_InitStructure);




/* SPI_配置 ----*/

  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_High;

  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

  SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  // 36M/4 = 9M

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

  SPI_InitStructure.SPI_CRCPolynomial = 7;

  SPI_Init(SPI_MASTER, &SPI_InitStructure);


SPI_SSOutputCmd(SPI_MASTER, ENABLE);

SPI_I2S_DMACmd(SPI_MASTER, SPI_I2S_DMAReq_Tx, ENABLE);

SPI_Cmd(SPI_MASTER, ENABLE);


SPI_Cmd(SPI_MASTER, ENABLE);


DMA_DeInit(SPI_MASTER_Tx_DMA_Channel);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI_MASTER_DR_Base;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI_MASTER_Buffer_Tx;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = BufferSize;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


  DMA_Init(SPI_MASTER_Tx_DMA_Channel, &DMA_InitStructure);


DMA_Cmd(SPI_MASTER_Tx_DMA_Channel, ENABLE);

while( DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET );


采用以上的配置发现,使能DMA 后,SPI有时钟和数据输出,说明SPI可以成功发送数据,但是问题的全程NSS引脚一直拉低( 按常理应该是SPI在发送数据时,NSS拉低,数据发送完成后NSS自动拉高才对),检查电路连接没有问题后再回去看ST官方手册发现其NSS的高低电平定义如下:



意思是说 SPI主模式下,启用石硬件NSS控制模式,并且NSS输出使能后,只要SPI模块打开,其NSS引脚就输出低电平,而且低电平将持续到SPI模块关闭(注意这里并不是发送数据完成,这就尴尬了,还用要手动去开关SPI模块),到这里是乎找到些线索,那就手动去关闭SPI和使能模块吧,将会用来下面的两个接口函数(也可以直接操作寄存器):


SPI_Cmd(SPI_MASTER, DISABLE);


SPI_Cmd(SPI_MASTER, ENABLE);


可以当我手动关闭SPI后,再去看NSS引脚电平时,发现其还是处于拉低状态(好坑呀,怎么还是低),不过这次的低电平好像还不如开启时低的那么稳定(用示波器看),怀疑此时NSS引脚处释放状态(内部并没有控制输出),给它外部上拉一个10K到3.3V的上拉电阻后,发现NSS引脚被成功拉高,进一步证实了前面的怀疑。这时后发现ST文档也好鸡贼,它并没有说明SPI模块关闭后NSS引脚会被拉高,只是说了在模块并闭前 NSS引脚都是低电平。这样一来发现又回到了解放前,感觉还是不能直接用硬件NSS模式。


如果非要用NSS硬件模式,电路设计时最好给NSS引脚接外部上拉电阻到高电平,不然就只好用NSS软件管理模式,用软件用切换NSS引脚电平。


真心感觉STM32 的SPI 硬件NSS功能太鸡肋,绝大多数场景都不适用。

关键字:STM32  SPI  NSS  拉高问题 引用地址:STM32 SPI NSS 引脚为不能拉高问题

上一篇:在ARM Linux下使用GPIO模拟SPI时序详解
下一篇:keil MDK启动文件分析---基于LPC2100系列

推荐阅读最新更新时间:2024-03-16 16:19

STM32的MDK工具使用技巧
RVMDK使用技巧 Version:uVision V4.70.0.0 修改颜色/字体 点击“工具”按钮,打开如下界面,然后点击各个元素修改为你喜欢的颜色,也可以修在Font栏修改字体大小等。 添加自定义关键字 点击“工具”按钮,打开如下界面,点击“User Keyword”后的“小方框”按钮添加自定义的关键字,添加完成后该关键字即与系统关键字一样颜色。 巧用TAB 点击“工具”按钮,打开如下界面,修改Tab Size,建议4。 MDK的Tab支持块操作,块选代码后,按Tab代码后移,按Tab+Shift前移 快速定位 点击“魔术棒”按钮,勾选“Browse Information”即可使用快速定
[单片机]
mbedtls | 09 - 数字签名算法的配置与使用
一、数字签名算法 1. 什么是数字签名 数字签名类似于盖章和签字,数字签名可以检查消息是否被篡改、并验证消息的可靠性,因为私钥只有签名者持有,所以还可以防止否认。 2. 数字签名算法 ① RSA数字签名 RSA数字签名算法基于RSA非对称加密算法,在用于数字签名时公钥和私钥的用法刚好相反: 发送方使用私钥对消息执行加密操作 = 对消息进行签名; 接收方使用公钥对签名进行解密 = 对签名进行认证; RSA签名算法还需要包括填充方法,有两种:PKCS1-V1.5和PSS(使用随机数填充,推荐使用)。 ② DSA算法 ③ ECDSA算法 在相同的安全等级下,ECDSA算法具有秘钥短、执行效率高的特点,更适合物联网应用。 二、R
[单片机]
mbedtls | 09 - 数字签名算法的配置与使用
STM32 GPIO工作原理详解
1.STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以STM32F103ZET6芯片为例子,该芯片共有144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在STM32端口复用和重映射(AFIO辅
[单片机]
STM32学习——中断方式下的发送数据
利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定。。。 注:在设置USART的控制寄存器的TE位时,会发送一个空闲帧,于是便会进入中断。 错误的做法 本来的思路是中断里的代码尽可能地少,发送字符放在主函数中,类似这样 while(1) { USART_SendData(DEBUG_USARTx,Buf ); //Delay(0xfffff); if(j =5) break; } 然而。。。要是不加Delay延时j就无法在中断服务函数中自加,通过调试,发现调用USART_SendData(),发送完成标志位TC并不是马上置位,该函数只是将数据送入数据寄存器DR,并不代表发送完毕,所以
[单片机]
一阶互补滤波应用到stm32 ADC采集上
大家都知道,adc采集,不管分辨率高低,特别是采集电压电流的值都是有一定漂移的,比如漂移个100mv左右是很正常的现象。 很多人都是用平均滤波法,这里我想说的是其实没有用,我之前就一直用的这个,真心效果很差。 其实这个问题可以用 平均滤波 加 一阶互补滤波 比较完美的滤除波动。 我这边只用平均滤波漂移在100mv,加上互补滤波后漂移基本只有10mv。已经算是相当完美了。 放小10倍的话,你的ad值基本都完全恒定了。 下面是代码,一阶互补滤波思想我就不介绍了,其实就是一个权重的问题,你更相信哪一时刻的值?不懂的自行百度。 void DEVICE_INFO::TX_updata() { //使用一阶
[单片机]
用ST72141实现无刷直流电机的控制
引 言 1 概 述   ST72141是ST公司专门用于同步电机控制的一款单片机,特别适合3相无刷直流电机的控制。无刷直流电机可用于工业控制、汽车电子产品、电冰箱、空调、压缩机和风扇等产品。无刷直流电机的优点是效率高、工作噪声低、体积小、可靠性好和寿命长。   ST72141是ST7微控制器家族产品中的一员。它包括A/D转换和SPI接口,有专门用于无刷直流电机控制的片内外设,可选择带传感器模式和不带传感器模式。   ST7片内的电机控制电路可看成是一个脉宽调制多路复用器。它有6路输出和1个用在无刷直流电机不带传感器控制时的反电动势零点检测电路。 ST72141的电机控制外设有4个主要的部分: ◇ 去磁结束和反电动势零
[工业控制]
STM32的基本系统介绍
STM32的基本系统主要涉及下面几个部分:    一、电源 1)、无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空;    2)、对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU; 3)、用万用表测试供电电压是否正确。调试时最好用数字电源供电,以便过压或过流烧坏板子。电压最好一步一步从进线端测试到芯片供电端。    二、复位、启动选择 1)、Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址; 2)、在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,
[单片机]
<font color='red'>STM32</font>的基本系统介绍
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]
Event Recoder调试组件在<font color='red'>stm32</font>上的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved