当前位置:首页 > stm32 W25Q64
.C文件
#include \
#include \
#include \
////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //W25Q64 代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/9 //版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved
//flash写入只能把1写成0,所以写入前应该先擦除
//////////////////////////////////////////////////////////////////////////////////
u16 SPI_FLASH_TYPE = W25Q64;//默认就是25Q64
//W25Q64一共8M容量
//分为128个快,每块大小为64K字节
//每块又可以分为16个扇区,每个扇区4K字节 //每次擦除最少一个扇区,也就是4K字节 //25Q64 一共有2048个扇区
//初始化SPI FLASH的IO口 void SPI_Flash_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE );//PORTB时钟使能
//W25Q64的片选
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PB12 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
//读取SPI_FLASH的状态寄存器
//BIT7 6 5 4 3 2 1 0 //SPR RV TB BP2 BP1 BP0 WEL BUSY //SPR:默认0,状态寄存器保护位,配合WP使用 //TB,BP2,BP1,BP0:FLASH区域写保护设置 //WEL:写使能锁定
//BUSY:忙标记位(1,忙;0,空闲) //默认:0x00
u8 SPI_Flash_ReadSR(void) { u8 byte=0; }
//写SPI_FLASH状态寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!! void SPI_FLASH_Write_SR(u8 sr)
{ SPI_FLASH_CS=0; //使能器件 }
SPI2_ReadWriteByte(W25X_WriteStatusReg); //发送写取状态寄存器命令 SPI2_ReadWriteByte(sr); //写入一个字节 SPI_FLASH_CS=1; //取消片选 SPI_FLASH_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_ReadStatusReg); //发送读取状态寄存器命令 byte=SPI2_ReadWriteByte(0Xff); //读取一个字节 SPI_FLASH_CS=1; //取消片选 return byte; SPI2_Init();
//初始化SPI
SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式 SPI_FLASH_TYPE = SPI_Flash_ReadID();//读取FLASH ID. //SD卡片选信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PD2 推挽 GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD,GPIO_Pin_2); //2.4G无线片选信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PG7 推挽 GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_7);
//SPI_FLASH写使能
//将WEL置位
void SPI_FLASH_Write_Enable(void) { SPI_FLASH_CS=0; //使能器件 SPI2_ReadWriteByte(W25X_WriteEnable); //发送写使能 SPI_FLASH_CS=1; //取消片选 }
//SPI_FLASH写禁止 //将WEL清零
void SPI_FLASH_Write_Disable(void)
{ SPI_FLASH_CS=0; //使能器件 SPI2_ReadWriteByte(W25X_WriteDisable); //发送写禁止指令 SPI_FLASH_CS=1; //取消片选 }
//读取芯片ID W25X16的ID:0XEF14 u16 SPI_Flash_ReadID(void) {
u16 Temp = 0; SPI_FLASH_CS=0;
SPI2_ReadWriteByte(0x90);//发送读取ID命令 SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00);
Temp|=SPI2_ReadWriteByte(0xFF)<<8; Temp|=SPI2_ReadWriteByte(0xFF); SPI_FLASH_CS = 1;
return Temp; }
//读取SPI FLASH
//在指定地址开始读取指定长度的数据 //pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535) //2^10=1024 1K=1024字节
//8M最大能读到2^23 也就是24位
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead) {
u16 i; SPI_FLASH_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_ReadData); //发送读取命令 SPI2_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址 SPI2_ReadWriteByte((u8)((ReadAddr)>>8)); SPI2_ReadWriteByte((u8)ReadAddr); for(i=0;i { pBuffer[i]=SPI2_ReadWriteByte(0XFF); //循环读数 } SPI_FLASH_CS=1; //取消片选 } //SPI在一页(0~65535)内写入少于256个字节的数据 //在指定地址开始写入最大256字节的数据 //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!! void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u16 i; SPI_FLASH_Write_Enable(); //SET WEL SPI_FLASH_CS=0; //使能器件 SPI2_ReadWriteByte(W25X_PageProgram); //发送写页命令 SPI2_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址 SPI2_ReadWriteByte((u8)((WriteAddr)>>8)); SPI2_ReadWriteByte((u8)WriteAddr); for(i=0;i SPI_FLASH_CS=1; //取消片选 SPI_Flash_Wait_Busy(); //等待写入结束 //无检验写SPI FLASH //必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败! //具有自动换页功能 //在指定地址开始写入指定长度的数据,但是要确保地址不越界! //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大65535) //每页256个字节 void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u16 YeSengYu; YeSengYu = 256-WriteAddr%6; //单页剩余的字节数 if(NumByteToWrite <= YeSengYu)
共分享92篇相关文档