STM32F407之SPI(软件)

news2024/10/7 18:30:19
基础知识:

SPI是一种高速的,全双工同步的通信总线。使用3 条总线及n个片选线(n取决于从机数量)SPI可以一个主机连接单个或多个从机,每个从机都有唯一片选线。

  • MOSI(主机输出/从机输入)——主机向从机发送数据的线
  • MISO(主机输入/从机输出)——从机向主机发送数据的线
  • SCLK(时钟)——时钟信号线
  • SS/CS/NSS(片选线——用于主机选择与哪个从机数据交互的线

 协议原理

 理解两部分

第一部分(信号的开始与结束)
某从机NSS信号线 由高变低 (被选中),是SPI 通讯的起始信号。开始准备与主机通讯。
此从机NSS 信号 由低变高( 取消选中 ,是 SPI 通讯的停止信号,表示本次通讯结束。
第二部分(时钟线的极性与相位)
SPI一共有四种通讯模式,是由SCK空闲时的两种状态和数据的两种采样方式产生的。在此引入“ 时钟极性CPOL 时钟相位CPHA 的概念。

时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时, SCK 信号线的电平信号 ( SPI 通讯开始前、 NSS 线为高电平时SCK 的状态 )
CPOL=0 时,SCK 在空闲状态时为低电平,CPOL=1 时,SCK 在空闲状态时为高电平。
时钟相位CPHA 是指数据的采样的时刻,即MOSI 或MISO 数据线上的信号将会在
当CPHA=0 时,数据线在SCK 的“奇数边沿”采样。
当CPHA=1 时,数据线在SCK 的“偶数边沿”采样。
例:(奇数1、3、5、7、9......)

补充
MOSI MISO 数据线在SCK 的每个时钟 周期 传输 一位 数据,且数据输入输出是 同步 的。
若只进行发送操作,主机需忽略接收到的字节;若主机要读取从机的一个字节,就必须发送一个字节(一般0XFF)来引发从机的传输。 你发一个数据必然会收到一个数据;你要收一个数据必须也要 发一个数据(主机产生时钟信号)。

应用(片上外设FLASH)

因为是片上外设,所有根据STM32F407的原理图,查找对应引脚,直接引脚复用即可,(别的开发板或外设,需简单配置引脚)

FLASH 芯片中还有 WP# HOLD 引脚。
  • WP 引脚可控制写保护功能,当该引脚为低电平时,禁止写入数据。我们直接接电源,不使用写保护功能。
  • HOLD 引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,数据输出引脚输出高阻抗状态,时钟和数据输入引脚无效。我们直接接电源,不使用通讯暂停功能。

思路:

  1. 初始化通讯使用的目标引脚及端口时钟;
  2. 使能SPI 外设的时钟;
  3. 配置SPI 外设的模式、地址、速率等参数并使能SPI 外设;
  4. 编写基本SPI 按字节收发的函数;
  5. 编写对FLASH 擦除及读写操作的的函数;
  6. 编写测试程序,对读写数据进行校验。
    SPI_InitTypeDef	  SPI_InitStructure;
    /*spi 时钟使能*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
    /* FLASH_SPI 模式配置 */
	SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//通讯方向双线全双工
	SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//主机模式
	SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//数据帧大小是8位
	/* FLASH芯片支持SPI模式0及模式3 可设置CPOL=1 CPHA=1 */
	SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
	SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
	SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//片选信号由软件触发,我们可自行编程
	SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;//时钟分频,84Mhz/2=42Mhz
	SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//高位先行
	SPI_Init(SPI1,&SPI_InitStructure);
	
	/*使能FLASH_SPI*/
	SPI_Cmd(SPI1,ENABLE);
参数介绍 
  • SPI_Direction
设置 SPI 的通讯方向,可设置为双线全双工 (SPI_Direction_2Lines_FullDuplex) ,双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收 (SPI_Direction_1Line_Rx) 、单线只发送模式(SPI_Direction_1Line_Tx)。
  • SPI_Mode
设置 SPI 工作在主机模式 (SPI_Mode_Master) 或从机模式 (SPI_Mode_Slave ) ,这两个模式的最大区别为SPI SCK 信号线的时序, SCK 的时序是由通讯中的主机产生的。若被配置为从机模式, STM32的SPI 外设将接受外来的 SCK 信号。
  • SPI_DataSize
选择 SPI 通讯的数据帧大小是为 8 (SPI_DataSize_8b) 还是 16 (SPI_DataSize_16b)
  • SPI_CPOL 和SPI_CPHA
配置 SPI 的时钟极性 CPOL 和时钟相位 CPHA ,这两个配置影响到 SPI 的通讯模式,时钟极性 CPOL 成员,可设置为高电平(SPI_CPOL_High) 或低电平 (SPI_CPOL_Low ) 。时钟相位 CPHA 则可以设置为SPI_CPHA_1Edge(在 SCK 的奇数边沿采集数据 ) SPI_CPHA_2Edge( SCK 的偶数边沿采集数据 )。
  • SPI_NSS
配置 NSS 引脚的使用模式, 可以选择为硬件模式 (SPI_NSS_Hard ) 与软件模式 (SPI_NSS_Soft ) ,在硬件模式中的SPI 片选信号由 SPI 硬件自动产生,而软件模式则需要我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。实际中软件模式应用比较多。
  • SPI_BaudRatePrescaler
设置波特率分频因子,分频后的时钟即为 SPI SCK 信号线的时钟频率。这个成员参数可设置为 fpclk的2 4 6 8 16 32 64 128 256 分频。
  • SPI_FirstBit
所有串行的通讯协议都会有 MSB 先行 ( 高位数据在前 ) 还是 LSB 先行 ( 低位数据在前 ) 的问题,而 STM32的SPI 模块可以通过这个结构体成员,对这个特性编程控制。
  • SPI_CRCPolynomial
SPI CRC 校验中的多项式,若我们使用 CRC 校验时,就使用这个成员的参数 ( 多项式 ) ,来计算 CRC的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1870714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05 Shell编程之免交互

1、Here Document免交互 1.1 Here Document概述 Here Document是一个特殊用途的代码块,它是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。 Here Documen…

链在一起怎么联机 链在一起远程同玩联机教程

steam中最近特别热门的多人跑酷冒险的游戏:《链在一起》,英文名称叫做Chained Together,在游戏中我们需要开始自己的旅程,在地狱的深处,与我们的同伴被链在一起。我们的任务是通过尽可能高的攀登逃离地狱。每一次跳跃都…

linux中awk,sed, grep使用(待补充)

《linux私房菜》这本书中将sed和awk一同归为行的修改这一点,虽然对,但不利于实际处理问题时的思考。因为这样的话,当我们实际处理问题时,遇到比如说统计文本打印内容时,我们选择sed还是awk进行处理呢? 也因…

2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题是由安全生产模拟考试一点通提供,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材,天津市安全员C证大纲整理…

联想至像M3070DNA打印机加粉及清零方法

基本参数: 产品类型:黑白激光多功能商用一体机(打印/复印/扫描) 网络功能:支持有线网络打印 最大处理幅面:A4 双面功能:自动 打印速度:30页/分钟(高速激光打印&…

安卓webview内h5页面调用录音设置

h5页面调用录音接口getUserMeia在webview中有可能不成功,进入错误回调,这个时候webview尽可能设置下面这些权限就会好。

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(1)

Hi~ (o^^o)♪, 各位深海王国的同志们,早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督将为大家带来全新系列——小学生都能玩的语音模块,帮你一周内快速学会语音模块的使用方式,打造一个可用于智能家居、物联网领域的语音…

Zabbix 监控系统部署

Zabbix 监控系统部署 Zabbix是一个企业级开源分布式监控解决方案,可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的运行状况和完整性。 Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报。这允许…

高频科技亮相SEMl-e2024第六届深圳国际半导体展,以超纯工艺推动行业发展

6月26-28日,SEMl-e2024第六届深圳国际半导体展在深圳国际会展中心(宝安新馆)隆重举办。本次展会以【“芯”中有“算”智享未来】为主题,汇聚800多家展商,集中展示了集成电路、电子元器件、第三代半导体及产业链材料和设备为一体的半导体产业链,搭建了供需精准对接、探索行业新发…

8大趋势,重塑金融服务行业

谈论“金融服务行业”就像谈论“亚洲大陆”。这是因为,通用行业概念但它掩盖了许多细分领域的细微差别和多样性,以及人们思考、工作和感受方式的巨大差异。 银行应用程序和一个量化交易公司都是金融服务公司,但它们的运营方式可能天壤之别。…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

Java web应用性能分析之【自定义prometheus监控指标】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

服务器出现意外情况。(Exception from HRESULT: 0x80010105(RPC E SERVERFAULT))

这种情况一般出现在excel2007版本,下载了什么阅读器之类的 2007改不了这个加载项,需要重装一个其他版本(2010版本可以) 然后如下操作修改为COM加载项

vue 组件下 img 标签动态传入不展示

效果 解决办法&#xff1a; require() <titleComponent:title"业务工作概览":src"require(/assets/imgs/evaluation/overviewStatistics.png)"></titleComponent> 效果&#xff1a;

CVPR 2024最佳论文分享:文本到图像生成的丰富人类反馈

CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;是计算机视觉领域最有影响力的会议之一&#xff0c;主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期&#xff0c;CVPR 2024公布了最佳论文。共有10篇论文获奖&#xff0c;其…

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件&#xff0c;主要通过钓鱼邮件打开突破口&#xff0c;收集各种信息再回传给攻击者。近期&#xff0c;研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件&#xff0c;最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

昨天在写《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候&#xff0c;正好遇到动态反射需要的类型擦除技术。所谓的类型擦除&#xff0c;就是在两个模块之间的接口层没有任何类型信息&#xff0c;实现两个模块之间安全的通信。可以理…

QT控制comboBox切换方法

目录 1. 效果2. 操作 1. 效果 如下图&#xff1a; 点击全切换雨天模式按钮 则 comboBox 文本显示为 “雨天模式”点击全切换正常模式按钮 则 comboBox 文本显示为 “雨天模式” 切换到 雨天模式 切换到 正常模式 2. 操作 使用 “setCurrentIndex” 方法&#xff0c;切换 combo…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述&#xff1a; 这个错误表明在 Bash 环境下&#xff0c;尝试执行 chkconfig 命令&#xff0c;但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具&#xff0c;通常…