STM32F407 SPI配置和时序图讲解(二)

这篇具有很好参考价值的文章主要介绍了STM32F407 SPI配置和时序图讲解(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上节讲了SPI的基本配置,这节主要讲解如何看时序图,SPI数据到底是如何传输的。
SPI初始化后,就可以开始向对象发送数据了,但是要发送数据给W25Q128模块,需要按照它的时序图来发送(个人用的是W25Q128模块

W25Q128模块简介
W25Q128是一款常见的串行闪存存储器模块,属于Winbond Electronics生产的产品系列之一。以下是关于W25Q128模块的一些基本信息:
存储容量:W25Q128模块的存储容量为128Mb(兆比特)或16MB(兆字节)。它可以存储大量的数据,如代码、配置文件、图像、音频等。
SPI接口:W25Q128模块使用SPI(Serial Peripheral Interface)接口进行数据通信。SPI是一种常用的串行通信协议,可以实现高速的数据传输。
供电电压:W25Q128模块通常工作在3.3V的供电电压下,但也支持1.8V的供电电压。在使用时需要根据实际情况选择适当的供电电压。
特性:W25Q128模块具有快速的读写速度和低功耗特性。它支持多种读写模式,包括普通读写、高速读写、扇区擦除、块擦除等。

什么是时序图
时序图(Timing diagram)是一种用于描述系统内部或组件之间时序关系的图形表示方法。它展示了信号、事件或数据在时间轴上的传输和交互情况,帮助我们理解系统各个组件之间的时序行为。
时序图通常由水平的时间轴垂直的信号线组成。时间轴表示时间的流逝,从左到右逐渐增加。信号线代表电平、状态或数据的变化。通过在时间轴上绘制信号线的高低变化、起始时间和持续时间等信息,时序图能够清晰地展示不同组件之间的交互和同步。
时序图可以用于多种场景,如硬件电路设计软件系统调试通信协议分析等。它有助于可视化和验证系统的时序约束、响应时间、并发操作、数据流动和交互行为,帮助开发人员了解系统执行的顺序以及事件之间的依赖关系

上述只是简单介绍一下这个模块和时序图,下面开始正题!
每一款模块都会给你原理图和数据手册以及时序图

以下是W25Q128获取厂商ID的时序图

spi时钟配置,stm32,microsoft,嵌入式硬件
这是两段时序图,因为一张图放不下,截取两部分,可以仔细观察一下看不看得懂,下面是拼接解析之后的时序图
spi时钟配置,stm32,microsoft,嵌入式硬件
第一步:先看是谁的时序图,这是W25Q128的时序图,W25Q128相对于stm32芯片来说是从机,所以最左边四个引脚要搞清楚是什么,再stm32芯片中如何配置
第二步:再看数据如何传输的(高位先出还是地位先出)这对下面编程来说很重要,对于这幅时序图来说是高位先出(MSB)(看图可以找到MSB,左上)
第三步:看第一段,各个引脚的开始状态是什么,高电平还是低电平
第四步:看第二段,片选引脚拉低,开始工作,时钟线开始变化
第五步:看第三段,主机(stm32)开始发送指令(每个指令都不相同),这里可以看到查询厂商ID指令为:0x09(小图也标注了它的二进制),这就是数据的传输过程。
注释:为何看出来是主机发送,因为数据变化的MOSI(主输出从输入)这一根数据线,而MISO这跟数据线没有变化,只是起始电平,目前不管它
第六步:看第四段,主机发送一个24位地址值,每个指令的地址值不一样,具体看时序图
第七步:看第五段,主机随便发送数据(随便发不用管是什么,因为从机不会处理这些数据)发这些数据就是为了保持同步(SPI为高速串行全双工同步通信),我们发送这些数据的同时,从机就会给我们反发(因为现在MISO这跟数据线开始变化了)厂商号和设备号
第八步:看第六段,片选引脚拉高,回到空闲状态通信结束

现在看懂了,来看看代码如何编写

//SPI发送/接收1字节数据函数(自己对SPI接收和发送库函数做的简单封装)
uint8_t Spi_Send_And_Recv_Byte_Data(uint8_t byte)
{
	//判断SR寄存器(状态寄存器)1---->发送缓冲区为空(具体查看寄存器手册)
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
	
	//通过spi发送数据
	SPI_I2S_SendData(SPI1,byte);	//STM32F4系列 SPI标准发送库函数
	
	//再次判断SR寄存器
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
	
	//返回spi接收值
	return SPI_I2S_ReceiveData(SPI1);	//STM32F4系列 SPI的标准接收库函数
	
}


//读取厂商ID和设备ID
void Read_W25Q128_ID(uint8_t *M_ID,uint8_t *D_ID)
{
	//cs引脚拉低开始通信
	GPIO_PIN_NSS(0);	//自己定义的片选宏(不会宏定义的私发我,我亲自教,我不相信学到SPI还有人不会C语言宏定义)
	
	//发送获取ID号指令
	Spi_Send_And_Recv_Byte_Data(0x90);	//读取设备号ID指令(0x90)
	
	//发送24位地址(因为SPI发送函数只能发一个字节,所以分三次发送)
	//记住这个是高位先出,所以要先发高位,这些细节我在上面时序图解析全部提出来了,注意看!
	uint32_t Address = 0x000000;//要发送的地址值
	Spi_Send_And_Recv_Byte_Data((uint8_t)Address>>16);	//发送高八位
	Spi_Send_And_Recv_Byte_Data((uint8_t)Address>>8);	//发送中间八位
	Spi_Send_And_Recv_Byte_Data((uint8_t)Address);		//发送低八位
	
	//接收设备号(发一些无用数据是为了保持通信同步)
	*M_ID = Spi_Send_And_Recv_Byte_Data(0xFF);//这里就是发送一些无用数据,从机给我们反发ID号
	*D_ID = Spi_Send_And_Recv_Byte_Data(0xFF);//这里就是发送一些无用数据,从机给我们反发ID号
	
	//cs拉高电平,结束通信
	GPIO_PIN_NSS(1);
}

上面所有的细节和需要主义的地方我都标注清楚了
是不是很简单,只要看得懂原理图,写代码就是严格按照步骤来写就好

下面再来几张时序图,这次只有简单的解析,看得懂的可以看看每张时序图的代码步骤,看不懂的小伙伴可以继续看看上面的获取厂商ID的具体解析

解除写保护时序图
spi时钟配置,stm32,microsoft,嵌入式硬件
代码如下:

/*开启/关闭写使能(我把解除写保护和添加写保护封装在一起了,
虽然上面只有一张时序图,但是大家应该也能猜出添加写保护是什么样的)*/
void Spi_Write_Cmd(FunctionalState NewState)
{
	//cs拉低,通信开始
	GPIO_PIN_NSS(0);
	
	//判断开始写使能还是关闭
	  assert_param(IS_FUNCTIONAL_STATE(NewState));
	  if (NewState != DISABLE)
	  {
		  //发送 使能写权限 指令
		  Spi_Send_And_Recv_Byte_Data(0x06);
	  }
	  else
	  {
		  //发送 不使能写权限 指令 
		  Spi_Send_And_Recv_Byte_Data(0x04);
	  }
	
	//cs拉高,通信结束
	GPIO_PIN_NSS(1);
}

很简单,下面看看发送数据的时序图(看不清的可以点开放大看,支持下载)
spi时钟配置,stm32,microsoft,嵌入式硬件
看看代码:

//写入数据函数(页编程)
void Page_Program(uint32_t Addr,uint8_t *data,uint8_t size)
{
	//cs拉低,通信开始
	GPIO_PIN_NSS(0);
	
	//发送写指令
	Spi_Send_And_Recv_Byte_Data(0x02);
	
	//发送24位地址
	Spi_Send_And_Recv_Byte_Data((uint8_t)(Addr>>16));
	Spi_Send_And_Recv_Byte_Data((uint8_t)(Addr>>8));
	Spi_Send_And_Recv_Byte_Data((uint8_t)Addr);
	
	//发送要写入的数据
	for(int i=0; i<size; i++)
		Spi_Send_And_Recv_Byte_Data(data[i]);

	//查看状态寄存器是否BUSY位(这个就是看具体的寄存器,这里想教会大家的是如何看懂时序图)
	//BUSY位在最低位,与上0x01则,如果是0则写入完成,退出循环
	while(Read_Status_Register1() & 0x01);	

	printf("Write data finsh\n");
	
	//cs拉高,通信结束
	GPIO_PIN_NSS(1);
}

最后留一张接收数据的时序图,个人解析过,大家也可以看看,这次没有代码,大家可以看看按照逻辑会不会自己写出步骤,代码就是调用函数罢了
spi时钟配置,stm32,microsoft,嵌入式硬件
代码就没必要看了,会步骤就好了,能自己看懂就可以了!
只要认真看了本章内容,就算是一个新手也能看得懂时序图,如果对您有什么帮助,请留下免费的赞,谢谢!!!
这几天会继续更新其他类型的时序图如何查看!!!文章来源地址https://www.toymoban.com/news/detail-736856.html

到了这里,关于STM32F407 SPI配置和时序图讲解(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F407的时钟

    时钟源用来为环形脉冲发生器提供频率稳定且电平匹配的方波时钟脉冲信号。它通常由石英 晶体振荡器和与非门组成的正反馈振荡电路组成,其输出送至环形脉冲发生器。 F4开发指南P107 F4开发指南P108 HSI高速内部时钟源 High Speed Internal。RC 振荡器,频率为 16MHz。可以直接作为

    2024年02月10日
    浏览(55)
  • STM32F407VET6使用SPI访问Flash数据返回0xff(先写入数据,再读取数据,却返回0xff,但是通过debug却可以正常输出)

    STM32F407VET6使用SPI访问Flash数据返回0xff(先写入数据,再读取数据,却返回0xff,但是通过debug却可以正常输出) 看了野火的STM32F103VET6板子的SPI操作Flash的视频,用了自己的STM32F407VET6板子试了一下,出现了点问题,在网上看了很久也没有找出原因,现在问题解决了,就写一篇,

    2024年02月15日
    浏览(45)
  • 洋桃电子STM32F407单片机入门教程笔记一:RCC时钟设置

    此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:2023更新 STM32入门F4= STM32F407单片机入门教程=WIFI连接阿里云物联网+CubeMX+HAL库+TFT彩屏+杜洋主讲_哔哩哔哩_bilibili 由于单片机内部的时钟结构都是相互关联的,一个时钟源出发可以供给多个功能,类似于树根、树杆、树

    2024年02月04日
    浏览(49)
  • STM32F407 GPIO口输出配置配置步骤

    STM32F407ZGT6 是意法半导体(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一员,具备强大的处理能力和丰富的外设功能,适用于各种应用领域。 说明:STM32F4 的主频最高是 168Mhz,所以我们一般设置 PLLCLK 为 168Mhz(M=8,N=336,P=2),通

    2024年02月12日
    浏览(53)
  • stm32f407探索者开发板(二十二)——通用定时器基本原理讲解

    STM32F40x系列总共最多有14个定时器 三种(4)STM32定时器区别 STM3 F4 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 16 /32 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系

    2024年02月12日
    浏览(43)
  • stm32f407VET6 系统学习 day01 GPIO 配置

    GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口  通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中

    2023年04月09日
    浏览(53)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(61)
  • STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI

    SPI基本概念请自行百度,参考:百度百科SPI简介.我们讲重点和要注意的地方。 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连,不交叉,不交叉,不交叉…(重要的事情说三遍)。 这是无线模块CC2500的SPI接口时序,这里可以看到,从

    2024年02月06日
    浏览(42)
  • [STM32] - STM32F407VET6使用STM32CubeMX配置FatFs,以及挂载时返回03错误码问题的解决

    为测试新买的开发板TF卡读写是否正常,使用STM32CubeMX(后简称CubeMX)进行代码构建。生成代码后烧录测试,发现在挂载TF卡时无法成功,返回值为错误3( FR_NOT_READY )。经排查后问题已解决,遂记录配置过程供大家参考,并讲解挂载时返回错误3的解决方式。 ①为了输出TF卡(

    2024年02月22日
    浏览(71)
  • STM32F407——串口通信

    本文将对串口通信的分类和基于 stm32 的串口配置进行介绍,以及如何使用串口调试助手进行串口收发功能的调试,旨在帮助还不会使用 stm32 单片机串口资源进行通信的家人们快速学会如何使用串口来进行通信。 (纯干货、快速上手、零基础也能会!!!) (1)串口,即串

    2023年04月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包