📄 flash_drv.c
字号:
#include "spi.h"#include "type.h"#include "flash_Drv.h"#include <cdefBF549.h> unsigned char test_buff[528]; unsigned char temp_buff[528];//读取flash状态uint8 read_stat_reg(void){ uint8 i; SPIflash_CLR(); spi_byte_rw(0xd7); i = spi_byte_rw(0xff); i = spi_byte_rw(0xff);// *pSPI0_FLG |= FLG2;
SPIflash_SEL(); return i;}//读取MEMORY页地址数据////////////////////////////////////////////////////////int main_memory_page_read(uint32 byte_addr,uint32 count, uint8 *buff) //按字节寻址,读出指定的字节数{ int addr = byte_addr; uint32 i = 0; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0xD2);//send opcode addr &= 0x0003fffff;//get page address spi_byte_rw( ((uint8 *)&addr)[2] );//send 24 address bit spi_byte_rw( ((uint8 *)&addr)[1] ); spi_byte_rw( ((uint8 *)&addr)[0] ); //send 32 don't care bit i =spi_byte_rw(0xff); i =spi_byte_rw(0xff); i =spi_byte_rw(0xff); i =spi_byte_rw(0xff); i =spi_byte_rw(0xff); for(i=0;i<count;i++) buff[i] = spi_byte_rw(0xff); SPIflash_SEL(); delay(100); return 0;}//读取BUFFER1/////////////////////////////////////////////////int read_buffer1(uint32 byte_addr, uint8 *buff){ int addr = byte_addr; uint32 i = 0; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0xD4);//send opcode,opcode 0x56 for another buffer addr &= 0x000003ff;//start ram buffer address spi_byte_rw( ((uint8 *)&addr)[2] );//send 15bit don't care bit spi_byte_rw( ((uint8 *)&addr)[1] );//send 9bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); spi_byte_rw(0x00); //1 Dummy Byte i = spi_byte_rw(0xff); //空读,datashtt上没有 for(i=0;i<512;i++) { buff[i] = spi_byte_rw(0xff); } SPIflash_SEL(); delay(100); return 0;}//从memory 读数到buffer /////////////////////////////////////////////////////int main_memory_to_buffer1_transfer(uint32 page_addr){ uint32 i = 0; uint32 addr = page_addr<<10; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x53);//send opcode ,0x55 for another buffer addr &= 0x003ffc00; spi_byte_rw( ((uint8 *)&addr)[2] );//send 11bit address and 9bit don't spi_byte_rw( ((uint8 *)&addr)[1] );//care bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); SPIflash_SEL(); delay(100); return 0;}//比较BUFFERint compare_buffer1(uint32 page_addr){ int retval = -1; uint32 addr = page_addr<<10; int i = 0; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x60);//send opcode ,0x61 for another buffer addr &= 0x003ffc00; spi_byte_rw( ((uint8 *)&addr)[2] );//send 11bit address and 9bit don't spi_byte_rw( ((uint8 *)&addr)[1] );//care bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); SPIflash_SEL(); // retval = spi_byte_rw(0xff); delay(200); retval = read_stat_reg(); retval = retval>>6; return (retval & 0x1); //相同返回0,不同返回1}///////////////////////////////////////////////int write_buffer1(uint32 byte_addr, uint8 *buff){ uint32 i = 0; uint32 addr = byte_addr; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x84);//send opcode ,0x87 for another buffer addr &= 0x000003ff; //选用512字节地址 spi_byte_rw( ((uint8 *)&addr)[2] );//send 11bit address and 9bit don't spi_byte_rw( ((uint8 *)&addr)[1] );//care bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); for(i=0;i<528;i++) spi_byte_rw(buff[i]); SPIflash_SEL(); delay(100); return 0;}int buffer1_to_main_memory_page_program(uint32 page_addr){ uint32 i = 0; uint32 addr = page_addr<<10; while(!(read_stat_reg()&0x80)); delay(200); SPIflash_CLR(); spi_byte_rw(0x83);//send opcode ,0x86 for another buffer addr &= 0x003ffc00;//选用512字节地址 spi_byte_rw( ((uint8 *)&addr)[2] );//send 11bit address and 9bit don't spi_byte_rw( ((uint8 *)&addr)[1] );//care bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); SPIflash_SEL(); delay(100); return 0;}program_through_buffer_byte(uint32 byte_addr,uint32 count, uint8 *buff){ uint32 i = 0; uint32 addr = byte_addr; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x82);//send opcode ,0x83 for another buffer addr &= 0x003fffff; //选用528字节地址 spi_byte_rw( ((uint8 *)&addr)[2] );//send 11bit address and 9bit don't spi_byte_rw( ((uint8 *)&addr)[1] );//care bit address bit spi_byte_rw( ((uint8 *)&addr)[0] ); for (i=0; i<count; i++) spi_byte_rw(buff[i]); SPIflash_SEL(); delay(100); return 0; }int load_flash(uint8 *buffer, unsigned int load_lenth){ int i,j,flag = 1; for(i=0;i<((load_lenth/528)+1);i++) { for(j=0; j<528; j++) temp_buff[j] = buffer[j+i*528]; write_buffer1(0,temp_buff); buffer1_to_main_memory_page_program(i); read_buffer1(0,test_buff); flag = compare_buffer1(i); if(flag&0x1) printf("Compare Buffer Error!\n");
else printf("Compare Buffer OK!\n"); }}unsigned int read_id(void){ unsigned int id = 0; int i = 0; while(!(read_stat_reg()&0x80)); delay(100);
SPIflash_CLR();
spi_byte_rw(0x9f); i = spi_byte_rw(0xff); id = spi_byte_rw(0xff)<<24; id |= spi_byte_rw(0xff)<<16; id |= spi_byte_rw(0xff)<<8; id |= spi_byte_rw(0xff);
SPIflash_SEL(); delay(100); return id;}void chip_erase(void){ unsigned char i=0; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0xc7); spi_byte_rw(0x94); spi_byte_rw(0x80); spi_byte_rw(0x9a); SPIflash_SEL(); delay(100); return 0; }void block_erase(unsigned int block){ unsigned char i=0; int addr = block<<13; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x50); addr &= 0x003fe000;//get page address spi_byte_rw( ((uint8 *)&addr)[2] );//send 24 address bit spi_byte_rw( ((uint8 *)&addr)[1] ); spi_byte_rw( ((uint8 *)&addr)[0] ); SPIflash_SEL(); delay(100); return 0; }void page_erase(unsigned int page){ unsigned char i=0; int addr = page<<10; while(!(read_stat_reg()&0x80)); delay(100); SPIflash_CLR(); spi_byte_rw(0x81); addr &= 0x003ffc00;//get page address spi_byte_rw( ((uint8 *)&addr)[2] );//send 24 address bit spi_byte_rw( ((uint8 *)&addr)[1] ); spi_byte_rw( ((uint8 *)&addr)[0] ); SPIflash_SEL(); delay(100); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -