SPI FLASH(W25Q128BV) 包含SPI工作原理

这篇具有很好参考价值的文章主要介绍了SPI FLASH(W25Q128BV) 包含SPI工作原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 

一、SPI简介

        1、全双工与半双工

         2、同步与异步

        3、SPI通信方式

二、SPI工作模式

三、W25Q128BV

        1、读ID Read Manufacturer/Device ID(90h)         

         2、读ID代码实现(硬件SPI)

         3、IO口模拟SPI时序图实现 (软件SPI)  模式3


一、SPI简介

        SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI是一种高速的(10Mbps),全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,如NRF24L01、VS1053、SD卡等。

        1、全双工与半双工

                a:半双工常见于485总线,即下图所示,使用的是差分信号,这样子就决定了是半双工,即任何一个传输时刻,只有一个传输方向,要么是发送,要么是接收。优点在于传输距离远,理论上达到1.2km。

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

                 d:全双工常见SPI通信,即下图所示,两边可以同时收发数据,优点是速度快,延迟小。

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

         2、同步与异步

                 a:同步的典型特征:有时钟线,可以控制通信的速度。

                 b:异步的典型特征:约束好通信的波特率,数据帧格式.

        3、SPI通信方式

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

根据上图我们可以看到,由于SPI是全双工,同步的通信总线,SCLK,MOSI,MISO这三个引脚可以共用于从机,根据片选引脚(/SS)来区别来区别从机(输出低电平的从机有效工作),注意:硬件连接看起来是一对多,一个主机对应多个从机,但是实际上通信只能一对一通信,当一个硬件处于通信状态(输出低电平),其他硬件处于等待状态(输出高电平),不然容易出现数据的冲突

SCLK(Serial Clock):串行时钟线

MOSI(Master Output Slave Input):主机输出数据,从机接收数据  

MISO(Master Input Slave Output):从机输出数据,主机接收数据

/SS(slave select):从机选择,该引脚输出低电平,该引脚有效工作

二、SPI工作模式

SPI总线有四种工作模式,其中使用最为广泛的是模式0和模式3方式。

CPOL(Clock Polarity):时钟极性选择,为0时SPI总线空闲时,时钟线为低电平 ; 为1时SPI总线空闲时,时钟线为高电平。

CPHA(Clock Phase):时钟相位选择,为0时在SCLK第一个跳变沿,主机对MISO引脚电平采样;为1时在SCLK第二个跳变沿,主机对MISO引脚电平采样

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

通过上面两张图我们可以发现,模式0是从机先发送第一个数据,模式3是主机先发送第一个数据,它们之间有什么区别呢,其实没有什么区别,作用就是做好通信前的准备,约定好数据的采集时机

三、W25Q128BV

        W25Q128BV:内存128MBit/16MType,每个可编程页256字节,支持SPI模式0和模式3。具体可以看相关手册。由于手册繁多且复杂,这边就不多做描述。w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

关于SPI SLASH具体描述可参考博主:(15条消息) W25Q128数据手册阅读总结_百里之外的博客-CSDN博客https://blog.csdn.net/qq_40993639/article/details/122053404

        1、读ID Read Manufacturer/Device ID(90h)         

 本文我们讲一讲常用的指令中的一种,读ID Read Manufacturer/Device ID(90h),下图是完整的时序图,数据手册是分两个图来看,我这里合成一个图看着更方便一点。关于这个时序图的工作方式在手册有总结,是一段英文解释,我这边用自己的话解释这个时序图的工作原理。

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

在这个指令传输之前,我们要使/cs(/ss)引脚拉低移位传输指令码90h(1001 0000)对应时钟线(CLK)0-7,每一个时钟周期对应一个Bit(比特),紧接着我们要传输24-BIt(比特)地址(A23-A0),其对应时钟线(CLK)8-31,也就是3个字节地址,完成上诉工作之后,厂商ID和设备ID就会发给我们主机,通信结束后,使/cs(/ss)引脚拉高。

通过读ID往往能够检测到SPI通信是否正常,也能够知道从机设备是否在线。

         2、读ID代码实现(硬件SPI)

编程环境:keil5 STM32f407

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

 首先初始化w25q128。

GPIO_InitTypeDef  GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;

void w25q128_init(void)
{

	//使能端口B的硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	//使能SPI1的硬件时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
	
	
	//配置PB3~PB5为复用功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;	//指定3、4、5号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置为复用功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	
	//将PB3~PB5连接到SPI1的硬件
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);		
	
	
	//配置PB14为输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;	//指定14号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//配置为推挽功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	//PB14初始电平状态为高电平,因为总线空闲的时候,SS引脚(片选引脚)为高电平
	PBout(14)=1;
	
	
	//SPI1参数的配置        //硬件SPI设置  模拟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;//根据从机的手册来配置,模式3
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//根据从机的手册来配置,模式3,第二跳变沿

    //由软件代码控制片选引脚     SPI_NSS_Hard表示由硬件控制引脚
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    
    //波特率  根据从机的手册来配置,SPI的硬件时钟=84MHz/16=5.25MHz
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;

    //根据从机的手册来配置 MSB表示最高有效位传输
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_Init(SPI1, &SPI_InitStructure);
	
	
	//使能SPI1硬件工作
	SPI_Cmd(SPI1,ENABLE);

}

读ID

//官方代码,
uint8_t SPI1_SendByte(uint8_t byte)
{
  /*!< Loop while DR register in not emplty */
  //检测是否发送完毕
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);    

  /*!< Send byte through the SPI1 peripheral */
  //如果发送完,就把数据发送出去
  SPI_I2S_SendData(SPI1, byte);

  /*!< Wait to receive a byte */
  
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  /*!< Return the byte read from the SPI bus */
   //对方返回一个字节回来
  return SPI_I2S_ReceiveData(SPI1);
}

void w25q128_read_id(uint8_t *m_id,uint8_t *d_id)
{
	W25Q128_SS=0;

	SPI1_SendByte(0x90);

	SPI1_SendByte(0x00);
	SPI1_SendByte(0x00);
	SPI1_SendByte(0x00);

	//这里参数随便填,从机会忽略引脚电平状态
	*m_id=SPI1_SendByte(0xFF);
	*d_id=SPI1_SendByte(0xFF);

	W25Q128_SS=1;	//拉高结束
}

获取厂商ID和设备ID并打印 

int main()
{
    uint8_t m_id,d_id;
    
    //串口初始化
    usart1_init(115200);
       
    w25q128_init();
    
    w25q128_read_id(m_id,d_id);

    printf("m_id=%X,d_id=%x\r\n",m_id,d_id);

    while(1)
    {
        
    }
}

打印结果 w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

  从0地址连续读64字节的数据实现        Read Data(03H)

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

 基本上不变,指令变为03H,后面就是传输连续字节,接收完一个字节,其指向会指向新的地址,每个地址都指向有效数据(会自动偏移)。

//通用写法
void w25q128_read(uint32_t addr,uint8_t *buf,uint32_t len)
{
	uint8_t *p = buf;
	
    //拉低开始
	W25Q128_SS=0;

	SPI1_SendByte(0x03);

	//假如有个地址为0x123456.
	SPI1_SendByte(addr>>16);    //0x12
	SPI1_SendByte(addr>>8);	    //0x34
	SPI1_SendByte(addr);	    //0x56
	
	while(len--)
	{
		*p=SPI1_SendByte(0xFF);
		p++;
	}


    //拉高结束
	W25Q128_SS=1;	
}	

 打印

w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

         3、IO口模拟SPI时序图实现 (软件SPI)  模式3

 初始化模拟SPI w25q128

GPIO_InitTypeDef  GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;
#define W25Q128_SS		PBout(14)
#define W25Q128_SCLK   	PBout(3)
#define W25Q128_MOSI   	PBout(5)
#define W25Q128_MISO	PBin(4)

void w25q128_init(void)
{

	//使能端口B的硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);	
	
	
	//配置PB3 PB5 PB14为输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_14;	//指定3、5、14号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//配置为输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOB, &GPIO_InitStructure);	

	
	//配置PB4为输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	//指定4号引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//配置为输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度越高,功耗就越高,但是响应速度也更快
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不需要使能内部上下拉电阻
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	//PB14初始电平状态为高电平,因为总线空闲的时候,SS引脚(片选引脚)为高电平
	W25Q128_SS=1;
	
	//CPOL=1,SCLK引脚在SPI总线空闲的时候为高电平
	W25Q128_SCLK=1;
	
	//MOSI引脚随意电平    可高可低
	W25Q128_MOSI=1;


}

读ID,只不过发送需要自己写

uint8_t SPI1_SendByte(uint8_t byte)
{
	int32_t i=0;
	
	uint8_t d=0;
	
    //一个周期的变化
	for(i=7; i>=0; i--)
	{
	
		if(byte & (1<<i))
			W25Q128_MOSI=1;
		else
			W25Q128_MOSI=0;
	
		
        
		W25Q128_SCLK=0;    //模式3单个周期  SCLK拉低
		delay_us(1);       //延时1微秒
		
		W25Q128_SCLK=1;    //模式3单个周期  SCLK拉高
		delay_us(1);       //延时1微秒
        
        //判断MISO是否是高电平
		if(W25Q128_MISO)
			d|=1<<i;
	
	}
	
	return d;
}


void w25q128_read_id(uint8_t *m_id,uint8_t *d_id)
{
	W25Q128_SS=0;

	SPI1_SendByte(0x90);

	SPI1_SendByte(0x00);
	SPI1_SendByte(0x00);
	SPI1_SendByte(0x00);

	
	*m_id=SPI1_SendByte(0xFF);
	*d_id=SPI1_SendByte(0xFF);

	W25Q128_SS=1;	
}
	

成功打印数据,与硬件SPI打印是一样的 w25q128中文数据手册,STM32硬件,单片机,stm32,fpga开发

 本次就分享到这里,如看到我理解错的地方也请指正我,感谢各位的观看❤文章来源地址https://www.toymoban.com/news/detail-633191.html

到了这里,关于SPI FLASH(W25Q128BV) 包含SPI工作原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32—SPI详解入门(使用SPI通讯读写W25Q128模块)

    目录 一、SPI是什么 二、SPI物理架构 三、SPI工作原理 四、SPI工作模式 五、SPI相关寄存器介绍 六、SPI用到的结构体与函数 1.结构体 2.函数 七、W25Q128芯片 1.W25Q128介绍 2.W25Q128存储架构 3.W25Q128常用指令 4.W25Q128状态寄存器 5.W25Q128常见操作流程 八、实验(使用SPI通讯读写W25Q128模块

    2024年02月14日
    浏览(42)
  • 使用stm32的模拟spi读取w25q128读取设备ID时一直出现0xFF

    由于公司的电路是前辈画的,只能使用模拟spi中如图所示   上图是stm32所对应的引脚  上图是w25q128的引脚 当读取的时候ID号一直是0xffff,在网上查了各种方法都试过了都不行,我这个情况稍微特殊,就是使用了PB3、PB4这两个引脚上电复位默认是作为调试端口使用的。所以得先

    2024年02月04日
    浏览(40)
  • W25Q128芯片手册精读

    之前写SPI通信的时候用到了W25Q128,其中对芯片手册的阅读我只写了我们所需要的的部分。 这篇博客就对这个芯片进行详细的阅读并记录,文章可能会比较长,但绝对是结合了自己的理解进行阐述。 芯片手册刚开始看的时候最大的拦路虎其实就是英文,看习惯了中文,直接看

    2024年02月07日
    浏览(34)
  • [10min速通]STM32CubemMX配置W25Q128

    下载github开源驱动代码。 GitHub - nimaltd/w25qxx: w25qxx SPI FLASH driver for stm32 HAL 此处声明此工程不是本人所作。 这个工程的作者在Readme中提供的视频教程配置非常详细了,会魔法的同学可以直接去看视频进行配置,不用看此文。 如果访问不了github,可以直接下载文末的资料,打包

    2024年02月12日
    浏览(29)
  • STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 使用FatFs中间件通过SPI通信协议对W25Q128芯片进行读写等操作 关于STM32F407使用SPI通信协议对W25Q128 FLASH芯片读写

    2024年02月19日
    浏览(42)
  • 【STM32】SPI初步使用 读写FLASH W25Q64

    (1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电

    2024年02月10日
    浏览(42)
  • STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法

    常见的SPI Flash:W25Qxx系列,本文以W25Q16为实例制作Keil下载算法。 如下图,红框内的东西就是下载算法。 只要导入下载算法后,就可以在烧录MCU的同时对W25Q16页进行烧录。此操作可方便LCD运用场景,字库、图片存放在外部Flash的烧录。 实际操作: 1、硬件:STM32G030C8T6、W25Q16(

    2024年02月21日
    浏览(36)
  • STM32-SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)

    ​  SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)。 ​SPI通信具有以下特点: 同步,全双工; 支持总线挂载多设备(SPI仅支持一主多从); 在不

    2024年02月08日
    浏览(39)
  • zynq 烧写W25Q256FV Flash步骤

    zynq中flash设置: QSPI时钟默认200MHz; 生成bit文件后导出到vitis中,修改fsbbl_debug.h文件,添加#define FSBL_DEBUG_INFO,目的为了在烧写过程中打印烧写信息,生成fsbl.elf文件; 打包BOOT.bin文件:Xilinx-Create BOOT Image,配置如下: 其中fsbl.elf文件信息: bit文件信息: 点击Create Image; 下载

    2024年02月07日
    浏览(30)
  • STM32F103单片机通过SPI全双工通信协议与W25Q64(FLASH)进行通信【串行同步通信(数据线与时钟线配合),(一主多从模式)】附相关驱动代码详解

    1.W25Qxx系列是一种低成本、小型化、使用简单的 非易失性存储器 ,常应用于数据存储、字库存储、固件程序存储等场景 2.存储介质: Nor Flash(闪存) 3.时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 4.存储容量(24位地址): W25Q40: 4Mbit / 512KByte W25Q80: 8Mbit / 1MByte W25Q16: 16

    2024年04月13日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包