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

📄 flashdrv.h

📁 ATMEL系列存储器驱动程序,提供地层和上层驱动
💻 H
字号:
/*
 *CopyRight  Reserved?    凯拓科技版权所有  http://www.ktopcn.com 
 *文件名:flashdrv.h
 *描述:提供flash存储器的底层驱动。
 *
 *版本:v1.0
 *作者:ktop
 *日期:2004/11/12
 */
 
 #ifndef FLASHDRV_H
	#define	FLASHDRV_H

#include <msp430x14x.h>


 #ifndef TRUE
	#define TRUE	1
	#define true	1
#endif

#ifndef FALSE
	#define	FALSE	0
	#define	false	0
#endif

#ifndef uchar
#define uchar unsigned char
#define	UCHAR uchar
#endif

#ifndef uint
#define uint unsigned int
#define	UINT uint
#endif

#ifndef ulong
#define ulong unsigned long
#define	ULONG ulong
#endif

#ifndef bool
#define bool unsigned char
#define	BOOL bool
#endif

#ifndef CONST
#define	CONST const
#endif


#ifdef FLASHDRV_C
/*********************************************参数配置*****************************************/
//SPI模式定义
#define				SPI_MODE_0					0						//SPI模式0
#define				SPI_MODE_3					1						//SPI模式3
#define				SPI_ICPL					2						//非活动时钟极性为低
#define				SPI_ICPH					3						//非活动时钟极性为高

#define				SPI_MODE					SPI_MODE_3				//定义SPI为模式3
#define				NOP()												//定义空操作,在一些快速应用中,应加延时。

																		//与存储器操作相关的硬件接口		

#define				SET_CS_OUT()				P3DIR |= 0X01			//将CS脚置为输出		
#define				SET_CS()					P3OUT |= 0X01	        //置位CS脚。
#define				CLR_CS()					P3OUT &= ~0x01			//清零CS脚

#define				SET_DO_OUT()				P3DIR |= 0X02			//将DO脚置为输出
#define				SET_DO()					P3OUT |= 0X02           //置位DO脚
#define				CLR_DO()					P3OUT &=~0X02           //清零DO脚。

#define				SET_DI_IN()											//设定DI为输入,如果DI与DO共用,则需要将输出转换成输入。
#define				READ_DI()					(P3IN & 0X04)  
                                                
#define				SET_CLK_OUT()				P3DIR |= 0X08			//将CLK脚置为输出		
#define				SET_CLK()					P3OUT |= 0X08           //置位CLK脚
#define				CLR_CLK()					P3OUT &= ~0X08			//清除CLK脚
                              
#define				WRITE_EN_OUT()				P2DIR |= 0X10			//将写使能脚置为输出
#define				WRITE_EN()					P2OUT |= 0X10 			//写使能置位
#define				WRITE_DS()					P2OUT &= ~0x10           //写使能清位。
																		//清看门狗	
#define				CLRWATCHDOG()				
#endif

/*********************************************参数定义*****************************************/
#if (SPI_MODE == SPI_MODE_3) || (SPI_MODE == SPI_MODE_0)				//当前的SPI模式为0或3时

#define				CON_ARRAY_READ				0XE8					//连续阵列读
#define				MEM_PAGE_READ				0XD2					//主存储器页读模式
#define				BUFF_1_READ					0XD4					//缓冲1读方式
#define				BUFF_2_READ					0XD6					//缓冲2读方式
#define				STU_REG_READ				0XD7					//读状态寄存器

#else																	//SPI模式为其它模式时
#define				CON_ARRAY_READ				0X68					//连续阵列读
#define				MEM_PAGE_READ				0X52					//主存储器页读模式
#define				BUFF_1_READ					0X54					//缓冲1读方式
#define				BUFF_2_READ					0X56					//缓冲2读方式
#define				STU_REG_READ				0X57					//读状态寄存器
#endif

//写命令	
#define				BUFF_1_WRITE				0X84					//写缓冲1
#define				BUFF_2_WRITE				0X87					//写缓冲2
#define				BUFF1_TO_MEM_WITH_ERASE		0X83					//写缓冲1的数据到存储器,使用内置的擦除功能
#define				BUFF2_TO_MEM_WITH_ERASE		0X86					//写缓冲2的数据到存储器,使用内置的擦除功能
#define				BUFF1_TO_MEM_NO_ERASE		0X88					//写缓冲1的数据到存储器,不使用内置的擦除功能
#define				BUFF2_TO_MEM_NO_ERASE		0X89					//写缓冲2的数据到存储器,不使用内置的擦除功能
#define				PAGE_ERASE					0X81					//页擦除
#define				BLOCK_ERASE					0X50					//块擦除
#define				BUFF1_TO_MEM				0X82					//主存储器页写入,通过BUFFER1	
#define				BUFF2_TO_MEM				0X85					//主存储器页写入,通过BUFFER2

//附加命令
#define				MEM_TO_BUFF1				0X53					//主存储器数据传送到BUFFER1
#define				MEM_TO_BUFF2				0X55					//主存储器数据传送到BUFFER2
#define				COMP_MEM_AND_BUFF1			0X60					//比较主存储器与BUFFER1的数据
#define				COMP_MEM_AND_BUFF2			0X61					//比较主存储器与BUFFER2的数据
#define				AUTO_RE_W_FROM_BUFF1		0X58					//自动页写入Buffer1的数据
#define				AUTO_RE_W_FROM_BUFF2		0X59					//自动页写入Buffer2的数据		

												
												
/********************************************函数选择配置**************************************/
#define				CONT_READ_EN				true					//连续读使能
#define				PAGE_READ_EN				false					//页读使能
#define				BUFFER_READ_EN				false					//BUFFER读使能
#define				STU_REG_READ_EN				true					//状态寄存器读使能
						
#define				BUFFER_W_EN					true					//缓冲写使能位,使能时,置true,否则为false
#define				BUFF_TO_MEM_WITH_ERASE_EN	true					//缓冲数据写入到存储器使能位,使能为true,否则为false
																		//写入时,使用内置的擦除功能。
#define				BUFF_TO_MEM_NO_ERASE_EN		false					//缓冲数据写入到存储器使能位,使能为true,否则为false
																		//写入时,不使用内置的擦除功能。
#define				PAGE_ERASE_EN				false					//页擦除使能
#define				BLOCK_ERASE_EN				true					//块擦除使能
#define				BUFF_TO_MEM_EN				true					//主存储器写入使能,通过缓冲写入


#define				MEM_TO_BUFF_EN				true					//读存储器的数据到缓冲使能,将存储器的数据读入到缓冲中
#define				COMP_MEM_AND_BUFF_EN		false					//比较存储器与缓冲中的数据使能
#define				AUTO_RE_W_FROM_BUFF_EN		false					//自动缓冲重写入使能。
						
/********************************************函数定义******************************************/

#if CONT_READ_EN == true
/*
 *函数性质:公共
 *入口:Flash页地址uiPageAddr,Flash页内的偏移量uiOffectInPage, 储存读入的数据缓冲pData,需要读入的数据长度uiLen
 *出口:无
 *功能:从Flash阵列中连续读数据,并将读得的数据存入到pData中。
 */
void ContinueReadFlash(uint uiPageAddr, uint uiOffectInPage, uchar *pData, uint uiLen);
 
#endif



#if PAGE_READ_EN == true
/*
 *函数性质:公共
 *入口:Flash页地址uiPageAddr,Flash页内的偏移量uiOffectInPage, 储存读入的数据缓冲pData,需要读入的数据长度uiLen
 *出口:无
 *功能:从Flash阵列中以页方式读数据,并将读得的数据存入到pData中。当读到一个页的尾部时,
 *下一次读出的数据为页的起始数据。
 */
void PageReadFlash(uint uiPageAddr, uint uiOffectInPage, uchar *pData, uint uiLen);
#endif



#if BUFFER_READ_EN == true
/*
 *函数性质:公共
 *入口:Buffer号ucBufNum,Buffer内的偏移量uiOffectInPage, 储存读入的数据缓冲pData,需要读入的数据长度uiLen
 *出口:无
 *功能:从给定的Flash缓冲中读数据,读得的数据存放到pData中。当读到缓冲的尾部时,再次读出将会读到缓冲的头部。
 */
void ReadFlashBuff(uchar ucBufNum, uint uiOffectInPage, uchar *pData, uint uiLen);
#endif



#if STU_REG_READ_EN == true
/*
 *函数性质:公共
 *入口:无
 *出口:状态寄存器的值
 *功能:读Flash的状态寄存器值。
 */
uchar ReadFlashStuReg(void);
#endif



#if BUFFER_W_EN == true
/*
 *函数性质:公共
 *入口:Buffer号ucBufNum,Buffer内的偏移量uiOffectInPage, 储存写入的数据缓冲pData,需要写入的数据长度uiLen
 *出口:无
 *功能:往给定的Flash缓冲写数据,待写入的数据存放在pData中,当写到缓冲的尾部时,再次写入将会写入到缓冲的头部。
 */
void WriteFlashBuff(uchar ucBufNum, uint uiOffectInPage, uchar *pData, uint uiLen);
#endif


#if BUFF_TO_MEM_WITH_ERASE_EN == true
/*
 *函数性质:公共
 *入口:Buffer号ucBufNum,Flash的页地址uiFlashPageAddr
 *出口:无
 *功能:往给定编号的Buffer数据写入到给定的Flash页,并使用内置擦除器。
 */
void WriteBuffToFlash(uchar ucBufNum, uint uiFlashPageAddr);
#endif



#if BUFF_TO_MEM_NO_ERASE_EN == true
/*
 *函数性质:公共
 *入口:Buffer号ucBufNum,Flash的页地址uiFlashPageAddr
 *出口:无
 *功能:往给定编号的Buffer数据写入到给定的Flash页,不使用内置擦除器。
 */
void WriteBuffToFlashWithNoErase(uchar ucBufNum, uint uiFlashPageAddr);
#endif


#if PAGE_ERASE_EN == true
/*
 *函数性质:公共
 *入口:页地址uiFlashPageAddr
 *出口:无
 *功能:页擦除Flash
 */
void FlashPageErase(uint uiFlashPageAddr);
#endif



#if BLOCK_ERASE_EN == true
/*
 *函数性质:公共
 *入口:Flash块地址uiFlashBlockAddr
 *出口:无
 *功能:块擦除Flash
 */
void FlashBlockErase(uint uiFlashBlockAddr);
#endif


#if BUFF_TO_MEM_EN == true
/*
 *函数性质:公共
 *入口:Buffer编号ucBufNum,Flash页地址uiPageAddr,Flash页内的偏移量uiOffectInPage,
 * 待写入的数据缓冲pData,需要写入的数据长度uiLen
 *出口:无
 *功能:本函数整合写缓冲和缓冲数据写入存储器功能,先将数据写入到给定的缓冲中,写入缓冲的偏移量
 *由uiOffectInPage确定。如果写入的数据超出缓冲的范围,则自动回绕到缓冲的头部。在写缓冲完成后,
 *将芯片的片选置高,则开始缓冲的数据到存储器传送。在整个写入未完成时,状态寄存器中的忙信号有效。
 */
void WriteFlashWithBuff(uchar ucBufNum, uint uiPageAddr, uint uiOffectInPage, uchar *pData, uint uiLen);
#endif


#if  MEM_TO_BUFF_EN == true
/*
 *函数性质:公共
 *入口:Buffer编号ucBufNum,  Flash的页地址uiFlashPageAddr
 *出口:无
 *功能:从主存储器中给定页地址读数据到给定的缓冲
 */
void ReadFlashToBuff(uchar ucBufNum, uint uiFlashPageAddr);
#endif


#if COMP_MEM_AND_BUFF_EN == true
/*
 *函数性质:公共
 *入口:Buffer编号ucBufNum,  Flash的页地址uiFlashPageAddr
 *出口:无
 *功能:比较给定的缓冲与存储器中对应页的数据。如果相等,则状态寄存器中相应的位清零,否则置位,
 *在比较过程中,忙标志有效。
 */
void CompFlashAndBuff(uchar ucBufNum, uint uiFlashPageAddr);
#endif

#if AUTO_RE_W_FROM_BUFF_EN == true
/*
 *函数性质:公共
 *入口:Buffer编号ucBufNum,Flash页地址uiPageAddr,Flash页内的偏移量uiOffectInPage,
 * 待写入的数据缓冲pData,需要写入的数据长度uiLen
 *出口:无
 *功能:自动读出给定页地址的Flash数据到给定的Buffer中,并在修改完缓冲中的数据后,自动重写入到
 *相应的存储器中。在写入过程中,状态寄存器中忙标志有效。
 */
void AutoReWriteFlash(uchar ucBufNum, uint uiFlashPageAddr, uint uiOffectInPage, uchar *pData, uint uiLen);
#endif


#endif

⌨️ 快捷键说明

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