国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32CubeMX學習】SPI讀寫W25Q16

這篇具有很好參考價值的文章主要介紹了【STM32CubeMX學習】SPI讀寫W25Q16。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、SPI總線

????????SPI分為主從工作模式,通常有一個主設備和一個或多個從設備,本文中MCU為主機,W25Q16為從機。

SPI通信有以下四根線:

MISO:主設備數(shù)據(jù)輸入,從設備數(shù)據(jù)輸出。
MOSI:主設備數(shù)據(jù)輸出,從設備數(shù)據(jù)輸入。
SCLK:時鐘信號,由主設備產(chǎn)生。
CS:從設備片選信號,由主設備控制,低電平為選中。

????????SPI可以同時發(fā)出和接收串行數(shù)據(jù),主機發(fā)送一個數(shù)據(jù)的同時從機也將自己數(shù)據(jù)返回給主機。這樣,雙方的數(shù)據(jù)就被交換了。主機控制外設時,寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的字節(jié);反之,若主機要讀取從機的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機的傳輸。

SPI的特點:高位先發(fā)送,共有四種工作模式。

CPOL(時鐘極性):規(guī)定了SCK時鐘信號空閑狀態(tài)的電平(0-低電平,1-高電平)
CPHA(時鐘相位):規(guī)定了數(shù)據(jù)是在SCK時鐘的上升沿還是下降沿被采樣(0-第一個時鐘邊沿開始采樣,1-第二個時鐘邊沿開始采樣)

模式0:CPOL=0,CPHA =0 ?SCK空閑為低電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))
模式1:CPOL=0,CPHA =1 ?SCK空閑為低電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
模式2:CPOL=1,CPHA =0 ?SCK空閑為高電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
模式3:CPOL=1,CPHA =1 ?SCK空閑為高電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))

2、使用STM32CubeMX配置相關引腳

【STM32CubeMX學習】SPI讀寫W25Q16

【STM32CubeMX學習】SPI讀寫W25Q16?

3、實現(xiàn)軟件模擬SPI的四種模式

spi.h

#ifndef __SPI_H
#define __SPI_H

#include "main.h"

#define MOSI_H  HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET)  
#define MOSI_L  HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET)  
#define SCK_H   HAL_GPIO_WritePin(SCLK_GPIO_Port, SCLK_Pin, GPIO_PIN_SET)  
#define SCK_L   HAL_GPIO_WritePin(SCLK_GPIO_Port, SCLK_Pin, GPIO_PIN_RESET)  
#define MISO    HAL_GPIO_ReadPin(MISO_GPIO_Port, MISO_Pin) 
#define F_CS_H   HAL_GPIO_WritePin(F_CS_GPIO_Port, F_CS_Pin, GPIO_PIN_SET)  
#define F_CS_L   HAL_GPIO_WritePin(F_CS_GPIO_Port, F_CS_Pin, GPIO_PIN_RESET) 

uint8_t SOFT_SPI_RW_MODE0(uint8_t write_dat);
uint8_t SOFT_SPI_RW_MODE1(uint8_t write_dat);
uint8_t SOFT_SPI_RW_MODE2(uint8_t write_dat);
uint8_t SOFT_SPI_RW_MODE3(uint8_t write_dat);

uint8_t SPI2_ReadWriteByte(uint8_t TxData);

#endif

?spi.c

#include "spi.h"

/*spi延時函數(shù),微秒*/
static void spi_delay(uint16_t time)
{    
   uint16_t i=0;  
   while(time--)
   {
      i=10;  
      while(i--) ;    
   }
}

//CPOL:規(guī)定了SCK時鐘信號空閑狀態(tài)的電平(0-低電平,1-高電平)
//CPHA:規(guī)定了數(shù)據(jù)是在SCK時鐘的上升沿還是下降沿被采樣(0-第一個時鐘邊沿開始采樣,1-第二個時鐘邊沿開始采樣)

//模式0:CPOL=0,CPHA =0  SCK空閑為低電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))
//模式1:CPOL=0,CPHA =1  SCK空閑為低電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
//模式2:CPOL=1,CPHA =0  SCK空閑為高電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
//模式3:CPOL=1,CPHA =1  SCK空閑為高電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))

/* CPOL = 0, CPHA = 0 */
uint8_t SOFT_SPI_RW_MODE0(uint8_t write_dat)
{
  uint8_t i,read_dat = 0;
  SCK_L; 
  for(i=0;i<8;i++)
  {
    if(write_dat&0x80)
      MOSI_H;  
    else                    
      MOSI_L;  
    write_dat <<= 1;
    spi_delay(1);	
    SCK_H; 
    read_dat <<= 1;  
    
    if(MISO) 
      read_dat++; 
    spi_delay(1);
    SCK_L; 
    __nop();
  }	
  return read_dat;
}
 
/* CPOL=0,CPHA=1 */
uint8_t SOFT_SPI_RW_MODE1(uint8_t write_dat) 
{
  uint8_t i,read_dat = 0;
  SCK_L;
	for(i=0;i<8;i++)
	{
		SCK_H;     
		if(write_dat&0x80)
			MOSI_H; 
		else      
			MOSI_L;
		write_dat <<= 1;
		spi_delay(1);
		SCK_L; 
		read_dat <<= 1;  
 
		if(MISO)
			read_dat++;  
		spi_delay(1);
	}
	return read_dat;   
}
 
/* CPOL=1,CPHA=0 */
uint8_t SOFT_SPI_RW_MODE2(uint8_t write_dat) 
{
  uint8_t i,read_dat = 0; 
  SCK_H; 
	for(i=0;i<8;i++)  
	{
		if(write_dat&0x80)
			MOSI_H; 
		else      
			MOSI_L;   
		write_dat <<= 1;   
		spi_delay(1);
		SCK_L;    
		read_dat <<= 1;  
 
		if(MISO)
			read_dat++;   
		spi_delay(1);
		SCK_H; 
	}
	return read_dat;
}
 
/* CPOL = 1, CPHA = 1 */
uint8_t SOFT_SPI_RW_MODE3(uint8_t write_dat)
{
  uint8_t i,read_dat = 0;
  SCK_H; 
  for(i=0;i<8;i++)
  {
    SCK_L; 
    if(write_dat&0x80)
      MOSI_H;  
    else                    
      MOSI_L;  
    write_dat <<= 1;
    spi_delay(1);	
    SCK_H; 
    read_dat <<= 1;  
    
    if(MISO) 
      read_dat++; 
    spi_delay(1);
    __nop();
  }
  return read_dat;
}

//SPI2 讀寫一個字節(jié)
//TxData:要寫入的字節(jié)
//返回值:讀取到的字節(jié)
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
  uint8_t Rxdata;
  Rxdata = SOFT_SPI_RW_MODE3(TxData);//使用模式3
  return Rxdata;		
}

4、實現(xiàn)W25Q16的讀寫函數(shù)

參考正點原子例程

w25q16.h

#ifndef __W25Q16_H
#define __W25Q16_H	

#include "main.h" 

extern uint8_t W25QXX_BUFFER[4096];

//W25X16讀寫指令表
#define W25X_WriteEnable		0x06 
#define W25X_WriteDisable		0x04 
#define W25X_ReadStatusReg		0x05 
#define W25X_WriteStatusReg		0x01 
#define W25X_ReadData			0x03 
#define W25X_FastReadData		0x0B 
#define W25X_FastReadDual		0x3B 
#define W25X_PageProgram		0x02 
#define W25X_BlockErase			0xD8 
#define W25X_SectorErase		0x20 
#define W25X_ChipErase			0xC7 
#define W25X_PowerDown			0xB9 
#define W25X_ReleasePowerDown	0xAB 
#define W25X_DeviceID			0xAB 
#define W25X_ManufactDeviceID	0x90 
#define W25X_JedecDeviceID		0x9F 

uint16_t  W25QXX_ReadID(void);//讀取FLASH ID

void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead);//讀取flash
void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);//寫入flash

void W25QXX_Erase_Chip(void);  //整片擦除
void W25QXX_Erase_Sector(uint32_t Dst_Addr);//扇區(qū)擦除

void W25QXX_PowerDown(void);//進入掉電模式
void W25QXX_WAKEUP(void);//喚醒

#endif

w25q16.c

#include "w25q16.h"
#include "spi.h"

//容量為16M bit,2M byte,共有32個塊,512個扇區(qū) 
//4Kbytes為一個扇區(qū),16個扇區(qū)為1個塊												   

//讀取SPI_FLASH的狀態(tài)寄存器
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:默認0,狀態(tài)寄存器保護位,配合WP使用
//TB,BP2,BP1,BP0:FLASH區(qū)域?qū)懕Wo設置
//WEL:寫使能鎖定
//BUSY:忙標記位(1,忙;0,空閑)
//默認:0x00
uint8_t W25QXX_ReadSR(void)   
{  
	uint8_t byte=0;   
	F_CS_L;//使能器件   
	SPI2_ReadWriteByte(W25X_ReadStatusReg);    //發(fā)送讀取狀態(tài)寄存器命令    
	byte=SPI2_ReadWriteByte(0Xff);   //讀取一個字節(jié)  
	F_CS_H;//取消片選     
	return byte;   
} 

//寫SPI_FLASH狀態(tài)寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以寫!!!
void W25QXX_Write_SR(uint8_t sr)   
{   
	F_CS_L; //使能器件   
	SPI2_ReadWriteByte(W25X_WriteStatusReg);   //發(fā)送寫取狀態(tài)寄存器命令    
	SPI2_ReadWriteByte(sr);  //寫入一個字節(jié)  
	F_CS_H;//取消片選     
}   

//等待空閑
void W25QXX_Wait_Busy(void)   
{   
	while((W25QXX_ReadSR()&0x01)==0x01);   //等待BUSY位清空
} 

//SPI_FLASH寫使能	
//將WEL置位   
void W25QXX_Write_Enable(void)   
{
	F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_WriteEnable);   //發(fā)送寫使能  
  F_CS_H;//取消片選     
} 

//SPI_FLASH寫禁止	
//將WEL清零  
void W25QXX_Write_Disable(void)   
{  
	F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_WriteDisable);   //發(fā)送寫禁止指令    
  F_CS_H;//取消片選     
} 			   

//讀取芯片ID W25X16的ID:0XEF14
uint16_t W25QXX_ReadID(void)
{
	uint16_t Temp = 0;	  
	F_CS_L;   //使能器件   
	SPI2_ReadWriteByte(0x90);//發(fā)送讀取ID命令	    
	SPI2_ReadWriteByte(0x00); 	    
	SPI2_ReadWriteByte(0x00); 	    
	SPI2_ReadWriteByte(0x00); 	 			   
	Temp|=SPI2_ReadWriteByte(0xFF)<<8;  
	Temp|=SPI2_ReadWriteByte(0xFF);	 
  F_CS_H;//取消片選     
	return Temp;
} 

//讀取SPI FLASH  
//在指定地址開始讀取指定長度的數(shù)據(jù)
//pBuffer:數(shù)據(jù)存儲區(qū)
//ReadAddr:開始讀取的地址(24bit)
//NumByteToRead:要讀取的字節(jié)數(shù)(最大65535)
void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
{ 
 	uint16_t i;    												    
	F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_ReadData);//發(fā)送讀取命令   
  SPI2_ReadWriteByte((uint8_t)((ReadAddr)>>16));  //發(fā)送24bit地址    
  SPI2_ReadWriteByte((uint8_t)((ReadAddr)>>8));   
  SPI2_ReadWriteByte((uint8_t)ReadAddr);   
  for(i=0;i<NumByteToRead;i++)
	{ 
    pBuffer[i]=SPI2_ReadWriteByte(0XFF);   //循環(huán)讀數(shù)  
  }
  F_CS_H;//取消片選     
}  

//SPI在一頁(0~65535)內(nèi)寫入少于256個字節(jié)的數(shù)據(jù)
//在指定地址開始寫入最大256字節(jié)的數(shù)據(jù)
//pBuffer:數(shù)據(jù)存儲區(qū)
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節(jié)數(shù)(最大256),該數(shù)不應該超過該頁的剩余字節(jié)數(shù)!!!	 
void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
 	uint16_t i;  
  W25QXX_Write_Enable();  //SET WEL 
	F_CS_L;   //使能器件   
  SPI2_ReadWriteByte(W25X_PageProgram);    //發(fā)送寫頁命令   
  SPI2_ReadWriteByte((uint8_t)((WriteAddr)>>16));//發(fā)送24bit地址    
  SPI2_ReadWriteByte((uint8_t)((WriteAddr)>>8));   
  SPI2_ReadWriteByte((uint8_t)WriteAddr);   
  for(i=0;i<NumByteToWrite;i++)SPI2_ReadWriteByte(pBuffer[i]);//循環(huán)寫數(shù)  
  F_CS_H;//取消片選     
	W25QXX_Wait_Busy();//等待寫入結束
} 

//無檢驗寫SPI FLASH 
//必須確保所寫的地址范圍內(nèi)的數(shù)據(jù)全部為0XFF,否則在非0XFF處寫入的數(shù)據(jù)將失敗!
//具有自動換頁功能 
//在指定地址開始寫入指定長度的數(shù)據(jù),但是要確保地址不越界!
//pBuffer:數(shù)據(jù)存儲區(qū)
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節(jié)數(shù)(最大65535)
//CHECK OK
void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
{ 			 		 
	uint16_t pageremain;	   
	pageremain=256-WriteAddr%256; //單頁剩余的字節(jié)數(shù)		 	    
	if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256個字節(jié)
	while(1)
	{	   
		W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
		if(NumByteToWrite==pageremain)break;//寫入結束了
	 	else //NumByteToWrite>pageremain
		{
			pBuffer+=pageremain;
			WriteAddr+=pageremain;	

			NumByteToWrite-=pageremain;			  //減去已經(jīng)寫入了的字節(jié)數(shù)
			if(NumByteToWrite>256)pageremain=256; //一次可以寫入256個字節(jié)
			else pageremain=NumByteToWrite; 	  //不夠256個字節(jié)了
		}
	};	    
} 

//寫SPI FLASH  
//在指定地址開始寫入指定長度的數(shù)據(jù)
//該函數(shù)帶擦除操作!
//pBuffer:數(shù)據(jù)存儲區(qū)
//WriteAddr:開始寫入的地址(24bit)
//NumByteToWrite:要寫入的字節(jié)數(shù)(最大65535)  		   
uint8_t W25QXX_BUFFER[4096];
void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
{ 
	uint32_t secpos;
	uint16_t secoff;
	uint16_t secremain;	   
 	uint16_t i;    

	secpos=WriteAddr/4096;//扇區(qū)地址 0~511 for w25x16
	secoff=WriteAddr%4096;//在扇區(qū)內(nèi)的偏移
	secremain=4096-secoff;//扇區(qū)剩余空間大小   

	if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096個字節(jié)
	while(1) 
	{	
		W25QXX_Read(W25QXX_BUFFER,secpos*4096,4096);//讀出整個扇區(qū)的內(nèi)容
		for(i=0;i<secremain;i++)//校驗數(shù)據(jù)
		{
			if(W25QXX_BUFFER[secoff+i]!=0XFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			W25QXX_Erase_Sector(secpos);//擦除這個扇區(qū)
			for(i=0;i<secremain;i++)//復制
			{
				W25QXX_BUFFER[i+secoff]=pBuffer[i];	  
			}
			W25QXX_Write_NoCheck(W25QXX_BUFFER,secpos*4096,4096);//寫入整個扇區(qū)  

		}
    else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//寫已經(jīng)擦除了的,直接寫入扇區(qū)剩余區(qū)間. 				   
		if(NumByteToWrite==secremain)break;//寫入結束了
		else//寫入未結束
		{
			secpos++;//扇區(qū)地址增1
			secoff=0;//偏移位置為0 	 

	   	pBuffer+=secremain;  //指針偏移
			WriteAddr+=secremain;//寫地址偏移	   
	   	NumByteToWrite-=secremain;//字節(jié)數(shù)遞減
			if(NumByteToWrite>4096)secremain=4096;//下一個扇區(qū)還是寫不完
			else secremain=NumByteToWrite;//下一個扇區(qū)可以寫完了
		}	 
	};	 	 
}

//擦除整個芯片
//整片擦除時間:
//W25X16:25s 
//W25X32:40s 
//W25X64:40s 
//等待時間超長...
void W25QXX_Erase_Chip(void)   
{                                             
  W25QXX_Write_Enable();  //SET WEL 
  W25QXX_Wait_Busy();   
  F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_ChipErase);   //發(fā)送片擦除命令  
  F_CS_H;//取消片選     
	W25QXX_Wait_Busy();//等待芯片擦除結束
}   

//擦除一個扇區(qū)
//Dst_Addr:扇區(qū)地址 0~511 for w25x16
//擦除一個扇區(qū)的最少時間:150ms
void W25QXX_Erase_Sector(uint32_t Dst_Addr)   
{   
	Dst_Addr*=4096;
  W25QXX_Write_Enable();  //SET WEL 	 
  W25QXX_Wait_Busy();   
  F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_SectorErase);   //發(fā)送扇區(qū)擦除指令 
  SPI2_ReadWriteByte((uint8_t)((Dst_Addr)>>16));  //發(fā)送24bit地址    
  SPI2_ReadWriteByte((uint8_t)((Dst_Addr)>>8));   
  SPI2_ReadWriteByte((uint8_t)Dst_Addr);  
  F_CS_H;//取消片選     
  W25QXX_Wait_Busy();//等待擦除完成
}   

//進入掉電模式
void W25QXX_PowerDown(void)   
{ 
  F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_PowerDown);   //發(fā)送掉電命令  
  F_CS_H;//取消片選     
  Delay_Us(3);//等待TPD  
}   

//喚醒
void W25QXX_WAKEUP(void)   
{  
  F_CS_L;//使能器件   
  SPI2_ReadWriteByte(W25X_ReleasePowerDown);   //send W25X_PowerDown command 0xAB    
  F_CS_H;//取消片選     
  Delay_Us(3); //等待TPD  
}   

5、驗證

添加必要的變量

const uint8_t TEXT_Buffer[]={"W25Q16 TEST"};//要寫入到W25Q16的字符串數(shù)組
#define SIZE sizeof(TEXT_Buffer)
uint16_t W25QXX_TYPE;//定義我們使用的flash芯片型號		
uint32_t FLASH_SIZE=2*1024*1024; //FLASH 大小為2M字節(jié)
uint8_t datatemp[SIZE];

在main函數(shù)里循環(huán)讀寫驗證

  W25QXX_TYPE = W25QXX_ReadID();  
  printf("W25QXX_TYPE == %04x\r\n",W25QXX_TYPE);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */   
    printf("\r\nStart Write W25Q16....\r\n");
    W25QXX_Write((uint8_t*)TEXT_Buffer,FLASH_SIZE-100,SIZE); //從倒數(shù)第100個地址處開始,寫入SIZE長度的數(shù)據(jù)
    printf("W25Q16 Write Finished!\r\n");//提示傳送完成

    Delay_Ms(1000);
   
    printf("\r\nStart Read W25Q16....\r\n");
    W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);  //從倒數(shù)第100個地址處開始,讀出SIZE個字節(jié)
    printf("The Data Readed Is:  ");//提示傳送完成
    printf("%s\r\n",datatemp);//顯示讀到的字符串

    Delay_Ms(1000); 
  }
  /* USER CODE END 3 */

編譯下載后在串口助手中查看

【STM32CubeMX學習】SPI讀寫W25Q16

?可以看到,芯片的ID為0xef14,循環(huán)讀寫也成功了。文章來源地址http://www.zghlxwxcb.cn/news/detail-436220.html

到了這里,關于【STM32CubeMX學習】SPI讀寫W25Q16的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【STM32學習】——SPI通信協(xié)議&SPI時序&W25Q64存儲芯片&軟件SPI讀寫

    【STM32學習】——SPI通信協(xié)議&SPI時序&W25Q64存儲芯片&軟件SPI讀寫

    目錄 前言 一、SPI通信協(xié)議 1.概述? 2.硬件電路 ?3.移位示意圖 二、SPI時序 1.時序基本單元 2.完整時序波形 三、W25Q64存儲芯片 1.芯片簡介 ?2.硬件電路引腳定義 ?3.芯片框圖 4.Flash操作注意事項 四、軟件SPI讀寫W25Q64 五、SPI通信外設 總結 聲明:學習筆記來自江科大自化協(xié)B站教

    2024年02月09日
    瀏覽(21)
  • 【STM32 CubeMX】SPI_Flash_W25Q64的操作方法

    【STM32 CubeMX】SPI_Flash_W25Q64的操作方法

    在嵌入式系統(tǒng)開發(fā)中,使用外部 SPI Flash 存儲器可以為 STM32 微控制器提供額外的存儲空間,以存儲程序代碼、配置數(shù)據(jù)等。W25Q64 是一款常見的 SPI Flash 存儲器,具有64Mb容量和SPI接口。本文將介紹如何使用 STM32 CubeMX 結合 SPI 庫與 W25Q64 SPI Flash 進行集成,以便在 STM32 微控制器上

    2024年02月22日
    瀏覽(23)
  • 【STM32 CubeMX】SPI W25Q64功能實現(xiàn)

    【STM32 CubeMX】SPI W25Q64功能實現(xiàn)

    SPI Flash 存儲器在嵌入式系統(tǒng)中扮演著重要角色,它可以為微控制器提供額外的存儲空間,并且具有快速的讀寫速度和較大的存儲容量。W25Q64 是一款常見的 SPI Flash 存儲器,容量為64Mb,采用 SPI 接口進行通信。在 STM32 微控制器上實現(xiàn)對 W25Q64 的功能使用,可以通過 STM32 CubeMX 和

    2024年02月22日
    瀏覽(18)
  • stm32(SPI讀寫W25Q18)

    stm32(SPI讀寫W25Q18)

    SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是一種 高速的,全雙工,同步 的通信總 線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,提 供方便,正是出于這種簡單易用的特性,越來越多的芯片集成了這種通信協(xié)議,比如 A

    2024年02月16日
    瀏覽(24)
  • STM32存儲左右互搏 SPI總線讀寫SD/MicroSD/TF卡

    STM32存儲左右互搏 SPI總線讀寫SD/MicroSD/TF卡

    SD/MicroSD/TF卡是基于FLASH的一種常見非易失存儲單元,由接口協(xié)議電路和FLASH構成。市面上由不同尺寸和不同容量的卡,手機領域用的TF卡實際就是MicroSD卡,尺寸比SD卡小,而電路和協(xié)議操作則是一樣。這里介紹STM32CUBEIDE開發(fā)平臺HAL庫SPI總線操作SD/MicroSD/TF卡的例程。 除了在硬件

    2024年04月12日
    瀏覽(18)
  • STM-32:SPI通信協(xié)議/W25Q64簡介—軟件SPI讀寫W25Q64

    STM-32:SPI通信協(xié)議/W25Q64簡介—軟件SPI讀寫W25Q64

    SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是美國摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規(guī)范,也是一種單片機外設芯片串行擴展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時間發(fā)送和接收數(shù)據(jù),SPI沒有定義速度限制,通常能達到甚

    2024年02月16日
    瀏覽(19)
  • 【STM32】軟件SPI讀寫W25Q64芯片

    【STM32】軟件SPI讀寫W25Q64芯片

    目錄 W25Q64模塊 W25Q64芯片簡介 硬件電路 W25Q64框圖 Flash操作注意事項 狀態(tài)寄存器 ?編輯 指令集?INSTRUCTIONS?編輯 ?編輯 SPI讀寫W25Q64代碼 硬件接線圖 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h W25Q64_Ins.h main.c 測試 SPI通信(W25Q64芯片簡介,使用SPI讀寫W25Q64存儲器芯片)? SPI通信文章:【

    2024年02月19日
    瀏覽(19)
  • STM32—SPI詳解入門(使用SPI通訊讀寫W25Q128模塊)

    STM32—SPI詳解入門(使用SPI通訊讀寫W25Q128模塊)

    目錄 一、SPI是什么 二、SPI物理架構 三、SPI工作原理 四、SPI工作模式 五、SPI相關寄存器介紹 六、SPI用到的結構體與函數(shù) 1.結構體 2.函數(shù) 七、W25Q128芯片 1.W25Q128介紹 2.W25Q128存儲架構 3.W25Q128常用指令 4.W25Q128狀態(tài)寄存器 5.W25Q128常見操作流程 八、實驗(使用SPI通訊讀寫W25Q128模塊

    2024年02月14日
    瀏覽(17)
  • STM32存儲左右互搏 SPI總線讀寫FRAM MB85RS2M

    STM32存儲左右互搏 SPI總線讀寫FRAM MB85RS2M

    在中低容量存儲領域,除了FLASH的使用,,還有鐵電存儲器FRAM的使用,相對于FLASH,F(xiàn)RAM寫操作時不需要預擦除,所以執(zhí)行寫操作時可以達到更高的速度,其主要優(yōu)點為沒有FLASH持續(xù)寫操作跨頁地址需要變換的要求。相比于SRAM則具有非易失性, 因此價格方面會高一些。MB85RS2M是

    2024年01月22日
    瀏覽(19)
  • STM32存儲左右互搏 SPI總線FATS文件讀寫SD/MicroSD/TF卡

    STM32存儲左右互搏 SPI總線FATS文件讀寫SD/MicroSD/TF卡

    SD/MicroSD/TF卡是基于FLASH的一種常見非易失存儲單元,由接口協(xié)議電路和FLASH構成。市面上由不同尺寸和不同容量的卡,手機領域用的TF卡實際就是MicroSD卡,尺寸比SD卡小,而電路和協(xié)議操作則是一樣。這里介紹STM32CUBEIDE開發(fā)平臺HAL庫SPI總線FATS文件操作讀寫SD/MicroSD/TF卡的例程。

    2024年04月25日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包