⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_drv.c

📁 adi bf54x 通过spi接口读取memory程序
💻 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 + -