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

📄 at45db041.c

📁 C8051F020读写AT45DB041的代码
💻 C
字号:


#include"AT45DB041.h"
#include<assert.h>
#include <stdio.h>               

/******************************************************************************************
*函数	名:  SPI0_WR

*描		述:  SPI接口模拟读写函数,发数据时,高位在前;

*出口参数 :  读SPI从器件的一个字节

*入口参数 :  wr_byt :主SPI 发送给从SPI器件的 数据

******************************************************************************************/
static uchar SPI_WR(uchar wr_byt)
{
	 uchar RDAT = 0xFF;
	
	 uchar CNT = 8;
	do
	{
		ClearAT45_SCK();

		if( wr_byt & 0x80 )
		 {
		    SetAT45_SI();
		 }
		 else
		 {
		 	ClearAT45_SI();	
		 } 	

		RDAT <<=1;
		
		SetAT45_SCK();

		wr_byt <<= 1;

		ClearAT45_SO();
				
		if( TestAT45_SO )
		{
			RDAT ++;			  
		}
	
	}while( --CNT );

	ClearAT45_SCK();
	return RDAT; 
	
} 

/******************************************************************************************
*函数	名:  ReadStatesReg

*描		述:  读AT45DB041的状态寄存器;

*出口参数 :  状态寄存器的值;

*入口参数 :  无;

******************************************************************************************/

static uchar ReadStatesReg( void )
{
    uchar i = 0x80;

    ClearAT45_CS();
	SPI_WR(0xd7);
 	i = SPI_WR(0);

	SetAT45_CS();

	return i; 
}


/******************************************************************************************
*函数	名:  Data_RDBuffer

*描		述:  从缓冲区读一个字节的数据

*出口参数 :  读到的字节

*入口参数 :  Buffer:读取的缓冲区;

			 adr :	缓冲区的地址

******************************************************************************************/
 /*
uchar Data_RDBuffer(uchar Buffer, uint addr )
{
	uchar *p = (uchar *)&addr;
	uchar a=0;
	volatile uchar BufferID = 0;

#if		DEBUG

	assert( addr  < 264 );

#endif

	
	BufferID = ( (Buffer == USE_BUFFER1)?READ_BUFFER1:READ_BUFFER2);
	
	
	ClearAT45_CS();
	
	
	SPI_WR (BufferID)  ; 
	
	SPI_WR (0)  ;        
	SPI_WR (*p)  ;  
	SPI_WR (*(p+1))  ;  
	
	SPI_WR (0x00)  ; 
	
	
	a = SPI_WR (0)  ;
	
	SetAT45_CS();
	
	return a;
	
}
*/
/******************************************************************************************
*函数	名:  Data_WRBuffer

*描		述:  向缓冲区写一个字节的数据

*出口参数 :  无

*入口参数 :  Buffer:缓冲区;

			 adr :	缓冲区的地址

			 byte_data:写入的字节

******************************************************************************************/
/*
void Data_WRBuffer(uchar Buffer, uint addr, uchar byte_data )
{
	uchar *p = (uchar *)&addr;
	volatile uchar BufferID = 0;
	
#if		DEBUG

	assert( addr  < 264 );

#endif


	BufferID = ( (Buffer == USE_BUFFER1)?WRITE_BUFFER1:WRITE_BUFFER2);
	
	ClearAT45_CS();
	
	SPI_WR (BufferID)  ;  
	
	SPI_WR (0)  ;    
	SPI_WR (*p)  ;     
	SPI_WR (*(p+1))  ;  
	
	SPI_WR (byte_data)  ;
	
	SetAT45_CS();

}
*/

/******************************************************************************************
*函数名称: SeriesWriteBufferData

*函数入参: uint addr:要写的地址,(要小于 264)
			uchar lenth: 写的字节长度
            uchar Buffer : 
			uchar *RdDate:	写入值的存放数组

*函数出参: 无  
*功能描述: 连续写BUFFER区 

******************************************************************************************/   
void SeriesWriteBufferData(uchar Buffer, uint addr,uint lenth, const uchar *byte_data )
{
	uchar BufferID = 0;
	uint i=0;

#if		DEBUG

	assert( ( addr < 264) && (( 264 -addr ) >= lenth) );

#endif

	
	BufferID = ( (Buffer == USE_BUFFER1)?WRITE_BUFFER1:WRITE_BUFFER2);
	
	
	ClearAT45_CS();
	
	SPI_WR (BufferID)  ;     //"发送写命令字 84:向 BUFF1 写入数据"

	SPI_WR (0)  ;         //"最高8位"
	SPI_WR ((uchar)(addr>>8))  ;   //"中间8位"
    SPI_WR((uchar)addr)  ;    //"最低8位 "

	
	for( i = lenth ; i >0; i--)
	{
	
	  SPI_WR(*byte_data)  ;	 
	
	  byte_data++;
	}
	
	
	SetAT45_CS();

}
/******************************************************************************************
*函数名称: SeriesRdBufferData
*函数入参: uint adr:要读的起始地址值;(要小于 528)
            uchar lenth: 读的字节长度
            uchar Buffer : 1:Buffer1 ,2: Buffer2 
			uchar *RdDate:	读到的值存放数组

*函数出参:  
*功能描述:连续读BUFFER 区的值 

******************************************************************************************/
void SeriesRdBufferData(uchar Buffer, uint addr,uint lenth,volatile uchar *RdDate )
{
    uint i=0;
    uchar BufferID = 0;

#if		DEBUG

	assert( ( addr < 264) && ( 264 -addr ) >= lenth );

#endif

	BufferID = ( (Buffer == USE_BUFFER1)?READ_BUFFER1:READ_BUFFER2);

  
    ClearAT45_CS();

    SPI_WR(BufferID)  ;  //"发送读命令字 D4:读BUFF1"

    SPI_WR(0)  ;         //"最高8位空"
    SPI_WR((uchar)(addr>>8))  ;       //" 6位空 + 2有效位"
    SPI_WR((uchar)addr)  ;    //"最低8有效位 "


    SPI_WR(0x00)  ;      //"发送空命令"

   for( i = lenth ; i >0; i--)
   {

	 *RdDate= SPI_WR(0)  ;	 //"读数据"

	 RdDate++;
   }

   SetAT45_CS();

}

/******************************************************************************************
*函数名称: WriteBufferDateToMainMerroy

*函数入参: uint MainMerroyAddr:要写的主存页,
			uchar Buffer : 1:Buffer1 ,2: Buffer2

*函数出参: 无  

*功能描述: 将 BUFF 中的数据 写到 主存的MainMerroyAddr页


******************************************************************************************/   
void WriteBufferDateToMainMerroy( uchar Buffer,uint MainMerroyAddr )
{
	uchar BufferID = 0;

#if		DEBUG

	assert( MainMerroyAddr < 2048);

#endif
	
	BufferID = ( (Buffer == USE_BUFFER1)?BUFFER1_TO_MAINPAGE_E:BUFFER2_TO_MAINPAGE_E);
	
	ClearAT45_CS();
	
	SPI_WR (BufferID)  ;     //"发送写命令字 将 BUFF 数据存入 主存 "
	
	SPI_WR ( (uchar )(MainMerroyAddr >> 7))  ;        
	SPI_WR ((uchar )(MainMerroyAddr << 1)) ;  

	SPI_WR (0)  ;             //"最低8位 "
	
	SetAT45_CS();
	while( (ReadStatesReg()&0x80) == 0 ) ; //"等待AT45空闲"

}
 /******************************************************************************************
*函数名称: ContinusReadMainMerroy	 

*函数入参: uint pAddr:要读的页地址
             uint add :要读的页内地址
			uint lenth: 要读的长度
			uchar *dat : 读出的数据存放数组

*函数出参:读从指定地址开始的 lenth长度的数据,存放在dat数组中  
*功能描述: 

*说    明:	通过 2007年6月1日
******************************************************************************************/  
void ContinusReadMainMerroy(uint pAddr,uint add,uint lenth,volatile uchar *dat)
{

	uint i = 0;

#if		DEBUG

	assert( (pAddr < 2048 ) && ( add <264 ) &&((264 -add) >= lenth) );

#endif

    ClearAT45_CS();

    SPI_WR (CONTINUES_READ)  ; 
	 
    SPI_WR ((uchar )( pAddr >> 7 ))  ; 
    
    SPI_WR ( (uchar )( (pAddr<<1) |  (add >>8))) ;  

    SPI_WR ((uchar )(add))  ;  

    SPI_WR (0)  ; 

	for( i = 0; i< lenth; i++)
	{
	  *(dat + i) = SPI_WR (0)  ; 

	}

    SetAT45_CS();
}

/******************************************************************************************
*函数名称: ChipEra

*函数入参: 无

*函数出参: 无

*功能描述: 擦除整个芯片

******************************************************************************************/  

void ChipEra(void )
{
	ClearAT45_CS();

	SPI_WR (0xc7)  ;  
	SPI_WR (0x94)  ;  
	SPI_WR (0x80)  ; 
	SPI_WR (0x9a)  ;  
	
	SetAT45_CS(); 
	while( (ReadStatesReg()&0x80) == 0 ) ;
}



⌨️ 快捷键说明

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