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

📄 flash.c

📁 一个基于pic单片机的外部flash <SST_SST25VF016B>的驱动代码
💻 C
字号:
#include <P24FJ128GA006.H>
#include <stdio.h>
#include <string.h>
#include "commuse.h"
#include "lcd.h"
#include "timer.h"
#include "ecg.h"
#include "bmp.h"
#include "clock.h"
#include "system.h"
#include "key.h"
#include "menu.h"
#include "hr.h"
#include "FlashScreen.h"
#include "uart.h"
#include "flash.h"
#include "ecganal.h"

#define			WAIT_TBF  		while(SPI2STAT&0x02)
#define			WAIT_RBF    	SPI2STATbits.SPIROV		=	0;	while(!(SPI2STAT&0x01))

#define			CE_LOW			LATCbits.LATC14		=	0
#define			CE_HIG			LATCbits.LATC14		=	1

#define			CLK_LOW			LATGbits.LATG6		=	0
#define			CLK_HIG			LATGbits.LATG6		=	1

#define			SO_LOW			LATGbits.LATG8		=	0
#define			SO_HIG			LATGbits.LATG8		=	1

//#define			HOLD_LOW		LATGbits.LATG9		=	0
//#define			HOLD_HIG		LATGbits.LATG9		=	1

#define				WEL_ON				0x02
#define				BUSY_ON				0x01

#define				JEDEC_ID			0x9F
#define				SST_FLASH_ID		0x90
#define				SST_RDSR			0x05
#define				SST_WREN			0x06
#define				SST_EWSR			0x50
#define				SST_WRSR			0x01
#define				SST_ERASE			0x20
#define				SST_WBYTE			0x02
#define				SST_RBYTE			0x03
#define				SST_HI_RBYTE		0x0B


#define				WRITE_NULL			0xff



unsigned char     Index_count[2];     
unsigned char     DataChange;
volatile 	MSGData           gDataMsg;
unsigned char     SPI_in_buf;
unsigned char     Record_index_old ;
volatile unsigned char     Record_Info_Buf[16];
unsigned char     Index_Info_Buf[MAX_Records+1];
volatile unsigned char     useIndex[MAX_Records];
volatile unsigned char     Record_count;
volatile unsigned char     Record_index;
unsigned char     Setup_Info_Buf[32];
unsigned long     addr_point;




void				SPI_WREN(void);
void				SPI_EWSR(void);

void				SPI_JEDEC_ID(unsigned char *);
unsigned char		SPI_READ_ID (unsigned char);
unsigned char		SPI_READ_STATUS(void);
unsigned char		SPI_WRITE_BYTE(unsigned long,unsigned char);
void				SPI_HISPEED_READ(unsigned long,unsigned int,unsigned char *);
void				SPI_WRITE_STATUS(unsigned char);

void init_spi2()
{
	TRISG				=	0xffff;	


	TRISCbits.TRISC14	=	0; //CE
	TRISGbits.TRISG6	=	0; //SCK
	TRISGbits.TRISG8	=	0;//MOSI
//	TRISGbits.TRISG9	=	0;//HOLD	

	CE_HIG;
	CLK_LOW;
	SO_HIG;
//	HOLD_HIG;	

	
	SPI2CON1		=	0x0023;//1M
	SPI2CON2		=	0x0000;	
	SPI2STAT		=	0x8000;

	SPI_WREN();
	delay_ms(10);
	SPI_EWSR();
	delay_ms(10);	
	SPI_WRITE_STATUS(0x02);
	delay_ms(10);
}

void	SPI_JEDEC_ID(unsigned char *buf)
{
		unsigned char cTemp;
		CE_LOW;	
		CLK_LOW;	
		WAIT_TBF;	
		SPI2BUF	=	JEDEC_ID;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp	=	SPI2BUF;
		
		SPI2BUF	=	WRITE_NULL;
		WAIT_TBF;		
		WAIT_RBF;
		buf[0]	=	SPI2BUF;

		SPI2BUF	=	WRITE_NULL;
		WAIT_TBF;		
		WAIT_RBF;
		buf[1]	=	SPI2BUF;

		SPI2BUF	=	WRITE_NULL;
		WAIT_TBF;		
		WAIT_RBF;
		buf[2]	=	SPI2BUF;
		CLK_HIG;
		CE_HIG;
		return ;
}

unsigned char	SPI_READ_ID(unsigned char FLASHID)
{
		unsigned char cTemp;
		
		CE_LOW;	
		CLK_LOW;
		
		WAIT_TBF;	
		SPI2BUF		=	JEDEC_ID;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;
		
		SPI2BUF		=	0x00;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	0x00;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	FLASHID;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;
		CLK_HIG;
		CE_HIG;	
		return cTemp;
	
}
unsigned char	SPI_READ_STATUS(void)
{
		unsigned char cTemp;
		
		CE_LOW;	
		CLK_LOW;

		WAIT_TBF;	
		SPI2BUF		=	SST_RDSR;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		SPI2BUF		=	WRITE_NULL;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		CLK_HIG;
		CE_HIG;
		return cTemp;
}
void	SPI_WREN(void)
{
		unsigned char cTemp;
		
		CE_LOW;	
		CLK_LOW;

		WAIT_TBF;	
		SPI2BUF		=	SST_WREN;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		CLK_HIG;
		CE_HIG;	
		

		return  ;
}
void	SPI_EWSR(void)
{
		unsigned char cTemp;		
		CE_LOW;	
		CLK_LOW;

		WAIT_TBF;	
		SPI2BUF		=	SST_EWSR;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

		CLK_HIG;
		CE_HIG;	
		return  ;
}

void	SPI_WRITE_STATUS(unsigned char inch)
{
		unsigned char cTemp;		
		CE_LOW;	
		CLK_LOW;

		WAIT_TBF;	
		SPI2BUF		=	SST_WRSR;
		WAIT_TBF;		
		WAIT_RBF;
		cTemp		=	SPI2BUF;

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

		CLK_HIG;
		CE_HIG;	

		return ;
}
void	Sector_Erase(unsigned long in)
{
		unsigned long	 iAddr;
		unsigned char	 cTemp;
		if(in>255)
		{
			return;
		}

		iAddr	=	(unsigned long)	in<<12;		
		
		SPI_WREN();

		cTemp	=	SPI_READ_STATUS();
		if(!(cTemp&WEL_ON))
		{
			return;
		}
		
		CE_LOW;	
		CLK_LOW;

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

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


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

		CLK_HIG;
		CE_HIG;	
		return ;		
}
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 ;
}



















	  	

⌨️ 快捷键说明

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