先上效果图
代码
主程序
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "w25qxx.h"
int main(void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
uart_init(115200);
W25QXX_Init();
while(W25QXX_ReadID()!=W25Q16){
delay_ms(1000);
printf("未检测到W25Q16,请检查!\r\n");
}
while(1){
w25q16_SHUJU_CHULI();
}
}
w25qxx.c串口协议程序
#include "w25qxx.h"
#include "spi.h"
#include "delay.h"
#include "usart.h"
#define MINGLIN 1
#define DIZHI 2
#define SHUJU 3
u8 W25Q16_DATA[256];
u8 tishi_bit=9;
u8 r_w=0;
u8 state=MINGLIN;
u16 i=0;
u32 addr;
u8 datatemp[256];
u32 FLASH_SIZE=16*1024*1024;
void w25q16_RXBUF_HANDLE(void){
static u8 k=0;
u8 Res;
Res = USART_ReceiveData(USART1);
if(state==MINGLIN){
if(Res=='r'){
k=0;
r_w=1;
state=DIZHI;
}
else if(Res=='w'){
k=0;
r_w=2;
state=DIZHI;
}
}
else if(state==DIZHI){
W25Q16_DATA[k]=Res;
k++;
if(k==6){
k=0;
tishi_bit=1;
}
}
else if(state==SHUJU){
if(k>2){
if((Res=='=')&&(W25Q16_DATA[k-3]=='=')&&(W25Q16_DATA[k-2]=='=')&&(W25Q16_DATA[k-1]=='=')){
W25Q16_DATA[k-3]='\0';
tishi_bit=4;
k=0;
}
else{
W25Q16_DATA[k]=Res;
k++;
}
}
else{
W25Q16_DATA[k]=Res;
k++;
}
}
}
void w25q16_SHUJU_CHULI(void){
if(tishi_bit==9){
printf("请输入读或写指令与地址(000000--ffffff) { r000000或 w000000 }\r\n");
state=MINGLIN;
tishi_bit=0;
}
else if(tishi_bit==1){
addr |= ((u32)W25Q16_DATA[0]-48)<<20;
addr |= ((u32)W25Q16_DATA[1]-48)<<16;
addr |= ((u32)W25Q16_DATA[2]-48)<<12;
addr |= ((u32)W25Q16_DATA[3]-48)<<8;
addr |= ((u32)W25Q16_DATA[4]-48)<<4;
addr |= ((u32)W25Q16_DATA[5]-48);
if(r_w==1){
W25QXX_Read(W25Q16_DATA,addr,255);
printf("地址:%X处的数据为:\r\n\r\n",addr);
printf("%s\r\n\r\n",W25Q16_DATA);
tishi_bit=9;
r_w=0;
state=MINGLIN;
addr=0;
}
else if(r_w==2){
printf("请输入要在地址:%X 处写入的数据,并以四个“====”结束\r\n",addr);
tishi_bit=0;
r_w=0;
state=SHUJU;
}
}
else if(tishi_bit==4){
printf("已在地址:%X 处成功写入数据\r\n",addr);
W25QXX_Write(W25Q16_DATA,addr,255);
tishi_bit=9;
state=MINGLIN;
addr=0;
}
}
该串口协议程序现仅默认单次最大输入数据为255字节;且每次读取或写入W25QXX flash闪存芯片也默认为255字节;如需修改更大数据,请修改u8 W25Q16_DATA[256]数组缓存的大小,以及W25QXX_Write(W25Q16_DATA,addr,255) W25QXX_Read(W25Q16_DATA,addr,255) 两个函数最后的一个数值,代表写入数据量的大小
|