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 + -
显示快捷键?