|
楼主 |
发表于 2017-3-29 20:07:28
|
显示全部楼层
#include"M25P32.H" #include"uart12.h" //***********延时函数********************//// void delay_spi( )//1us 11.0592 { _nop_(); } ///***********延时函数3ms************* void Delay3ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); i = 33; j = 66; do { while (--j); } while (--i); } //**/****** 延时函数300ms**** void Delay300ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 13; j = 156; k = 83; do { do { while (--k); } while (--j); } while (--i); } /////******初始化spi void int_spi() { CS=1; CLK=1; } /*******************发送一个字节**********************/ void send_spi(unsigned char dat) { unsigned char s=0,i; unsigned char temp=0; temp=dat; for(i=0;i<8;i++) { CLK=0; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); s=temp&0x80; if(s==0x80) DI=1; else DI=0; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); CLK=1; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); temp=temp<<1; } } /*****等待写入结束*****1 0 */ void waitwiriteEND(unsigned char state,unsigned int number) { unsigned int i; unsigned char addr; if(state==0)//等待模式 { for(i=0;i<number;i++) { CLK=0; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); CLK=1; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); } } else//检测忙 { if(state==2) { do { addr=read_sr(0x35); SendData(addr); } while(addr&0x80); } do { addr=read_sr(0x05); SendData(addr); } while(addr&0x01); } } //*****发送允许指令************* void write_sr() { CS=0; send_spi(WREN); /////写使能06 CS=1; } //**********读取一个字节********************/ unsigned char read_spi() { unsigned char i,data_read=0; for(i=0;i<8;i++) { data_read<<=1; CLK=0; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); CLK=1; delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); delay_spi( ); data_read=data_read|DO; ///看是否每一位输出数据 } return data_read; } //***读取寄存器******** unsigned char read_sr(unsigned char Send_Read_Reg_CMD) { unsigned char read_1; CS=0; send_spi(Send_Read_Reg_CMD ); read_1=read_spi(); return read_1; } //****写入多个字节***********/ void write_ye(u16 *P, u32 sendaddr,u8 j ) { unsigned char i; unsigned char FlashData,FlashData1; write_sr(); waitwiriteEND(1,0); CS=0; send_spi(PP); ///////页数据指令 // send_spi(WRSR ); send_spi((sendaddr&0xff0000)>>16); send_spi((sendaddr&0xff00)>>8); send_spi(sendaddr&0xff); Delay3ms(); for(i=0;i<j;i++) { FlashData = P[i]; // FlashData1 = P[i]>>8; // FlashData1 = P[i]>>8; send_spi(FlashData); // send_spi(FlashData1); } CS=1; Delay3ms(); } ///***********读取多个字节***********/ void read_data(u32 readaddr, u8 rx) { unsigned int i=0; unsigned char save_H,save_L; write_sr(); CS=0; send_spi(READ); ///读数据指令 send_spi((readaddr&0xff0000)>>16); send_spi((readaddr&0xff00)>>8); send_spi(readaddr&0xff); while(rx--) { // save_H=read_spi(); save_L=read_spi(); // atey[i]=save_L+save_H<<8 ; atey[i]=save_L; i++; } CS=1; } /*********扇区擦除***********/ void Erase_datac( u32 readAddr,unsigned char c_addr) { /********允许写入命令*******/ write_sr(); CS=0; send_spi( SE );//发送扇区擦除命令 if(c_addr==1) { send_spi((readAddr & 0xFF0000) >> 16);//地址1高 send_spi((readAddr & 0xFF00) >> 8);//地址2 send_spi(readAddr & 0xFF);//地址3低 } Delay3ms(); CS=1;//结束,关闭模块 // waitwiriteEND(2,0); Delay300ms(); // CMD_write_SR(0x00,0x00);//清除状态寄存器 } //*****读ID************************ void ccc() { unsigned int i; CS=0; send_spi(0x9f); waitwiriteEND(0,30); for(i=0;i<5;i++) { atey[i]=read_spi(); } CS=1; CS=0; send_spi(0xAB); for(i=5;i<10;i++) { atey[i]= read_spi(); } waitwiriteEND(0,30); CS=0; } |
|