Files
r2_int_1/Library/Sources/flash.c
T
moyuhai 02f1638ef2 V1.0
2026-06-12 09:12:35 +08:00

245 lines
9.5 KiB
C

#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