微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 SPI W25X16驱动

STM32 SPI W25X16驱动

时间:11-25 来源:互联网 点击:


while(NumberOfPage--)
{
User_SPI_W25X16_PageWrite(DataTable,WriteAddress,SPI_W25X16_PageSize);
DataTable+=SPI_W25X16_PageSize;
WriteAddress+=SPI_W25X16_PageSize;
}


if(NumberOfSingle != 0)
{
User_SPI_W25X16_PageWrite(DataTable,WriteAddress,NumberOfSingle);
}
}
}
}

void User_SPI_W25X16_ChipRead(u8 *DataTable,vu32 ReadAddress,vu16 NumberOfRead)
{
//虽然要发送地址,但是不需要说明有个写操作(I2C才是这样的时序)
SPI_W25X16_CS_Select;


User_SPI_W25X16_SendByte(ReadData);


User_SPI_W25X16_SendByte((ReadAddress & 0xff0000) >> 16); //最高8位地址
User_SPI_W25X16_SendByte((ReadAddress & 0xff00) >> 8); //中间8位
User_SPI_W25X16_SendByte(ReadAddress & 0xff); //最低8位


while(NumberOfRead--)
{
*DataTable = User_SPI_W25X16_SendByte(NoneCode);
DataTable++;
}


SPI_W25X16_CS_DisSelect;
}

vu32 User_SPI_W25X16_ReadID(void)
{
vu32 ID =0;
vu32 IDBuffer1=0;
vu32 IDBuffer2=0;
vu32 IDBuffer3=0;

SPI_W25X16_CS_Select;

User_SPI_W25X16_SendByte(JedecID);


IDBuffer1=User_SPI_W25X16_SendByte(NoneCode);//读取高位
IDBuffer2=User_SPI_W25X16_SendByte(NoneCode);//读取中位
IDBuffer3=User_SPI_W25X16_SendByte(NoneCode);//读取低位

SPI_W25X16_CS_DisSelect;

ID=(IDBuffer1<16)|(IDBuffer2<8)|IDBuffer3;

return ID;
}

vu32 User_SPI_W25X16_ReadDeviceID(void)
{
vu32 ID =0;
vu32 IDBuffer1=0;
vu32 IDBuffer2=0;
vu32 IDBuffer3=0;

SPI_W25X16_CS_Select;

User_SPI_W25X16_SendByte(ManufatureID);


IDBuffer1=User_SPI_W25X16_SendByte(NoneCode);//读取高位
IDBuffer2=User_SPI_W25X16_SendByte(NoneCode);//读取中位
IDBuffer3=User_SPI_W25X16_SendByte(NoneCode);//读取低位

SPI_W25X16_CS_DisSelect;

ID=(IDBuffer1<16)|(IDBuffer2<8)|IDBuffer3;

return ID;
}

void User_SPI_W25X16_StartReadSequence(vu32 ReadAddress)
{
SPI_W25X16_CS_Select;

User_SPI_W25X16_SendByte(ReadData);

User_SPI_W25X16_SendByte((ReadAddress & 0xff0000) >> 16); //最高8位地址
User_SPI_W25X16_SendByte((ReadAddress & 0xff00) >> 8); //中间8位
User_SPI_W25X16_SendByte(ReadAddress & 0xff); //最低8位

//SPI_W25X16_DisSelect;
}

void User_SPI_W25X16_PowerDown(void)
{
SPI_W25X16_CS_Select;

User_SPI_W25X16_SendByte(PowerDown);

SPI_W25X16_CS_DisSelect;
}

void User_SPI_W25X16_WakeUp(void)
{
SPI_W25X16_CS_Select;

User_SPI_W25X16_SendByte(WakeUp);

SPI_W25X16_CS_DisSelect;
}

user_spi_w25x16.h

//SPI FLASH chip W25X16 头文件

#ifndef _USER_SPI_W25X16_H
#define _USER_SPI_W25X16_H

#include"stm32f10x.h"

typedef enum{Failed=0,Successed=!Failed}TestStatus; //声明定义枚举型变量 用于表示测试失败与成功

#define SPI_W25X16_SectorSize4096
#define SPI_W25X16_PageSize256//W25X16每页数据长度
#define SPI_W25X16_PerPageWriteSize256//每页最多写入的数据个数

#define SPI_W25X16SPI1
#define SPI_W25X16_ClockRCC_APB2Periph_SPI1

#define SPI_W25X16_CS_ClockRCC_APB2Periph_GPIOC
#define SPI_W25X16_CS_PortGPIOC
#define SPI_W25X16_CS_PinGPIO_Pin_4

#define SPI_W25X16_SCK_ClockRCC_APB2Periph_GPIOA
#define SPI_W25X16_SCK_PortGPIOA
#define SPI_W25X16_SCK_PinGPIO_Pin_5

#define SPI_W25X16_MISO_Clock RCC_APB2Periph_GPIOA
#define SPI_W25X16_MISO_PortGPIOA
#define SPI_W25X16_MISO_PinGPIO_Pin_6

#define SPI_W25X16_MOSI_ClockRCC_APB2Periph_GPIOA
#define SPI_W25X16_MOSI_PortGPIOA
#define SPI_W25X16_MOSI_PinGPIO_Pin_7

#define SPI_24G_CS_ClockRCC_APB2Periph_GPIOB
#define SPI_24G_CS_PortGPIOB
#define SPI_24G_CS_PinGPIO_Pin_2

#define SPI_VS1003B_CS_ClockRCC_APB2Periph_GPIOB
#define SPI_VS1003B_CS_PortGPIOB
#define SPI_VS1003B_CS_PinGPIO_Pin_0

#define SPI_W25X16_CS_SelectGPIO_ResetBits(SPI_W25X16_CS_Port,SPI_W25X16_CS_Pin)

#define SPI_W25X16_CS_DisSelectGPIO_SetBits(SPI_W25X16_CS_Port,SPI_W25X16_CS_Pin)

u8 User_SPI_W25X16_SendByte(u8 SendByteData) ;//send data that is byte
u8 User_SPI_W25X16_ReadByte(void); //Read ByteData from chip W25X16
vu16 User_SPI_W25X16_SendHalfWord(u16 HalfWord) ;//send data ,is halfword
void User_SPI_W25X16_WriteEnable(void); //write enable for W25X16
void User_SPI_W25X16_WaitForWriteEnd(void); //wait the end about write for chip W25X16

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top