在开始使用GD32F350G8的硬件SPI时对于NSS功能下的主从模式有点迷惑,
需求为主机模式下对从机发送数据,片选线低有效
手册上说If the application wants to use NSS line to control the SPI slave, NSS should be configured to hardware output mode (SWNSSEN=0, NSSDRV=1). NSS goes low after SPI is enabled.
这里的问题是在开启NSS硬件输出模式后,使能SPI,NSS引脚是一直低的状态,不能满足需求,但也说到可以选择通用IO来作为片选线:
The application may also use a general purpose IO as NSS pin to realize more flexible NSS.
疑惑点在于我的SPI控制线是采用对应硬件SPI的IO口,
后面发现可以不配置NSS片选线,直接控制NSS电平状态

void SPI1_PortInit(void)
{spi_parameter_struct spi_init_struct;rcu_periph_clock_enable(RCU_SPI0);rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB,GPIO_AF_0,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);                            //sck, MISO, MOSI                                                   gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_15);                      //nss                       gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);   //sck, MISO, MOSI                      gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_15);             //nss                   gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);       //sck, MISO, MOSIGPIO_BOP(GPIOA) = (uint32_t)GPIO_PIN_15;                           //set Highspi_i2s_deinit(SPI0);/* configure SPI0 parameter */spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;  //全双工                          spi_init_struct.device_mode          = SPI_MASTER;                  //主机模式                         spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;          //8bit                                 spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;                             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);spi_enable(SPI0);
}

最开始我是直接这样操作:

void SPI1_Hardw_SendData(uint8_t  Addr,uint8_t  Regdata,uint32_t TimeOut)
{GPIO_BC(GPIOA) = (uint32_t)GPIO_PIN_15;while( RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) ){if(TimeOut > 0) TimeOut--; else                 break;          }Addr = Addr | 0x80;                           //地址高位置1,表示写寄存器spi_i2s_data_transmit(SPI0,Addr);while( RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) ){if(TimeOut > 0) TimeOut--; else               break;          }spi_i2s_data_transmit(SPI0,Regdata);GPIO_BOP(GPIOA) = (uint32_t)GPIO_PIN_15;
}

出来的波形错误,片选线被提前拉高,个人见解是数据在放入SPI_DATA寄存器后,SPI硬件自行去执行发数与时钟跳变这一些动作,而在程序上,数据存入SPI_DATA寄存器,就去执行片选线拉高动作,导致时序不正确,当时忘了记录现象;增加延时改进后就ok了

void SPI1_Hardw_SendData(uint8_t  Addr,uint8_t  Regdata,uint32_t TimeOut)
{GPIO_BC(GPIOA) = (uint32_t)GPIO_PIN_15;while( RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) ){if(TimeOut > 0) TimeOut--; else                 break;          }Addr = Addr | 0x80;                           //地址高位置1,表示写寄存器spi_i2s_data_transmit(SPI0,Addr);while( RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) ){if(TimeOut > 0) TimeOut--; else               break;          }spi_i2s_data_transmit(SPI0,Regdata);delay_1us(2);                                  //延时等待SPI发送完成GPIO_BOP(GPIOA) = (uint32_t)GPIO_PIN_15;}

这里延时可以改进为判断SPI发送缓冲区空标志位(TBE)的状态来等待发送完成,发送缓冲区为空时, TBE置位。 通过写SPI_DATA寄存器将下一个待发送数据写入发送缓冲区来清除TBE置位。
当发送数据较多时,就可以引入SPI+DMA的方式来发送数据,为CPU减轻工作负担,去做其他事情。

GD32F350.SPI软件片选模式相关推荐

  1. esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)

    本文 ESP8266 和 ESP32 支持四种不同的 SPI flash 访问模式:DIO.DOUT.QIO 和 QOUT. 这些可以通过 esptool.py write_flash 的 --fla ...

  2. STM32 SPI 软件NSS和硬件NSS解读

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

  3. SPI软件模拟 NRF24L01

    模拟SPI NRF24L01模块的简单使用 软件模拟SPI (注:默认已经充分了解SPI通信协议) 软件模拟 软件模拟的好处: 灵活性好.(你想想,平时使用硬件SPI是不是拼死拼活的找那几个复用的引脚 ...

  4. STM32L475 硬件SPI+软件SPI驱动ST7789V2

    前言 最近购买了IoT Board 潘多拉开发板来研究,学习使用STM32CubeMX工具配置SPI,然后驱动了TFTLCD.潘多拉开发板的TFTLCD驱动IC是ST7789V2,结合原子哥的TFTL ...

  5. 软件作坊模式工件应用论

    软件作坊模式工件应用论 软件作坊模式是指一个小规模或零散的团队负责不同类别系统的开发.维护.测试等软件工作,强调的是单兵作战.个人全能型的模式.软件作坊模式下,单个程序员由于工作需要可能时而是需求调研 ...

  6. 《软件需求模式》阅读笔记01

    本学期我选择<软件需求模式>作为我的精读书目,以此来加强我对软件需求分析这门课的学习. 这本书的译者就在序中写到:"需求是平衡的艺术,既要对开发人员有指导意义,又要能帮助解决业务 ...

  7. 几种常见的软件授权模式

    最近公司在开发一套IM通讯软件,由于是基于网上的开源软件开发的,在商业化应用的时候担心遇到版权方面的问题,现在转载几种现今常见的软件授权模式. 什么是许可协议? 什么是许可,当你为你的产品签发许可,你 ...

  8. 【20220504】软件开发模式

    时间:2022年05月04日 作者:小蒋聊技术 邮箱:wei_wei10@163.com 大家好,欢迎来到小蒋聊技术.小蒋准备和大家一起聊聊技术的那些事. 现在是五一假期,因为最近疫情的原因大家也只能 ...

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

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

最新文章

  1. 自定义分页(模块化)
  2. 看来我的计时器的应用还要加强才行呀
  3. 大连大学计算机科学与技术考研真题,2016年大连大学计算机科学与技术数据库系统原理复试笔试最后押题五套卷...
  4. 计算机网络实验报告4icmp,实验04-ip、icmp协议分析
  5. 初识Docker-Docker架构
  6. (转)Windows 批处理实现 定时打开IE 延时一段时间后 关闭IE
  7. 【慢慢学Android】:11.对话框大全
  8. 用VC实现GIS系统基本功能
  9. python是什么软件-零基础入门Python怎么学习?老男孩python用什么软件
  10. android MySQL servlet_使用MySQL和Servlet编写Android接口样例
  11. python架构师书籍_阿里巴巴高级架构师:学好python这本书必看,堪称python入门宝典...
  12. 第一届前端早早聊笔记--wsdchong
  13. 大型网站技术架构-第4篇 架构师
  14. 关于如果提高外文IT书籍的特别是英文书籍的阅读速度的一种实现方法
  15. java猜数字1到100_Java实现简单猜数字小游戏
  16. python——个税计算器
  17. opencv学习笔记9:根据图片颜色分割图像
  18. 【实用工具】Gephi下载与安装
  19. 正则匹配字符串最后一个逗号,不是逗号不匹配
  20. 基于启发式算法与单目优化和马尔科夫模型的进出口公司的货物装运策略——整数线性规划 随机模拟

热门文章

  1. 跟着游客闯世界,微信“出海”势不可挡!
  2. oracle的字符集(NLS_LANGUAGE)
  3. J2EE文件的下载DownLoad
  4. git bash here将本地代码更新到远程仓库
  5. 期末大作业纯前端技术实现个人简历模板
  6. python实现角谷定理
  7. 基于jsp+servlet的房屋出租系统
  8. 《机器学习实战》-04 朴素贝叶斯
  9. 微信群流量池构建出不为人知的“商业帝国”
  10. Final Cut Pro 在视频的多个地方同时打马赛克