STM32驱动W25Q64读写数据

  • 一.基本参数
  • 二.通信协议
  • 1、时序:
  • 2、代码:
  • 三.引脚定义与接线
  • 1、引脚定义
  • 2、对应接线
  • 四.主要代码
  • 五.操作步骤与现象
  • 六.总结
  • 一.基本参数

    1.采用串行Nor flash外扩存储芯片
    2.支持SPI接口
    3.工作电压:2.7~3.6V
    4.容量: 32Mbit(W25Q32)
    64Mbit(W25Q64)
    128Mbit(W25Q128)

    二.通信协议

    1、时序:

    2、代码:

    此处使用硬件SPI

    /**
      * @brief  SPI_FLASH初始化
      * @param  无
      * @retval 无
      */
    void SPI_FLASH_Init(void)
    {
      SPI_InitTypeDef  SPI_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
    	
    	/* 使能SPI时钟 */
    	FLASH_SPI_APBxClock_FUN ( FLASH_SPI_CLK, ENABLE );
    	
    	/* 使能SPI引脚相关的时钟 */
     	FLASH_SPI_CS_APBxClock_FUN ( FLASH_SPI_CS_CLK|FLASH_SPI_SCK_CLK|
    																	FLASH_SPI_MISO_PIN|FLASH_SPI_MOSI_PIN, ENABLE );
    	
      /* 配置SPI的 CS引脚,普通IO即可 */
      GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_PIN;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(FLASH_SPI_CS_PORT, &GPIO_InitStructure);
    	
      /* 配置SPI的 SCK引脚*/
      GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(FLASH_SPI_SCK_PORT, &GPIO_InitStructure);
    
      /* 配置SPI的 MISO引脚*/
      GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN;
      GPIO_Init(FLASH_SPI_MISO_PORT, &GPIO_InitStructure);
    
      /* 配置SPI的 MOSI引脚*/
      GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN;
      GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);
    
      /* 停止信号 FLASH: CS引脚高电平*/
      SPI_FLASH_CS_HIGH();
    
      /* SPI 模式配置 */
      // FLASH芯片 支持SPI模式0及模式3,据此设置CPOL CPHA
      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;
      SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
      SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
      SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
      SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
      SPI_InitStructure.SPI_CRCPolynomial = 7;
      SPI_Init(FLASH_SPIx , &SPI_InitStructure);
    
      /* 使能 SPI  */
      SPI_Cmd(FLASH_SPIx , ENABLE);
    	
    }
    

    三.引脚定义与接线

    1、引脚定义

    引脚 功能
    CS(NSS) 片选,低电平有效
    SCK 时钟信号引脚
    MISO/DO 模块数据输出引脚
    MOSI/DI 模块数据输入引脚

    2、对应接线

    W25Q64模块 STM32F103C8T6
    VCC 3.3V
    SPI_CS GPIOA_4
    SPI_SCK GPIOA_5
    SPI_MISO/DO GPIOA_6
    SPI_MOSI/DI GPIOA_7

    四.主要代码

    /*
     * 函数名:main
     * 描述  :主函数
     * 输入  :无
     * 输出  :无
     */
    int main(void)
    { 	
    	uint16_t i;
    	LED_GPIO_Config();
    	LED_BLUE;
    	
    	/* 配置串口为:115200 8-N-1 */
    	USART_Config();
    	printf("\r\n 这是一个64Mbit串行flash(W25Q64)实验 \r\n");
    	
    	/* 8M串行flash W25Q64初始化 */
    	SPI_FLASH_Init();
    	
    	/* 获取 Flash Device ID */
    	DeviceID = SPI_FLASH_ReadDeviceID();	
    	Delay( 200 );
    	
    	/* 获取 SPI Flash ID */
    	FlashID = SPI_FLASH_ReadID();	
    	printf("\r\n FlashID is 0x%X,\
    	Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);
    	
    	/* 检验 SPI Flash ID */
    	if (FlashID == sFLASH_ID)
    	{	
    		printf("\r\n 检测到串行flash W25Q64 !\r\n");
    		
    		/* 擦除将要写入的 SPI FLASH 扇区,FLASH写入前要先擦除 */
    		// 这里擦除4K,即一个扇区,擦除的最小单位是扇区
    		SPI_FLASH_SectorErase(FLASH_SectorToErase);	 	 
    		
    		/* 将发送缓冲区的数据写到flash中 */
    		// 这里写一页,一页的大小为256个字节
    			/*写入数据到buff中*/
    		for(i=0;i<100;i++)
    		{
    			Tx_Buffer[i] = i;
    		}
    		SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);
    		printf("\r\n写入的数据为:\r\n");
    		for(i=0;i<BufferSize;i++)
    		{
    			if((i%10)==0)
    			{
    				printf("\r\n");
    				
    			}
    			printf("%x ", Tx_Buffer[i]);
    		}
    		/* 将刚刚写入的数据读出来放到接收缓冲区中 */
    		SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
    		printf("\r\n读出的数据为:\r\n");
    		for(i=0;i<BufferSize;i++)
    		{
    			if((i%10)==0)
    			{
    				printf("\r\n");
    				
    			}
    			printf("%x ", Rx_Buffer[i]);
    		}
    		/* 检查写入的数据与读出的数据是否相等 */
    		TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
    		
    		if( PASSED == TransferStatus1 )
    		{ 
    			LED_GREEN;
    			printf("\r\n 64Mbit串行flash(W25Q64)测试成功!\n\r");
    		}
    		else
    		{        
    			LED_RED;
    			printf("\r\n 64Mbit串行flash(W25Q64)测试失败!\n\r");
    		}
    	}// if (FlashID == sFLASH_ID)
    	else// if (FlashID == sFLASH_ID)
    	{ 
    		LED_RED;
    		printf("\r\n 获取不到 W25Q64 ID!\n\r");
    	}
    	
    	while(1);  
    }
    

    五.操作步骤与现象

    下载程序后打开串口助手,选择对应端口,波特率选115200 打开串口 最后按下开发板复位按键就会有如下输出:

    六.总结

    1、供电切勿超过3.6V,建议3.3V供电
    2、注意写入读出的数据量大小一致,否者读出可能乱码
    需要完整工程的可下方留言邮箱获取

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32驱动W25Q64读写数据

    发表评论