标题:
STM32RCt6 SPI与W25Q16源程序
[打印本页]
作者:
IceHowe
时间:
2019-7-19 18:23
标题:
STM32RCt6 SPI与W25Q16源程序
#include "w25qxx.h"
#include "spi.h"
#include "delay.h"
#include "usart.h"
u16 W25QXX_TYPE=W25Q16; //默认是W25Q16
//初始化SPI FLASH的IO口 SPI CS PA2
void W25QXX_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PA2 推挽
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
W25QXX_CS=1; //SPI FLASH不选中
SPI2_Init(); //初始化SPI
SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
W25QXX_TYPE=W25QXX_ReadID();//读取FLASH ID.
}
//读取W25QXX的状态寄存器
//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 W25QXX_ReadSR(void)
{
u8 byte=0;
W25QXX_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_ReadStatusReg); //发送读取状态寄存器命令
byte=SPI2_ReadWriteByte(0Xff); //读取一个字节
W25QXX_CS=1; //取消片选
return byte;
}
//写W25QXX状态寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!
void W25QXX_Write_SR(u8 sr)
{
W25QXX_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_WriteStatusReg);//发送写取状态寄存器命令
SPI2_ReadWriteByte(sr); //写入一个字节
W25QXX_CS=1; //取消片选
}
//W25QXX写使能
//将WEL置位
void W25QXX_Write_Enable(void)
{
W25QXX_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_WriteEnable); //发送写使能
W25QXX_CS=1; //取消片选
}
//W25QXX写禁止
//将WEL清零
void W25QXX_Write_Disable(void)
{
W25QXX_CS=0; //使能器件
SPI2_ReadWriteByte(W25X_WriteDisable); //发送写禁止指令
W25QXX_CS=1; //取消片选
}
复制代码
#include "w25qxx.h"
#include "spi.h"
#include "usart.h"
#include "key.h"
#include "delay.h"
#include "led.h"
#define SIZE sizeof(key0)
int main(void)
{
u32 FLASH_SIZE=16*1024*1024;//2M字节
const u8 key0[]={"按下KEY0"};
const u8 key1[]={"按下KEY1"};
u8 data[SIZE];
u8 key;
KEY_Init();
delay_init();
LED_Init();
W25QXX_Init();
uart_init(115200);
while(W25QXX_ReadID()!=W25Q16) //检测不到W25Q16
{
printf("未检测到W25Q16\n");
delay_ms(1000);
}
if(W25QXX_ReadID()==W25Q16)
{
printf("检测到W25Q16\n");
}
W25QXX_Erase_Chip();
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
W25QXX_Write((u8*)key0,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据
printf("%s\n","存储内容为:按下KEY0");
PAout(8)=!PAout(8);
}
else if(key==KEY1_PRES)
{
W25QXX_Write((u8*)key1,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据
printf("%s\n","存储内容为:按下KEY1");
PDout(2)=!PDout(2);
}
else if(key==WKUP_PRES)
{
W25QXX_Read(data,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,读出SIZE个字节
printf("读取成功,内容为:%s\n",data);
PAout(8)=!PAout(8);
PDout(2)=!PDout(2);
}
else
{
delay_ms(10);
}
}
}
复制代码
全部资料51hei下载地址:
SPI_Flash.7z
(185.11 KB, 下载次数: 87)
2019-7-20 03:32 上传
点击文件名下载附件
完整工程代码
下载积分: 黑币 -5
(新版)MINI-STM32--原理图M.pdf
(351.44 KB, 下载次数: 39)
2019-7-19 18:19 上传
点击文件名下载附件
STM32RCt6原理图
下载积分: 黑币 -5
作者:
jzdcff
时间:
2019-7-31 12:34
你好,在实际用的时候大部分存储读写的是 32位整数,读写函数只能按照8位传输,请问改如何实现32位整数的读写保存。
作者:
ppnnwst
时间:
2021-11-10 09:54
nihao,id读取不对怎么办
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1