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

发布者:technology1最新更新时间:2019-07-01 来源: eefocus关键字:STM32  SPI  NSS  无法拉高 手机看文章 扫描二维码
随时随地手机看文章

众所周知,STM32  SPI是个半残废,NSS无法自动拉高,所以使用SPI 从机会一直使能,当主机是一对多的时候,就会出现SPI从机互相干扰的问题。

我利用GPIO中断,代替NSS引脚,使用过程如下代码所示

1.初始化SPI  的IO口,其中NSS引脚先不管。

 

  1. void GPIO_SPI12_Config(void)

  2. {

  3. GPIO_InitTypeDef GPIO_InitStructure;

  4. //----- 第1步:打开SPI部件的时钟 --------------------------------------------------------------------------------------------

  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

  6. //----- 第2步:打开SPI相关的引脚为复用推挽输出 -----------------------------------------------------------------------------

  7.  

  8.  

  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  10. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  11. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;

  13.  

  14. /* SPI SCK pin configuration */

  15. GPIO_InitStructure.GPIO_Pin = SPI12_SCK_PIN;

  16. GPIO_Init(SPI12_SCK_GPIO_PORT, &GPIO_InitStructure);

  17.  

  18. /* SPI MOSI pin configuration */

  19. GPIO_InitStructure.GPIO_Pin = SPI12_MOSI_PIN;

  20. GPIO_Init(SPI12_MOSI_GPIO_PORT, &GPIO_InitStructure);

  21.  

  22. /* SPI MISO pin configuration */

  23. GPIO_InitStructure.GPIO_Pin = SPI12_MISO_PIN;

  24. GPIO_Init(SPI12_MISO_GPIO_PORT, &GPIO_InitStructure);

  25. // STM32 SPI 的CS引脚不会自动拉高,所以用GPIO中断代替

  26.  

  27. // GPIO_InitStructure.GPIO_Pin = SPI12_CS_PIN;

  28. // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  29. // GPIO_Init(SPI12_CS_GPIO_PORT, &GPIO_InitStructure);

  30.  

  31. GPIO_PinAFConfig(SPI12_SCK_GPIO_PORT, SPI12_SCK_SOURCE, SPI12_SCK_AF);

  32. GPIO_PinAFConfig(SPI12_MOSI_GPIO_PORT, SPI12_MOSI_SOURCE, SPI12_MOSI_AF);

  33. GPIO_PinAFConfig(SPI12_MISO_GPIO_PORT, SPI12_MISO_SOURCE, SPI12_MISO_AF);

  34. // GPIO_PinAFConfig(SPI12_CS_GPIO_PORT, SPI12_CS_SOURCE, SPI12_CS_AF);

  35.  

  36. }

 

 

2.再初始化SPI,初始化方式是从机子模式,这时候先不要使能SPI。

 
  1. void SPI12_Config(void)

  2. {

  3. SPI_InitTypeDef SPI_InitStructure;

  4. SPI_RxFIFOThresholdConfig(SPI1,SPI_RxFIFOThreshold_QF);

  5. //----- 第3步:配置SPI的参数设定 --------------------------------------------------------------------------------------------

  6. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工

  7. SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //设置为主模式SPI

  8. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //发送接收8 位数据

  9. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空为低

  10. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第二个时钟沿

  11. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件管理

  12. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //设置波特率为去64 分频

  13. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB 位开始

  14. SPI_InitStructure.SPI_CRCPolynomial = 7; //校验

  15. SPI_Init(SPI1, &SPI_InitStructure);

  16. SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,DISABLE);

  17. SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Rx,DISABLE);

  18. SPI_ITConfig(SPI1, SPI_IT_RXNE,DISABLE); //接收中断失能

  19. SPI_ITConfig(SPI1, SPI_IT_TXE, DISABLE); //发送中断失能

  20. //----- 第4步:使能SPI1, 配置完毕 ------------------------------------------------------------------------------------------

  21. SPI_Cmd(SPI1, DISABLE);

  22. }


 

 

 3. 将NSS引脚配置成GPIO中断,这里NSS 引脚为PA15,配置过程如下代码

 
  1. void Exti_15_Init(void)

  2. {

  3. NVIC_InitTypeDef NVIC_InitStructure;

  4. GPIO_InitTypeDef GPIO_InitStructure;

  5. EXTI_InitTypeDef EXTI_InitStructure;

  6.  

  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 配置中断时钟

  8. //----- 设置外部中断引脚,用户根据实际情况自行修改 ------------------------------------------------------------------------------

  9.  

  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入

  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; // 快速

  13. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉

  14.  

  15. GPIO_Init(GPIOA, &GPIO_InitStructure);

  16.  

  17. //----- 设置NVIC初始化 ------------------------------------------------------------------------------

  18.  

  19. NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn; // 中断通道

  20. NVIC_InitStructure.NVIC_IRQChannelPriority = 0; // 中断优先级(0-3)

  21. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能

  22.  

  23. NVIC_Init(&NVIC_InitStructure);

  24.  

  25. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource15); //连接中断线路

  26. EXTI_InitStructure.EXTI_Line = EXTI_Line15; //设置中断线路

  27. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  28. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //双沿触发

  29. EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能

  30. EXTI_Init(&EXTI_InitStructure); //初始化中断

  31. }


 

 

4. 写GPIO中断服务函数,该函数的主要工作判断NSS引脚的电平,若NSS为低电平则使能SPI,否则失能SPI。

 
  1. void SPI1_NSS_Handler(void)

  2. {

  3. if(GPIO_ReadInputDataBit(SPI12_CS_GPIO_PORT,SPI12_CS_PIN)!=RESET)

  4. {

  5. SPI_Cmd(SPI1,DISABLE);

  6. }

  7. else

  8. {

  9. SPI_Cmd(SPI1,ENABLE);

  10. }

  11. }

  12.  

  13. void EXTI4_15_IRQHandler(void)

  14. {

  15. if(EXTI_GetITStatus(EXTI_Line15) != RESET)

  16. {

  17. EXTI_ClearITPendingBit(EXTI_Line15);

  18. SPI1_NSS_Handler();

  19. }

  20. }


关键字:STM32  SPI  NSS  无法拉高 引用地址:解决STM32 SPI 半残废 NSS无法拉高

上一篇:STM32F103CB 芯片FLASH DOWNLOAD编程地址范围设置相关问题记录
下一篇:STM32学习笔记(三) STM32的GPIO的深入学习

推荐阅读最新更新时间:2024-11-10 09:55

玩转stm32 usart 串口功能 库函数 详解和DMA 串口高级运用
数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232和485电平的区别硬件外围芯片,波特率(反映传一位的时间),起始位和停止位,数据宽度,校验,硬件流控制,相应连接电脑时的接口怎么样的。配置,使用函数,中断,查询并结合通信协议才算了解了串口使用。 以上是基础,当然stm很多相关复用功能,支持同步单向通信和半双工单线通信,支持局部互联网、智能卡协议和红外数据组织相关规范,以及调制解调器操作,运行多处理器通信。同时可以使用DMA方式进行高速数据通信。注意Print函数时间问题,尝试通过
[单片机]
STM32-SPI
1 SPI概述 SPI是高速全双工同步串行通信接口,主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。 在用一般的SPI接口的IC的时候,由于数据量小,速度要求不是特别高,且数据量不一定是整字节(比如12位的AD转换器),一般可以使用模拟SPI,方便快捷。这里有一个通过软件模拟SPI操作片外AD转换器MCP3208的例子。 而对于一些存储器件,使用SPI则比较有优势,硬件SPI稳定性好,速度快,适合读写大量数据。本文记的就是STM32的SPI硬件模块。 1.1 接口 SPI主要有四根线 MOSI、MISO、SCK、CS。 MISO:主设备输入/从设备输出引脚。
[单片机]
STM32-<font color='red'>SPI</font>
STM32、GD32、ESP32的区别
01 前言 STM32:意法半导体在 2007 年 6 月 11 日发布的产品,32位单片机。 GD32:兆易创新 2013 年发布的产品,在芯片开发、配置、命名上基本模仿 STM32,甚至 GPIO 和 STM32 都是 pin to pin 的,封装不改焊上去直接用。有时候 STM32 的源码不修改,重新编译烧写到 GD32 上就可以跑。当然也有很多不同,比如串口驱动、USB 、库文件等。 ESP32:乐鑫公司 2017 年开发的产品,和 STM32、GD32 不同,ESP32 主要面向物联网领域,支持功能很多,但引出 GPIO pin 脚很少,因此大多数 GPIO 都有很多复用功能。出厂就集成蓝牙、WiFi 等物联网
[单片机]
<font color='red'>STM32</font>、GD32、ESP32的区别
基于STM32的TCP/IP协议栈代码之UDP分析
1. UDP介绍 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。 UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。 RFC 768 是UDP的正式规范。 UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。 2. UDP首部 UDP首部的各字段如图11 -
[单片机]
基于<font color='red'>STM32</font>的TCP/IP协议栈代码之UDP分析
STM32时钟系统介绍与总结
时钟树: 1. HSI振荡器时钟 The HSI clock signal is generated from an internal 8 MHz RC Oscillator and can be used directly as a system clock or divided by 2 to be used as PLL input. The HSI RC oscillator has the advantage of providing a clock source at low cost (no external components). It also has a faster startup time than
[单片机]
STM32红外发射的实现
一、环境: 公司所采用的是STM32F103RBT6芯片,本人开发是基于官方提供的V3.5.0的函数库。 二、所要实现的功能是: 1. 开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。 2. 上位机通过串口程序,发送学习来的码,可控制红外设备。 3. 发送时共有四路,上位机发送码子时,可选择通道。 三、实现: 0. 在写功能之前先要对我们所用的模块和时钟进行初始化。 (此部分 自己看手册) 1. 开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。 红外的学习功能我是利用中断+定时,来记录红外码高低电平的时间长度,程序如下:
[单片机]
关于STM32外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
利用ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 函数判断具体的中断源 再进一步处理 注意:因为调用了 delay_ms() 函数 因此主函数的开头 必须初始化 延时函数 delay_init() ps 因为这个原因调了一天了 多么痛的领悟!! 具体如下:
[单片机]
关于<font color='red'>STM32</font>外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
STM32上移植FreeRTOS
首先在网上看到大部分移植FreeRTOS 都是选择修改他的启动文件,我个人感觉这样不是很好,毕竟是汇编,当你采用不同的芯片型号时,又要修改不同的xx.S文件,所以我选择修改FreeRTOSconfig.h文件。 1. 下载STM32官方源码:我的是基于V3.5的官方库(有工程模板的可以不用)。 下载FreeRTOS的源码 http://download.csdn.net/detail/jb8154989/6033207 2. 搭建好一个MDK的工程,我这里采用的是野火的工 程, http://download.csdn.net/my/uploads 3. 在工程模板目录下新建一个FreeRTOS文件夹,在FreeRTOS文件夹
[单片机]
<font color='red'>STM32</font>上移植FreeRTOS
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved