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

📄 flash.c.bak

📁 一个基于pic单片机的外部flash <SST_SST25VF016B>的驱动代码
💻 BAK
📖 第 1 页 / 共 3 页
字号:
#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 ;
}
*/
void mov_setup_to_buf( )
{
     Setup_Info_Buf[0]        =g_setup.measure_mode ;
	 Setup_Info_Buf[1]        =g_setup.lanuage_mode;
	 Setup_Info_Buf[2]        =g_setup.filter_mode;
	 Setup_Info_Buf[3]        =g_setup. beep_mode;
	 Setup_Info_Buf[4]        =g_setup. gain_mode;
 	 Setup_Info_Buf[5]        =g_setup. bandwidth_mode ;
	 Setup_Info_Buf[6]        =g_setup. light_mode;
	 Setup_Info_Buf[7]        =g_setup.power_mode;
	 Setup_Info_Buf[8]        =g_setup.translate_mode ;
	 Setup_Info_Buf[9]        =g_setup.nouse;

     Setup_Info_Buf[10]       =g_setup.limit_low;
     Setup_Info_Buf[11]       =g_setup.limit_high;
     Setup_Info_Buf[12]       =g_setup.user_id ;
     Setup_Info_Buf[13]       =g_setup.sw_alarm ;
     Setup_Info_Buf[14]       =g_setup.initflag;
     Setup_Info_Buf[15]       =g_setup.toleration;

     Setup_Info_Buf[16]       =g_setup.regist_flag;

     Setup_Info_Buf[17]       =g_setup.regist_id;
     Setup_Info_Buf[18]       =g_setup.regist_id>>8;
     Setup_Info_Buf[19]       =g_setup.regist_id>>16;
     Setup_Info_Buf[20]       =g_setup.regist_id>>24;

     Setup_Info_Buf[21]       =g_setup.regist_sign;
     Setup_Info_Buf[22]       =g_setup.sys_ini;
     Setup_Info_Buf[23]       =g_setup.contrast_mode;
     Setup_Info_Buf[24]       =g_setup.adjust_baseline;
	
	 Setup_Info_Buf[25]       =g_setup.password;
	 Setup_Info_Buf[26] 	  =g_setup.datNO;
}
void mov_buf_to_setup( )
{
     g_setup.measure_mode= Setup_Info_Buf[0];
	 g_setup.lanuage_mode=Setup_Info_Buf[1];
	 g_setup.filter_mode=Setup_Info_Buf[2];
	 g_setup. beep_mode=Setup_Info_Buf[3];
	 g_setup. gain_mode=Setup_Info_Buf[4];
 	 g_setup. bandwidth_mode=Setup_Info_Buf[5] ;
	 g_setup. light_mode=Setup_Info_Buf[6];
	 g_setup.power_mode=Setup_Info_Buf[7];
	 g_setup.translate_mode=Setup_Info_Buf[8] ;
	 g_setup.nouse=Setup_Info_Buf[9];

     g_setup.limit_low=Setup_Info_Buf[10];
     g_setup.limit_high=Setup_Info_Buf[11];
     g_setup.user_id =Setup_Info_Buf[12];
     g_setup.sw_alarm=Setup_Info_Buf[13];
     g_setup.initflag=Setup_Info_Buf[14];
     g_setup.toleration=Setup_Info_Buf[15];

     g_setup.regist_flag=Setup_Info_Buf[16] ;

     g_setup.regist_id=Setup_Info_Buf[20];
     g_setup.regist_id=g_setup.regist_id<<8 | Setup_Info_Buf[19];
     g_setup.regist_id=g_setup.regist_id<<8 | Setup_Info_Buf[18];
     g_setup.regist_id=g_setup.regist_id<<8 | Setup_Info_Buf[17];

     g_setup.regist_sign=Setup_Info_Buf[21];
     g_setup.sys_ini=Setup_Info_Buf[22];
     g_setup.contrast_mode=Setup_Info_Buf[23];
     g_setup.adjust_baseline=Setup_Info_Buf[24];

	 g_setup.password = Setup_Info_Buf[25];
	 g_setup.datNO	  = Setup_Info_Buf[26];
}
void mov_record_to_buf(void)
{
    Record_Info_Buf[0] =gDataMsg.DataFlag; 
    Record_Info_Buf[1] =gDataMsg.userID;
    Record_Info_Buf[2] =gDataMsg.nc;
    Record_Info_Buf[3] =gDataMsg.nc1;
    Record_Info_Buf[4] =gDataMsg.date_year;
    Record_Info_Buf[5] =gDataMsg.date_mon;
    Record_Info_Buf[6] =gDataMsg.date_day;
    Record_Info_Buf[7] =gDataMsg.time_hour;
    Record_Info_Buf[8] =gDataMsg.time_min; 
    Record_Info_Buf[9] =gDataMsg.Anly;
    Record_Info_Buf[10] =gDataMsg.Lock;   
    Record_Info_Buf[11] =gDataMsg.None; 
    Record_Info_Buf[12] =gDataMsg.Hp;
    Record_Info_Buf[13] =gDataMsg.Hp>>8;
    Record_Info_Buf[14] =gDataMsg.kind;
}
void mov_buf_to_record(void)
{
    gDataMsg.DataFlag    =Record_Info_Buf[0]; 
    gDataMsg.userID      =Record_Info_Buf[1];
    gDataMsg.nc          =Record_Info_Buf[2];
    gDataMsg.nc1         =Record_Info_Buf[3];
    gDataMsg.date_year   =Record_Info_Buf[4];
    gDataMsg.date_mon    =Record_Info_Buf[5];
    gDataMsg.date_day    =Record_Info_Buf[6];
    gDataMsg.time_hour   =Record_Info_Buf[7];
    gDataMsg.time_min    =Record_Info_Buf[8]; 
    gDataMsg.Anly        =Record_Info_Buf[9];
    gDataMsg.Lock        =Record_Info_Buf[10];   
    gDataMsg.None        =Record_Info_Buf[11]; 
    gDataMsg.Hp          =Record_Info_Buf[13]; 
    gDataMsg.Hp          =gDataMsg.Hp<<8 | Record_Info_Buf[12]; 
    gDataMsg.kind        =Record_Info_Buf[14] ;
}

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 ;		
}

⌨️ 快捷键说明

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