flash.c

来自「IAR Embedded Workbench下编译的sst25lf080a操作的」· C语言 代码 · 共 396 行

C
396
字号
/************************************************************************************
**函数名 :flash.c
**描  述 :flash处理子程序
**版  本 :
**备  注 : 
**时  间 :2007-5-25 
**设  计 :
**修  改 : 
************************************************************************************/ 
#include "msp430x14x.h"
#include "In430.h"
#include "main.h"
#include "m430io.h"

unsigned char error1_wr_flag = 0, error2_wr_flag = 0;
extern unsigned long ulCurrent_Time;

void EWSR(void);
void WREN(void);
void WRDI(void);
void Chip_Erase(void);
void WREN_Check(void);
void Wait_Busy(void);
void Wait_Busy_AAI(void);
void WREN_AAI_Check(void);
void WRSR(unsigned char w_byte);
void Send_Byte(unsigned char out);
void Auto_Add_IncB(unsigned char byte);
void Block_Erase(unsigned long Dst1);
void Sector_Erase(unsigned long Dst);
void Byte_Program(unsigned long Dst, unsigned char byte);
void Auto_Add_IncA(unsigned long Dst, unsigned char byte);
unsigned char Get_Byte(void);
unsigned char Read_SR(void);
unsigned char Read_ID(unsigned char ID_addr);
unsigned char Read(unsigned long Dst);
unsigned char HighSpeed_Read(unsigned long Dst); 
/************************************************************************************
**函数名 :Send_Byte
**描  述 :向flash 中送入一个字节数据
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/
void Send_Byte(unsigned char out)
{
	unsigned char i;
	
	for (i = 0; i < 8; i++)
	{
		if((out & 0x80) == 0x80)
		{
			P5OUT |= SI_F;
		}
		else
		{
			P5OUT &= ~SI_F;
		} 
		P5OUT |=  SCK_F;    //在时钟上升沿锁存输入的数据
		out = (out << 1);   //数据移位输入到flash
		P5OUT &=  ~SCK_F;
	}
}
/************************************************************************************
**函数名 :Get_Byte
**描  述 :从flash中读出一个字节的数据
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
unsigned char Get_Byte(void)
{
	unsigned char i, in;
	for (i = 0; i < 8; i++)
	{
		in = (in << 1);
		P5OUT |=  SCK_F;
		if(P5IN & SO_F )
		{
			in = in | 0x01;
		}
		P5OUT &=  ~SCK_F;   //在时钟的下降沿锁存输入数据
	}
	return in;
}
/************************************************************************************
**函数名 :Read_SR
**描  述 :读状态寄存器的值
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
unsigned char Read_SR(void)
{
	unsigned char tmpp_byte;
	
	tmpp_byte=0;
	P5OUT &=  ~CS_F;          //使能片选
	Send_Byte(0x05);          //发送读状态寄存器命脉令字
	tmpp_byte = Get_Byte();   //从端口读出的状态寄存器的内容     
	P5OUT |=  CS_F;           //禁止使能
	return tmpp_byte;         //返回读出值
}
/************************************************************************************
**函数名 :EWSR
**描  述 :使能写状态寄存器
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void EWSR(void)
{
	P5OUT &= ~CS_F;
	Send_Byte(0x50);
	P5OUT |= CS_F;
}
/************************************************************************************
**函数名 :WRSR
**描  述 :写状态寄存器
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void WRSR(unsigned char w_byte)
{
	P5OUT &=  ~CS_F;
	Send_Byte(0x01);
	Send_Byte(w_byte);
	P5OUT |=  CS_F;
}
/************************************************************************************
**函数名 :WREN
**描  述 :写使能寄存器
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void WREN(void)
{
	P5OUT &=  ~CS_F;
	Send_Byte(0x06);
	P5OUT |=  CS_F;
}
/************************************************************************************
**函数名 :WRDI
**描  述 :写禁止寄存器
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void WRDI(void)
{
	P5OUT &=  ~CS_F;
	Send_Byte(0x04);
	P5OUT |=  CS_F;
}
/************************************************************************************
**函数名 :Read_ID
**描  述 :读器件ID
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
unsigned char Read_ID(unsigned char ID_addr)
{
	unsigned char temp_byte;
	
	P5OUT &=  ~CS_F;
	Send_Byte(0x90);                    //读器件地址命令字
    Send_Byte(0x00);
	Send_Byte(0x00);
	Send_Byte(ID_addr);
	temp_byte = Get_Byte();
	P5OUT |=  CS_F;
	return temp_byte;
}
/************************************************************************************
**函数名 :Read
**描  述 :连续字节读出 (20M)
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
unsigned char Read(unsigned long Dst) 
{
	unsigned char byte = 0;	

	P5OUT &=  ~CS_F;
	Send_Byte(0x03);
	Send_Byte(((Dst & 0xFFFFFF) >> 16)); //三字节地址的最高8位
	Send_Byte(((Dst & 0xFFFF) >> 8));    //三字节地址的中间8位
	Send_Byte(Dst & 0xFF);               //三字节地址的低8位
	byte = Get_Byte();                   //读取数据
	P5OUT |=  CS_F;
	return byte;                         //返回读出的字节值
}
/************************************************************************************
**函数名 :HighSpeed_Read
**描  述 :快速连续字节读出
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
unsigned char HighSpeed_Read(unsigned long Dst) 
{
	unsigned char byte = 0;	

	P5OUT &=  ~CS_F;
	Send_Byte(0x0B);                      //快速字节读命令字
	Send_Byte(((Dst & 0xFFFFFF) >> 16));
	Send_Byte(((Dst & 0xFFFF) >> 8));
	Send_Byte(Dst & 0xFF);
	Send_Byte(0xFF);                      //除三字节外加的雍佘字节
	byte = Get_Byte();                    //读取相应地址上的数据
	P5OUT |=  CS_F;	
	return byte; 
}
/************************************************************************************
**函数名 :Byte_Program
**描  述 :字节数据写入
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Byte_Program(unsigned long Dst, unsigned char byte)
{
	WREN();
	P5OUT &=  ~CS_F;
	Send_Byte(0x02);                       //字节编程命令字
	Send_Byte(((Dst & 0xFFFFFF) >> 16));
	Send_Byte(((Dst & 0xFFFF) >> 8));
	Send_Byte(Dst & 0xFF);
	Send_Byte(byte);
	P5OUT |=  CS_F;
	Wait_Busy();
}
/************************************************************************************
**函数名 :Auto_Add_IncA
**描  述 :自动地址增加写
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Auto_Add_IncA(unsigned long Dst, unsigned char byte)
{
    WREN();
	P5OUT &= ~CS_F;
	Send_Byte(0xAF);                     //自动地址增加写命令字
	Send_Byte(((Dst & 0xFFFFFF) >> 16));
	Send_Byte(((Dst & 0xFFFF) >> 8));
	Send_Byte(Dst & 0xFF);
	Send_Byte(byte);
	P5OUT |=  CS_F;
	Wait_Busy_AAI();
}
/************************************************************************************
**函数名 :Auto_Add_IncB
**描  述 :自动地址写以后
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Auto_Add_IncB(unsigned char byte)
{
	P5OUT &= ~CS_F;
	Send_Byte(0xAF);
	Send_Byte(byte);
	P5OUT |=  CS_F;
	Wait_Busy_AAI();
}
/************************************************************************************
**函数名 :Chip_Erase
**描  述 :片擦除
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Chip_Erase(void)
{
	unsigned long temp_time;

	P5OUT &= ~CS_F;
	Send_Byte(0x60);                        //片擦除命令字
	P5OUT |=  CS_F;
	temp_time=ulCurrent_Time;
	while(temp_time+15>ulCurrent_Time)
	{
	}
}
/************************************************************************************
**函数名 :Sector_Erase
**描  述 :分区擦除
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Sector_Erase(unsigned long Dst)
{
    unsigned long temp_time1;
	
	P5OUT &= ~CS_F;
	Send_Byte(0x20);                     //分区擦除命令字
	Send_Byte(((Dst & 0xFFFFFF) >> 16));
	Send_Byte(((Dst & 0xFFFF) >> 8));
	Send_Byte(Dst & 0xFF);
	P5OUT |=  CS_F;
	temp_time1=ulCurrent_Time;
	while(temp_time1+4>ulCurrent_Time)
	{
	}
}
/************************************************************************************
**函数名 :Block_Erase
**描  述 :块擦除
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Block_Erase(unsigned long Dst1)
{
	unsigned long temp_time2;
	
	P5OUT &= ~CS_F;	
	Send_Byte(0x52);	
	Send_Byte(((Dst1 & 0xFFFFFF) >> 16));
	Send_Byte(((Dst1 & 0xFFFF) >> 8));
	Send_Byte(Dst1 & 0xFF);
	P5OUT |=  CS_F;
	temp_time2=ulCurrent_Time;
	while(temp_time2+4>ulCurrent_Time)
	{
	}
}
/************************************************************************************
**函数名 :Wait_Busy
**描  述 :延时等待
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Wait_Busy(void)
{
    unsigned char wait_t;
    
    for(wait_t=0; wait_t<80; wait_t++);      // 20us
}
/************************************************************************************
**函数名 :Wait_Busy
**描  述 :延时等待
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void Wait_Busy_AAI(void)
{
    unsigned char wait_t;
    
    for(wait_t=0; wait_t<80; wait_t++);      // 20us
}
/************************************************************************************
**函数名 :WREN_Check
**描  述 :叛断芯片是否处于写使能状态
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void WREN_Check(void)
{
	unsigned char t_byte1;
	
	error1_wr_flag = 0;
	t_byte1 = Read_SR();
	if ((t_byte1 & 0x02) != 0x02)
	{
		error1_wr_flag = 1;
	}
}
/************************************************************************************
**函数名 :WREN_AAI_Check
**描  述 :叛断芯片是否处于自动地址增写使能状态
**时  间 :2007-5-25 
**修  改 : 
**备  注 : 
************************************************************************************/ 
void WREN_AAI_Check(void)
{
	unsigned char t_byte;
	
	error2_wr_flag = 0;
	t_byte = Read_SR();
	if ((t_byte & 0x42) != 0x42)
	{
		error2_wr_flag = 1;
	}
}

⌨️ 快捷键说明

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