#ifndef _FLASH_C_
#define _FLASH_C_
/*********************************************************************************************************************/
#include "ca51f5_config.h"
#include "../../includes/ca51f5sfr.h"
#include "../../includes/ca51f5xsfr.h"
#include "../../includes/gpiodef_f5.h"

#include "../../includes/system.h"
#include "../../Library/includes/flash.h"
#include <intrins.h>
/*********************************************************************************************************************/

/***********************************************************************************
函 数 名：Data_Area_Erase_Sector										 	
功能描述：擦除数据区空间的一个扇区						
函数说明：								
输    入：unsigned char SectorNumber	扇区号，范围 0-255										
返    回：无																	
***********************************************************************************/
void Data_Area_Sector_Erase(unsigned char SectorNumber)
{
	unsigned int SectorAddress;
	FSCMD 	= 	0;
	SectorAddress = 0x80*SectorNumber;
	LOCK  = CMD_DATA_AREA_UNLOCK;									//数据区解锁
	PTSH = (unsigned char)(SectorAddress>>8);			//填写扇区地址
	PTSL = (unsigned char)(SectorAddress);				//填写扇区地址	
	FSCMD = CMD_DATA_AREA_ERASE_SECTOR;						//执行擦除扇区操作
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    				//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Data_Area_Write_Byte											 	
功能描述：向FLASH数据区写入一个字节数据																	
输    入：unsigned int Address	数据区空间写入地址											
					unsigned char Data		写入数据												
返    回：无																	
***********************************************************************************/
void Data_Area_Write_Byte(unsigned int Address,unsigned char Data)
{
	FSCMD 	= 	0;
	LOCK  = CMD_DATA_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_DATA_AREA_WIRTE;							//执行写操作
	FSDAT = Data;															//装载数据	
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Data_Area_Mass_Write										 	
功能描述：向FLASH数据区批量写入数据																	
输    入：unsigned int wAddress	  数据区空间写入起始地址											
					unsigned char *pData		数据指针，指向写入数据缓存数组
					unsigned char Length		写入数据长度												
返    回：无																	
***********************************************************************************/
void Data_Area_Mass_Write(unsigned int Address,unsigned char *pData,unsigned int Length)
{
	unsigned int i;
	FSCMD 	= 	0;
	LOCK  = CMD_DATA_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_DATA_AREA_WIRTE;							//执行写操作
	for(i = 0; i < Length; i++)
	{
		FSDAT = *pData++;												//装载数据	
	}
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Data_Area_Read_Byte											 	
功能描述：从FLASH数据区读出一字节数据																
输    入：unsigned int Address	数据区空间读地址																							
返    回：读取的一字节数据																	
***********************************************************************************/
unsigned char Data_Area_Read_Byte(unsigned int Address)
{	
	unsigned char Data_Temp;
	FSCMD 	= 	0;
	LOCK  = CMD_DATA_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_DATA_AREA_READ;								//执行读操作
	Data_Temp = FSDAT;
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
	return Data_Temp;
} 
/***********************************************************************************
函 数 名：Data_Area_Mass_Read										 	
功能描述：从FLASH数据区批量读出数据																	
输    入：unsigned int Address	  数据区空间读起始地址											
					unsigned char *pData		数据指针，指向读出数据缓存数组
					unsigned char Length		读数据长度												
返    回：无																	
***********************************************************************************/
void Data_Area_Mass_Read(unsigned int Address,unsigned char *pData,unsigned int Length)
{
	unsigned int i;
	FSCMD 	= 	0;
	LOCK  = CMD_DATA_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_DATA_AREA_READ;								//执行读操作
	for(i = 0; i < Length; i++)
	{												
		*pData++ = FSDAT;
	}
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Code_Area_Erase_Sector										 	
功能描述：擦除程序区空间的一个扇区						
函数说明：								
输    入：unsigned char SectorNumber	扇区号，范围 0-255										
返    回：无																	
***********************************************************************************/
void Code_Area_Sector_Erase(unsigned char SectorNumber)
{
	unsigned int SectorAddress;
	FSCMD 	= 	0;
	SectorAddress = 0x80*SectorNumber;
	LOCK  = CMD_CODE_AREA_UNLOCK;									//程序区解锁
	PTSH = (unsigned char)(SectorAddress>>8);			//填写扇区地址
	PTSL = (unsigned char)(SectorAddress);				//填写扇区地址
	FSCMD = CMD_CODE_AREA_ERASE_SECTOR;						//执行擦除扇区操作
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    	//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Code_Area_Write_Byte											 	
功能描述：向FLASH程序区写入一个字节数据																	
输    入：unsigned int Address	程序区空间写入地址											
					unsigned char Data		写入数据												
返    回：无																	
***********************************************************************************/
void Code_Area_Write_Byte(unsigned int Address,unsigned char Data)
{
	FSCMD 	= 	0;
	LOCK  = CMD_CODE_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_CODE_AREA_WRITE;							//执行写操作
	FSDAT = Data;															//装载数据	
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Code_Area_Mass_Write										 	
功能描述：向FLASH程序区批量写入数据																	
输    入：unsigned int Address	  程序区空间写入起始地址											
		  unsigned char *pData		数据指针，指向写入数据缓存数组
		  unsigned char Length		写入数据长度												
返    回：无																	
***********************************************************************************/
void Code_Area_Mass_Write(unsigned int Address,unsigned char *pData,unsigned int Length)
{
	unsigned int i;
	FSCMD 	= 	0;
	LOCK  = CMD_CODE_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_CODE_AREA_WRITE;							//执行写操作
	for(i = 0; i < Length; i++)
	{
		FSDAT = *pData++;												//装载数据		
	}
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 
/***********************************************************************************
函 数 名：Code_Area_Read_Byte											 	
功能描述：从FLASH程序区读出一字节数据																
输    入：unsigned int Address	程序区空间读地址																							
返    回：读取的一字节数据																	
***********************************************************************************/
unsigned char Code_Area_Read_Byte(unsigned int Address)
{	
	unsigned char Data_Temp;
	FSCMD 	= 	0;
	LOCK  = CMD_CODE_AREA_UNLOCK;						//数据区解锁
	PTSH = (unsigned char)(Address>>8);			//填写高位地址
	PTSL = (unsigned char)Address;        	//填写低位地址
	FSCMD = CMD_CODE_AREA_READ;							//执行读操作
	Data_Temp = FSDAT;
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    	//对FLASH加锁
	return Data_Temp;
} 
/***********************************************************************************
函 数 名：	Code_Area_Mass_Read										 	
功能描述：	从FLASH程序区批量读出数据																	
输    入：	unsigned int Address	 	程序区空间读起始地址											
			unsigned char *pData		数据指针，指向读出数据缓存数组
			unsigned char Length		读数据长度												
返    回：	无																	
***********************************************************************************/
void Code_Area_Mass_Read(unsigned int Address,unsigned char *pData,unsigned int Length)
{
	unsigned int i;
	FSCMD 	= 	0;
	LOCK  = CMD_CODE_AREA_UNLOCK;							//数据区解锁
	PTSH = (unsigned char)(Address>>8);				//填写高位地址
	PTSL = (unsigned char)Address;        		//填写低位地址
	FSCMD = CMD_CODE_AREA_READ;								//执行读操作
	for(i = 0; i < Length; i++)
	{													
		*pData++ = FSDAT;
	}
	FSCMD = 0;
	LOCK  = CMD_FLASH_LOCK;						    		//对FLASH加锁
} 

/***********************************************************************************
函 数 名：	GetChipID										 	
功能描述：	从芯片读出芯片识别码(每个芯片都有唯一的识别码）															
输    入：	无									
返    回：	32位滚码																
***********************************************************************************/
unsigned long int GetChipID(void)				
{
	unsigned long int ID;
	LOCK  = 0x2B;	
	FSCMD = 0x80;	
	PTSH = 0x00;				
	PTSL = 0x00;        			
	FSCMD = 0x81;						
	ID = FSDAT;
	ID *= 256;
	ID |= FSDAT;
	ID *= 256;
	ID |= FSDAT;
	ID *= 256;
	ID |= FSDAT;
	FSCMD = 0;
	LOCK = 0xAA;
	return ID;
}

#endif 