(2)创建w25q128.c并输入以下代码。
/*********************************************************************************************************
FLASH 驱 动 程 序
*********************************************************************************************************/
#include 'w25q128.h'
#include 'delay.h'
/***************************************************
Name :SPI2_SetSpeed
Function :SPI2速度设置函数
Paramater :
SpeedSet:0~7
Return :None
***************************************************/
void SPI2_SetSpeed( u8 SpeedSet )
{
SpeedSet &= 0x07 ; //限制范围
SPI2->CR1 &= 0xFFC7 ;
SPI2->CR1 |= SpeedSet<<3 ; //设置SPI2速度
SPI2->CR1 |= 1<<6 ; //SPI设备使能
}
/***************************************************
Name :SPI2_ReadWriteByte
Function :SPI2读写一个字节
Paramater :
TxData:要写入的字节
Return :读取到的字节
***************************************************/
u8 SPI2_ReadWriteByte( u8 TxData )
{
u16 retry=0;
//等待发送区空
while( ( SPI2->SR&0x02 )==0 )
{
retry ++ ;
//超时退出
if( retry>=0xFFFE )
return 0 ;
}
SPI2->DR = TxData ; //发送一个byte
//等待接收完一个byte
retry = 0 ;
while( ( SPI2->SR&0x01 )==0 )
{
retry ++ ;
//超时退出
if( retry>=0xFFFE )
return 0 ;
}
return SPI2->DR ; //返回收到的数据
}
/***************************************************
Name :W25QXX_Init
Function :初始化W25Q128芯片
Paramater :None
Return :None
***************************************************/
void W25QXX_Init()
{
RCC->APB2ENR |= 1<<3 ; //PORTB时钟使能
GPIOB->CRH &= 0x0000FFFF ;
GPIOB->CRH |= 0xBBB30000 ; //PB12推挽输出+PB13/14/15复用
GPIOB->ODR |= 0x7<<13 ; //PB13/14/15上拉
W25QXX_CS = 1 ; //SPI FLASH不选中
//初始化SPI
RCC->APB1ENR |= 1<<14 ; //SPI2时钟使能
SPI2->CR1 |= 0<<10 ; //全双工模式
SPI2->CR1 |= 1<<9 ; //软件nss管理
SPI2->CR1 |= 1<<8 ;
SPI2->CR1 |= 1<<2 ; //SPI主机
SPI2->CR1 |= 0<<11 ; //8bit数据格式
SPI2->CR1 |= 1<<1 ; //空闲模式下SCK为1 CPOL=1
SPI2->CR1 |= 1<<0 ; //数据采样从第二个时间边沿开始,CPHA=1
//对SPI2属于APB1的外设.时钟频率最大为36M
SPI2->CR1 |= 3<<3 ; //Fsck=Fpclk1/256
SPI2->CR1 |= 0<<7 ; //MSBfirst
SPI2->CR1 |= 1<<6 ; //SPI设备使能
SPI2_ReadWriteByte( 0xFF ) ; //启动传输
SPI2_SetSpeed( SPI_SPEED_2 ) ; //设置为18M时钟,高速模式
}
/***************************************************
Name :W25QXX_Wait_Busy
Function :等待空闲
Paramater :None
Return :None
***************************************************/
void W25QXX_Wait_Busy()
{
u8 byte=0 ;
// 等待BUSY位清空
do
{
W25QXX_CS = 0 ; //使能器件
SPI2_ReadWriteByte( W25X_ReadStatusReg ) ; //发送读取状态寄存器命令
byte = SPI2_ReadWriteByte( 0xFF ) ; //读取一个字节
W25QXX_CS = 1 ; //取消片选
}while( ( byte&0x01 )==0x01 ) ;
}
/***************************************************
Name :W25QXX_Erase_Chip
Function :擦除整个芯片
Paramater :None
Return :None
***************************************************/
void W25QXX_Erase_Chip()
{
W25QXX_CS = 0 ; //使能器件
SPI2_ReadWriteByte( W25X_WriteEnable ) ; //发送写使能
W25QXX_CS = 1 ; //取消片选
W25QXX_Wait_Busy() ;
W25QXX_CS=0 ; //使能器件
SPI2_ReadWriteByte( W25X_ChipErase ) ; //发送片擦除命令
W25QXX_CS = 1 ; //取消片选
W25QXX_Wait_Busy() ; //等待芯片擦除结束
}
/***************************************************
Name :W25QXX_Erase_Sector
Function :擦除一个扇区
Paramater :
Address:扇区地址
Return :None
***************************************************/
void W25QXX_Erase_Sector( u32 Address )
{
Address *= 4096 ;
W25QXX_CS = 0 ; //使能器件
SPI2_ReadWriteByte( W25X_WriteEnable ) ; //发送写使能
W25QXX_CS = 1 ; //取消片选
W25QXX_Wait_Busy();
W25QXX_CS = 0 ; //使能器件
SPI2_ReadWriteByte( W25X_SectorErase ) ; //发送扇区擦除指令
SPI2_ReadWriteByte( ( u8 )( Address>>16 ) ) ; //发送24bit地址
SPI2_ReadWriteByte( ( u8 )( Address>>8 ) ) ;
SPI2_ReadWriteByte( ( u8 )Address ) ;
W25QXX_CS = 1 ; //取消片选
上一篇:基于STM32F4x9的LCD显示设计
下一篇:STM32入门学习笔记之外置FLASH读写实验(上)
推荐阅读最新更新时间:2024-11-17 13:59
设计资源 培训 开发板 精华推荐
- LT3695EMSE 演示板、1A 容错微功率降压型稳压器
- 【奇怪的PCB又增加了】基于LM399的电压基准
- 用于线路瞬态响应的 LR8 高输入电压线性稳压器的典型应用
- LT3692AIUH、3.3V 和 1.8V 2 级双路降压多频转换器的典型应用电路
- LM358EDR2G 双四路滤波器运算放大器的典型应用
- AM2G-2409DH30Z ±9V 2 瓦 DC-DC 转换器的典型应用,适用于开/关控制应用
- 具有宽范围 VDD 输入的 LTC2945HUD-1 宽范围电源监视器的典型应用
- AN2820:使用中密度 STM32F103xx MCU 驱动双极步进电机
- AND8159/D, 使用压扩器NE570/SA571进行快起慢速硬限幅器的应用电路
- Arduino nano Type-C 最小系统板(已验证)