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

📄 flash.c

📁 用LPC2132驱动SPI接口FLASH的c驱动程序
💻 C
字号:
/********************************************************************************
*                                                                               *
*                 ATML AT45DB021B FLASH 操作函数								*
*                      2007年4月28日调试成功									*
*                         编写:周思友											*
*********************************************************************************/
#include "flash.h"


uint8 DF_buffer[264];
uint8 DF_buffer2[264];
//OK FLASH RESET
void FlashReset (void)
{   
    uint8 i=255;
	DF_RST_0;
	while(i--);
	DF_RST_1;
	DF_wait_busy();
	
}
//OK往SPI口写一个字节的数据
uint8 write_SPI(uint8 byte)
{
	uint8 bit_ctr;
   	for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
   	{
          if (byte>=0x80)
            MOSI11_1; //Data=1;
          else
            MOSI11_0; //Date=0;
          byte=byte<<1;
          SCK11_1; //CLK1=1;
          byte |= MISO_IN;
          SCK11_0; //CLK1=0;
        }
    return(byte);           		  // return read uint8
}

//OK格式化主存储器以block(0~127)为单位删除所有页数据)
void DF_format(void)
{
	uint8 i;
	for (i=0;i<128;i++)      //循环擦除0~127总共128块
	{
		DF_wait_busy();
		DF_SELECT_1;
		write_SPI(BLOCK_ERASE);
		write_SPI(i>>4);
		write_SPI(i<<4);
		write_SPI(0x00);
		DF_DESELECT_1;
	}
}


//OK擦除指定的主存储器页(地址范围0-1023)
void DF_page_earse(uint32 page)
{
	DF_wait_busy();
	
	DF_SELECT_1;
	write_SPI(PAGE_ERASE);
	write_SPI((uint8)(page >> 7));
	write_SPI((uint8)(page << 1));
	write_SPI(0x00);
	DF_DESELECT_1;
	}


//OK将保存在数组DF_buffer[]中的一页数据写入第二缓冲区后送入主存储区
//(先擦除后写入模式,页地址范围0-1023)
void DF_write_page(uint32 page)
{
	uint32 i;	
	DF_wait_busy();
	DF_SELECT_1;
	write_SPI(BUFFER_2_WRITE);
	write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	for (i=0;i<264;i++)
		write_SPI(DF_buffer[i]);
	DF_DESELECT_1;	
	if (page<1024)
	{
		DF_SELECT_1;
		write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
		write_SPI((uint8)(page>>7));
		write_SPI((uint8)(page<<1));
		write_SPI(0x00);
		DF_DESELECT_1;
		DF_wait_busy();
	}
}


//OK将指定主存储器页的数据转入第一缓冲区后读出,保存在DF_buffer[]数组中
//(页地址范围0-1023)
void DF_read_page(uint32 page)
{
	uint32 i;	
	DF_wait_busy();
	DF_SELECT_1;
	write_SPI(MM_PAGE_TO_B1_XFER);
	write_SPI((uint8)(page >> 7));
    write_SPI((uint8)(page << 1));
    write_SPI(0x00);
	DF_DESELECT_1;
	
	DF_wait_busy();
	DF_SELECT_1;
	write_SPI(BUFFER_1_READ); 
	write_SPI(0x00);                        
	write_SPI(0x00);   
	write_SPI(0x00);        
	write_SPI(0x00);
	for (i=0;i<264;i++)
	{
		DF_buffer2[i]=write_SPI(0xFF);
	}
	DF_DESELECT_1;
}


//OK以直接读取方式读取指定的主存储器页数据(页地址范围0-1025)
void DF_mm_read_page(uint32 page)
{
	uint32 i;
	DF_wait_busy();
	DF_SELECT_1;
	write_SPI(MAIN_MEMORY_PAGE_READ);
	write_SPI((uint8)(page >> 7));
    write_SPI((uint8)(page << 1));
    write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	for (i=0;i<264;i++)
	{
		DF_buffer2[i]=write_SPI(0x00);
	}
	DF_DESELECT_1;
}


//OK读取状态寄存器
//	bit7		bit6	bit6	bit6	bit6	bit6	bit6		bit6
//RDY/BUSY		COMP	0		1		0		1		x	 		x	
uint8 DF_read_reg(void)
{
	uint8 temp;
	DF_SELECT_1;
	write_SPI(READ_STATE_REGISTER);
	write_SPI(0x00);
	write_SPI(0x00);                        
	temp=write_SPI(0x00);   
	temp=write_SPI(0x00);
	DF_DESELECT_1;
	return temp;
}


//OK检查状态寄存器最高位是否为忙,并等待空闲
void DF_wait_busy(void)
{
	uint8 state_reg=0x00;
	DF_SELECT_1;
	write_SPI(READ_STATE_REGISTER);
	write_SPI(0x00);
	write_SPI(0x00);                        
	write_SPI(0x00);
	while((state_reg&0x80) == 0)
	{
		state_reg=write_SPI(0x00);
	}
	DF_DESELECT_1;
}


//OK将指定主存储器页的数据转入指定缓冲区
void DF_mm_to_buf(uint8 buffer,uint32 page)
{
	DF_wait_busy();
	DF_SELECT_1;
	if (buffer==1)
		write_SPI(MM_PAGE_TO_B1_XFER);
	else
		write_SPI(MM_PAGE_TO_B2_XFER);
	write_SPI((uint8)(page >> 7));
    write_SPI((uint8)(page << 1));
    write_SPI(0x00);
	DF_DESELECT_1;
}


//OK读取指定缓冲区指定单元的数据,保存在DF_buffer[]数组中
uint8 DF_read_buf(uint8 buffer,uint32 start_address,uint32 length)
{
	uint32 i;
	if ((264-start_address)>=length)
	{
		DF_wait_busy();
		DF_SELECT_1;
		if (buffer==1)
			write_SPI(BUFFER_1_READ); 
		else
			write_SPI(BUFFER_2_READ);
		write_SPI(0x00);                        
		write_SPI((uint8)(start_address >> 8));   
		write_SPI((uint8)start_address);        
		write_SPI(0x00);
		for (i=0;i<length;i++)
		{
			DF_buffer2[i] =write_SPI(0xFF);
		}
		DF_DESELECT_1;
		return 1;
	}
	else
		return 0;
}


//OK将DF_buffer[]数组中指定长度的数据写入指定缓冲区
uint8 DF_write_buf(uint8 buffer,uint32 start_address,uint32 length)
{  
	uint32 i;
	if  ((264-start_address)>=length)
	{
		DF_wait_busy();
		DF_SELECT_1;
		if (buffer==1)
			write_SPI(BUFFER_1_WRITE);
		else
			write_SPI(BUFFER_2_WRITE);
		write_SPI(0x00);
		write_SPI((uint8)(start_address >> 8));   
		write_SPI((uint8)start_address);
		for (i=0;i<length;i++)
			write_SPI(DF_buffer[i]);
		DF_DESELECT_1;
		return 1;
	}
	else
		return 0;
}


//0K将指定缓冲区中的数据写入主存储区的指定页
void DF_buf_to_mm(uint8 buffer,uint32 page)
{
	DF_wait_busy();
	if (page<1024)
	{
		DF_SELECT_1;
		if (buffer==1)
			write_SPI(B1_TO_MM_PAGE_PROG_WITH_ERASE);
		else
			write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
		write_SPI((uint8)(page>>7));
		write_SPI((uint8)(page<<1));
		write_SPI(0x00);
		DF_DESELECT_1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -