STM32F103 外部FLASH实验(SPI)

实验目的

本实验学习STM32的SPI接口的使用,利用SPI接口读写16M字节FLASH芯片W25Q128FVSSIG,将结果通过串口显示出来。SPI接口请参看数据手册第23章

实验简介

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

SPI接口包含4条总线,分别是SCK,MISO,MOSI,和CS,作用如下:

SCK:时钟信号线,由主设备产生输出给从设备。
MISO: 主设备数据输入,从设备数据输出。
MOSI:主设备数据输出,从设备数据输入。
CS :从设备片选信号线,由主设备控制。

SPI根据时钟极性(CPOL)和时钟相位(CPHA)的不同分为4种模式,分别为CPOL=0
CPHA = 0,CPOL=0 CPHA = 1,CPOL = 1 CPHA = 0 和 CPOL = 1, CPOL = 1,这四种模式。时序图如下:
在这里插入图片描述

电路设计

星光STM32F103开发板采用的SPI FLASH为W25Q128FVSSIG芯片,容量16M字节,连接到STM32的SPI1,电路图如下所示:
在这里插入图片描述
由于和JTAG共用部分IO,程序设计时需要关闭JTAG功能,可通过串口下载其他程序,擦除芯片中的设置,恢复JTAG功能。

代码

main.c

#include "MyIncludes.h"

u16 sys_cnt = 0;
//systick中断服务函数,1ms中断
void systick_isr(void)
{
   
   
	 if(sys_cnt < 1000)
	  sys_cnt++;
	 else
	 {
   
   
		  sys_cnt = 0;
		  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4|GPIO_PIN_5);
	 }
}


u32 w25_id;
//25ID
u8 writeBuffer1[256];
//写缓存区数组
u8 readBuffer1[256];
//读缓存区数组
u8 statusl;
//貌似没用这个

int main()
{
   
   
	 u32 j;
	 
	 System_Init();
	 LED_Init();
	 SysTick_Init(systick_isr);
	 USART1_Init(115200,NULL,NULL);
	 W25_Flash_Init();
	 //Flash初始化
	 w25_id = W25_Flash_ReadJedecID();
	 //读取芯片JedecID
	 if(w25_id != 0xEF4018)
	 return 0;
	 w25_id = W25_Flash_ReadID();
	 if(w25_id != 0xEF17)
	 return 0;
	 for(j=0; j < sizeof(writeBuffer1);j++)
	 {
   
   
		 writeBuffer1[j] = j;
	 }
	 
	 
//扇形测试	 W25_FLASH_Erase(W25X_FLASH_ERASE_SECTOR,0);
	 W25X_Flash_PageProgram(0,writeBuffer1,sizeof(writeBuffer1));
	 W25_Flash_Read(0,readBuffer1,sizeof(readBuffer1));
	 if(strncmp((char *)writeBuffer1,(char *)readBuffer1,256) != 0)
	 {
   
   
		  goto ERROR;
	 }
	 
	 W25_FLASH_Erase(W25X_FLASH_ERASE_SECTOR,0);
	 W25_Flash_Read(0,readBuffer1,sizeof(readBuffer1));
	 for(j=0; j<sizeof(readBuffer1);j++)
	 {
   
   
		  if(readBuffer1[j] != 0xff)
				goto ERROR;
	 }
	 
	 
	 
//32K块测试	 W25_FLASH_Erase(W25X_FLASH_ERASE_BLOCK_32K,0);
	 W25X_Flash_PageProgram(4*4096,writeBuffer1,sizeof(writeBuffer1));
	 W25_Flash_FastRead(4*4096,readBuffer1,sizeof(readBuffer1));
	 if(strncmp((char *)writeBuffer1,(char *)readBuffer1,256) !=0 )
	 {
   
   
		  goto ERROR;
	 }
	 
	 W25_FLASH_Erase(W25X_FLASH_ERASE_BLOCK_32K,0);
	 W25_Flash_FastRead(4*4096,readBuffer1,sizeof(readBuffer1));
	 for(j=0;j<sizeof(readBuffer1); j++)
	 {
   
   
		 if(readBuffer1[j] != 0xff)
			 goto ERROR;
	 }
	 
	 
//64K块测试	 W25_FLASH_Erase(W25X_FLASH_ERASE_BLOCK_64K,0);
	 W25X_Flash_PageProgram(9*4096,writeBuffer1,sizeof(writeBuffer1));
	 W25_Flash_FastRead(9*4096,readBuffer1,sizeof(readBuffer1));
	 if(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值