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

📄 flash.c.bak

📁 一个基于pic单片机的外部flash <SST_SST25VF016B>的驱动代码
💻 BAK
📖 第 1 页 / 共 3 页
字号:
unsigned char	SPI_WRITE_BYTE(unsigned long lAddr,unsigned char inch)
{
		unsigned char	 cTemp;
		unsigned char	 NACK;

		SPI_WREN();

		cTemp	=	SPI_READ_STATUS();

		if(!(cTemp&WEL_ON))
		{
			return  0;
		}

		NACK	=	0xff;
		while(NACK--)
		{
			SPI_WREN();
			cTemp	=SPI_READ_STATUS();
			if(!(cTemp&BUSY_ON))
			{
				break;
			}
			else
			{
				delay_ms(1);
			}	
		}

		if(!NACK)
		{
			return  0;
		}
		
		CE_LOW;	
		CLK_LOW;
		
		WAIT_TBF;	
		SPI2BUF		=	SST_WBYTE;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffffff) >> 16;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffff) >> 8;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	lAddr&0xff;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;


		SPI2BUF		=	inch;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		CLK_HIG;
		CE_HIG;	
		return  1;
}
unsigned char	SPI_READ_BYTE(unsigned long lAddr)
{
		unsigned char	 cTemp;


		CE_LOW;	
		CLK_LOW;
	
		WAIT_TBF;	
		SPI2BUF		=	SST_RBYTE;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffffff) >> 16;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffff) >> 8;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	lAddr&0xff;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		
		SPI2BUF		=	WRITE_NULL;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;
		
		CLK_HIG;
		CE_HIG;	
		return cTemp;
}
void	SPI_HISPEED_READ(unsigned long	lAddr,unsigned int leng,unsigned char *buf)
{

		unsigned char	 cTemp;
		unsigned int	 loop;


		CE_LOW;	
		CLK_LOW;
	
		WAIT_TBF;	
		SPI2BUF		=	SST_RBYTE;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffffff) >> 16;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF   = (lAddr&0xffff) >> 8;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	lAddr&0xff;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		for(loop	=	0;	loop	<leng;loop++)
		{
			SPI2BUF		=	WRITE_NULL;
			WAIT_TBF;		
			WAIT_RBF;
			buf[loop]	=	SPI2BUF;
		}
		
		CLK_HIG;
		CE_HIG;	
		return ;
}








/************************************************************************/
/* PROCEDURE: Read_Status_Register										*/
/*																		*/
/* This procedure read the status register and returns the byte.		*/
/*																		*/
/* Input:																*/
/*		None															*/
/*																		*/
/* Returns:																*/
/*		byte															*/
/************************************************************************/

/************************************************************************/
/* PROCEDURE: Wait_Busy													*/
/*																		*/
/* This procedure waits until device is no longer busy (can be used by	*/
/* Byte-Program, Sector-Erase, Block-Erase, Chip-Erase).				*/
/*																		*/
/* Input:																*/
/*		None															*/
/*																		*/
/* Returns:																*/
/*		Nothing															*/
/************************************************************************/

/************************************************************************/
/* PROCEDURE: Chip_Erase												*/
/*																		*/
/* This procedure erases the entire Chip.								*/
/*																		*/
/* Input:																*/
/*		None															*/
/*																		*/
/* Returns:																*/
/*		Nothing															*/
/************************************************************************/

/************************************************************************/
/* PROCEDURE: Sector_Erase									            */
/*																		*/
/* 擦除整条记录                                                         */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,  												     	*/
/*																		*/
/* Returns:																*/
/*		Nothing													        */
/************************************************************************/

/************************************************************************/
/* PROCEDURE: ReadECG_To_Buffer									        */
/*																		*/
/* 获得指定页数据记录的某个ECG数据                                      */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,  point													*/
/*																		*/
/* Returns:																*/
/*		Byte													        */
/************************************************************************/
unsigned char Read_ECG_Point(unsigned long Index,unsigned long point)
{ 
    unsigned  char  Byte;
    volatile unsigned  long  adr=0; 
    unsigned  long  NewIndex;
    NewIndex=Index<<1;
    adr	=NewIndex<<12;	
    adr =adr|point;   
    Byte = SPI_READ_BYTE(adr) ;
    return Byte;
}
/************************************************************************/
/* PROCEDURE: Record_Info_To_Buffer										*/
/*																		*/
/* 获得指定页数据记录的目录信息    并保存到 Record_Info_Buf             */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index															*/
/*																		*/
/* Returns:																*/
/*		Record_Info_Buf													*/
/************************************************************************/
void Read_Record_Info_To_Buffer(unsigned long Index)
{
    unsigned  char  tmp;
    unsigned  int   i,j=0;
    volatile unsigned  long  adr=0;
    unsigned  long  NewIndex;
    NewIndex = (Index<<1)+1;
    adr	=NewIndex<<12;	
    adr =adr|0xDAC;  
    for(i=0;i<16;i++)
    {
         tmp= SPI_READ_BYTE(adr);
         Record_Info_Buf[j++]=tmp;
         adr++;
    }
    mov_buf_to_record();
}
/************************************************************************/
/* PROCEDURE: Read_Index_Info_To_Buffer									*/
/*																		*/
/* 获得指定页数据记录的目录信息    并保存到 Index_Info_Buf              */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index															*/
/*																		*/
/* Returns:																*/
/*		Index_Info_Buf													*/
/************************************************************************/
void Read_Index_Info_To_Buffer(unsigned long Index)
{
    unsigned  char  tmp;
    unsigned  int   i,j=0;
    unsigned  long  adr=0;
    adr	=	Index<<12;	

    for(i=0;i<MAX_Records+1;i++)
    {
         tmp= SPI_READ_BYTE(adr);
         Index_Info_Buf[j++]=tmp;
         adr++;
    }  
}
/************************************************************************/
/* PROCEDURE: Read_Setup_Info_To_Buffer									*/
/*																		*/
/* 获得指定页数据记录的目录信息    并保存到 Index_Info_Buf              */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index															*/
/*																		*/
/* Returns:																*/
/*		Index_Info_Buf													*/
/************************************************************************/
void Read_Setup_Info_To_Buffer(unsigned long Index)
{
    unsigned  char  tmp;
    unsigned  int   i,j=0;
    unsigned  long  adr=0; 
    adr	=	Index<<12;	  
    for(i=0;i<30;i++)
    {
         tmp= SPI_READ_BYTE(adr);
         Setup_Info_Buf[j++]=tmp;         
         adr++;
    }
    mov_buf_to_setup();
}
/************************************************************************/
/* PROCEDURE: Write_ECG_Point										    */
/*																		*/
/* 一次往指定位置存两个ECG数据                                          */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,point,Data1,Data2										*/
/*																		*/
/* Returns:																*/
/*		Nothing													        */
/************************************************************************/
void Write_ECG_Point(unsigned long Index,unsigned long point,unsigned  char  Data1,unsigned  char  Data2)
{
    volatile unsigned  long  adr=0; 
    unsigned  long  NewIndex;
    NewIndex=Index<<1;
    adr	= NewIndex<<12;	
    adr =adr|point;   
    SPI_WRITE_BYTE(adr,Data1);  
}
/************************************************************************/
/* PROCEDURE: Write_Record_Buf										    */
/*																		*/
/* 将记录信息存到对应的扇区                                             */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,Record_Info_Buf										    */
/*																		*/
/* Returns:																*/
/*		Nothing													        */
/************************************************************************/
void Write_Record_Buf(unsigned long Index)
{
    volatile unsigned  long  adr=0; 
    unsigned  char i,j=0;
    unsigned  long  NewIndex;
	
	unsigned long my;

	my = Index;

    NewIndex  = (my<<1)+1;
	//Sector_Erase(NewIndex);
    adr	=	NewIndex<<12;
	delay_ms(1000);
    adr =adr|0xDAC;   
    mov_record_to_buf();
	delay_ms(1000);
    for(i=0;i<16;i++)
    {  
        SPI_WRITE_BYTE(adr,Record_Info_Buf[j++]);
		delay_ms(1);  
        adr++;  
    }   

/*	NewIndex = (my<<1)+1;
    adr	=NewIndex<<12;	
    adr =adr|0xDAC;  
    for(i=0;i<16;i++)
    {
         tmp= SPI_READ_BYTE(adr);
         Record_Info_Buf[j++]=tmp;
         adr++;
    }
    mov_buf_to_record(); */
}

/************************************************************************/
/* PROCEDURE: Write_Index_Buf										    */
/*																		*/
/* 将索引信息存到指定的扇区                                             */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,Index_Info_Buf[MAX_Records]								*/
/*																		*/
/* Returns:																*/
/*		Nothing													        */
/************************************************************************/
void Write_Index_Buf(unsigned long Index)
{
    unsigned  long  adr=0; 
    unsigned  char i,j=0;

    adr	=	Index<<12;
  
    for(i=0;i<MAX_Records+1;i++)
    {  
        SPI_WRITE_BYTE(adr,Index_Info_Buf[j++]);  
        adr++;  
    }   
}
/************************************************************************/
/* PROCEDURE: Write_Setup_Buf										    */
/*																		*/
/* 将配置信息存到指定的扇区                                             */
/*                                                                      */
/*																		*/
/* Input:																*/
/*		Index,Setup_Info_Buf[32]										*/
/*																		*/
/* Returns:																*/
/*		Nothing													        */
/************************************************************************/
void Write_Setup_Buf(unsigned long Index)
{
    unsigned  long  adr=0; 
    unsigned  char i,j=0;
    adr	=	Index<<12; 
    mov_setup_to_buf(); 
    for(i=0;i<30;i++)
    {      
        SPI_WRITE_BYTE(adr,Setup_Info_Buf[j++]); 
        adr++;        
    }   

}
/************************************************************************/
/* PROCEDURE: Tran_Sector_to_Sector										*/

⌨️ 快捷键说明

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