完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我是新手,第一次接触flash存储器件,刚刚手里有一块W25Q64,不知道该如何下手,在网上搜索了一些资料,自己又研究了几天,一知半解的写了一个程序,请大家帮忙改改,最好能详细说明一下,让我好好学习一下,这个程序是要按键1(key1),写入数据,不知道我的这个连写两个程序是不是对,按键2(key2)读出两个地址数据,并让LED等点亮。W25Q64中文数据说明
http://wenku.baidu.com/view/8ce445620b1c59eef8c7b4ce.html ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************ #include #include #define uint unsigned int #define uchar unsigned char #define uint8 unsigned char #define uint16 unsigned int #define uint32 unsigned long #define W25P_writeenable 0x06 //写使能 #define W25P_writedisable 0x04 //写禁能 #define W25P_readstatusreg 0x05 //读状态寄存器 #define W25P_writestatusreg 0x01 //写状态寄存器 #define W25P_readdata 0x03 //读数据 #define W25P_fastreaddata 0x0b //快读 #define W25P_pageprogram 0x02 //页编程 #define W25P_sectorerase 0x20 //扇区擦除 #define W25P_chiperase 0xc7 //芯片擦除 #define W25P_powerdown 0xb9 //掉电 #define W25P_releasepowerdown 0xab //释放掉电 #define W25P_deviceID 0xab //器件ID #define W25P_manufactdeviceID 0x90 //制造器件ID #define W25P_jedecdeviceID 0x9f //JEDEC ID ***it key1=P2^0; ***it key2=P2^1; ***it key3=P2^2; ***it key4=P2^3; ***it led1=P1^0; ***it led2=P1^1; ***it led3=P1^2; ***it led4=P1^3; ***it HOLD=P3^0; ***it WP=P3^1; ***it CS=P3^2; ***it DI=P3^3; ***it DO=P3^4; ***it CLK=P3^5; void IO_send_byte(uchar out); uchar IO_get_byte(); void IO_wait_busy(); void IO_init(); uchar IO_read_statusreg(); void IO_write_statusreg(byte); void IO_write_enable(); void IO_powerdown(); void IO_releasepowerdown(); uchar IO_read_ID1(); uint IO_read_ID2(uchar ID_Addr); uchar IO_read_byte(uint32 DST_Addr); void IO_read_nbyte(uint32 DST_Addr,uchar nbyte_128); uchar IO_fastread_byte(uint32 Dst_Addr); void IO_fastread_nbyte(uint32 Dst_Addr,uchar nbyte_128); void IO_write_byte(uint32 Dst_Addr,uchar byte); void IO_write_byte(uint32 Dst_Addr,uchar nbyte_128); void IO_erase_chip(); void IO_erase_sector(uint32 Dst_Addr); void verify(uchar byte,uchar cor_byte); void IO_write_disable(); void trace(uchar *str,uchar len); uint IO_read_ID3(); uint8 Rxtemp; bit MYti; uint8 tx_buff[16]; uint8 upper_128[16]; bit rx_ok; #define nop() _nop_() void delay(uchar tt) { while(tt--); } void main() { uint j; uchar t; uint32 dizhi; IO_init(); for(;;) { if(key1==0) { IO_read_ID1(); IO_write_enable(); IO_erase_chip(); IO_write_byte(0x000000,0x01); //0x0000000地址写入0x01 IO_write_byte(0x000001,0x02); //0x0000001地址写入0x02 } if(key2==0) { dizhi=0x0000000; for(t=0;t<2;t++) { j=IO_read_byte(dizhi); dizhi++; if(j==0x01) led1=0; if(j==0x02) led2=0; } } } } /* ******************************** *********************************** 送出 *********************************** **********************************/ void IO_send_byte(uchar out) { uchar i=0; CS=0; for(i=0;i<8;i++) { if((out&0x80)==0x80) DI=1; else DI=0; CLK=1; out=(out<<1); nop(); nop(); nop(); nop(); CLK=0; } } /* ******************************** *********************************** 得到数据 *********************************** **********************************/ uchar IO_get_byte() { uchar i=0,in=0,temp=0; CS=0; for(i=0;i<8;i++) { in=(in<<1); temp=DO; CLK=1; if(temp==1); in |=0x01; CLK=0; } return in; } /* ******************************** *********************************** 等待忙结束 *********************************** **********************************/ void IO_Wait_Busy() { while(IO_read_statusreg()==0x03) IO_read_statusreg(); } /* ******************************** *********************************** SPI初始化 *********************************** **********************************/ void IO_init() { CLK=0; WP=1; CS=1; IO_write_disable(); //写禁能 } /* ******************************** *********************************** 读状态寄存器 *********************************** **********************************/ uchar IO_read_statusreg() { uchar byte=0; CS=0; IO_send_byte(W25P_readstatusreg); //发送读状态寄存器命令 0x05 byte=IO_get_byte(); //接收读状态寄存器数据值 CS=1; return byte; } /* ******************************** *********************************** 写状态寄存器 *********************************** **********************************/ void IO_write_statusreg(byte) { CS=0; IO_send_byte(W25P_writestatusreg); IO_send_byte(byte); CS=1; } /* ******************************** *********************************** 写使能 *********************************** **********************************/ void IO_write_enable() { CS=0; IO_send_byte(W25P_writeenable); //发送写使能命令 0x01 CS=1; } /* ******************************** *********************************** 掉电 *********************************** **********************************/ void IO_powerdown() { CS=0; IO_send_byte(W25P_powerdown); CS=1; delay(6); } /* ******************************** *********************************** 释放掉电 *********************************** **********************************/ void IO_releasepowerdown() { CS=0; IO_send_byte(W25P_releasepowerdown);//发送释放掉电命令 CS=1; delay(6); } /* ******************************** *********************************** 读取器件ID1 *********************************** **********************************/ uchar IO_read_ID1() { uchar byte; CS=0; IO_send_byte(W25P_deviceID); IO_send_byte(0); //发送3个伪地址 IO_send_byte(0); IO_send_byte(0); byte=IO_get_byte(); CS=1; delay(4); return byte; } /* ******************************** *********************************** 读取制造器件ID2 *********************************** **********************************/ uint IO_read_ID2(uchar ID_Addr) { uint IData16; CS=0; IO_send_byte(W25P_manufactdeviceID); IO_send_byte(0x00); IO_send_byte(0x00); IO_send_byte(ID_Addr); IData16=IO_get_byte()<<8; IData16|=IO_get_byte(); CS=1; return IData16; } /* ******************************** *********************************** 读JEDEC ID *********************************** **********************************/ uint IO_read_ID3() { uint IData16; CS=0; IO_send_byte(0x9f); IData16=IO_get_byte()<<8; IData16=IO_get_byte(); tx_buff[2]=IO_get_byte; CS=1; return IData16; } /* ******************************** *********************************** 读数据地址 *********************************** **********************************/ uchar IO_read_byte(uint32 Dst_Addr) { uchar byte=0; CS=0; IO_send_byte(W25P_readdata); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); byte=IO_get_byte; CS=1; return byte; } /* ******************************** *********************************** 读数据起始128个字节以内的内容 *********************************** **********************************/ void IO_read_nbyte(uint32 Dst_Addr,uchar nbytes_128) { uchar i=0; CS=0; IO_send_byte(W25P_readdata); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); for(i=0;i upper_128=IO_get_byte(); } CS=1; } /* ******************************** *********************************** 快读数据 *********************************** **********************************/ uchar IO_fastread_byte(uint32 Dst_Addr) { uchar byte=0; CS=0; IO_send_byte(W25P_fastreaddata); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); IO_send_byte(0xff); byte=IO_get_byte(); //发送8个虚拟字节 CS=1; return byte; } /* ******************************** *********************************** 快读数据起始128个字节以内的内容 *********************************** **********************************/ void IO_fastread_nbyte(uint32 Dst_Addr,uchar nbytes_128) { uchar i=0; CS=0; IO_send_byte(W25P_fastreaddata); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); IO_send_byte(0xff); for(i=0;i upper_128=IO_get_byte(); } CS=1; } /* ******************************** *********************************** 页编程 *********************************** **********************************/ void IO_write_byte(uint32 Dst_Addr,uchar byte) { CS=0; IO_write_enable(); IO_wait_busy(); CS=0; IO_send_byte(W25P_pageprogram); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); IO_send_byte(byte); CS=1; } /* ******************************** *********************************** 页编程128字节内容 *********************************** **********************************/ void IO_write_nbyte(uint32 Dst_Addr,uchar nbyte_128) { uchar byte,i; CS=0; IO_write_enable(); CS=0; IO_send_byte(W25P_pageprogram); IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16)); IO_send_byte((uchar)((Dst_Addr&0xffff)>>8)); IO_send_byte((uchar)(Dst_Addr&0xff)); for(i=0;i byte=upper_128; IO_send_byte(byte); } CS=1; } /* ******************************** *********************************** 芯片擦除 *********************************** **********************************/ void IO_erase_chip() { CS=0; IO_write_enable(); CS=0; IO_wait_busy(); CS=0; IO_send_byte(W25P_chiperase); CS=1; } /* ******************************** *********************************** 扇区擦除 *********************************** **********************************/ void IO_erase_sector(uint32 Dst_Addr) { CS=0; IO_write_enable(); CS=0; IO_send_byte(W25P_sectorerase); //擦除扇区 IO_send_byte((uchar)((Dst_Addr & 0xFFFFFF)>>16)); IO_send_byte((uchar)((Dst_Addr & 0xFFFF)>>8)); IO_send_byte((uchar)(Dst_Addr & 0xFF)); CS=1; } /* ******************************** *********************************** 判断 *********************************** **********************************/ void verify(uchar byte,uchar cor_byte) { if(byte!=cor_byte) { while(1); } } /* ******************************** *********************************** 写禁能 *********************************** **********************************/ void IO_write_disable() { CS=0; IO_send_byte(W25P_writedisable); CS=1; } /* ******************************** *********************************** 发送字符 *********************************** **********************************/ void myputchar(uchar c) { ES=0; SBUF=c; while(TI==0); TI=0; ES=1; } /* ******************************** *********************************** 查找指针 *********************************** **********************************/ void trace(uchar *str,uchar len) { uint i; { for(i=0;i myputchar(*str); str++; } } } |
|
相关推荐
6个回答
|
|
自己顶一下,程序有太多的问题,希望大家能认真帮忙分析一下!
|
|
|
|
没办法,只有自己在顶一下,谁让晚上人多呢
|
|
|
|
恩,哥们弄出来了没??
|
|
|
|
QQ 380636367 详聊
|
|
|
|
想了解一下。
|
|
|
|
顶下,最近可能也要用STC驱动W25Q64
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
846 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
820 浏览 0 评论
910 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1693 浏览 0 评论
1307 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12065 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 08:55 , Processed in 0.807875 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号