📄 sst25vf016b_soft.c
字号:
/******************************************************************************************
软件驱动程序(C8051F020)
SST25VF016B 16 Mbit(2M x 8) 串行Flash存储器
(2007年4月19日)
关于此程序:
此程序为用户使用该FLASH提供了一个完整功能函数库,用户可根据自己的需要使用这些函数
------------------------------------------------------------------
init 初始化时钟,进入模式0
Send_Byte 用MOSI发送一字节(上升沿)
Get_Byte 用MISO接收一字节(下降沿)
Poll_SO 使用MISO作为AAI模式下的RY/BY#输出
芯片的功能函数包:
------------------------------------------------------------------
Read_Status_Register 读取状态寄存器
EWSR 使能写状态寄存器
WRSR 改写状态寄存器
WREN 写使能
WRDI 写禁止
EBSY 允许使用MISO 作为AAI模式下RY/BY#的输出脚
DBSY 禁止用MISO输出RY/BY#
Read_ID 读取厂商ID或芯片ID
Jedec_ID_Read 读取全部ID
Read 读取一个字节,返回byte(最大25 MHz CLK的频率)
Read_Cont 读取连续地址内的数据(最大25 MHz时钟频率)
HighSpeed_Read 读取一个字节(最大50Mhz时钟频率)并返回byte
HighSpeed_Read_Cont 连续读取(最大50 MHz时钟频率)
Byte_Program 写一个字节数据
Auto_Add_IncA 初始化Auto Address Increment(AAI)
Auto_Add_IncB AAI初始化后进入Auto_Address_Increment(AAI)
Auto_Add_IncA_EBSY 带EBSY的初始化Auto Address Increment(AAI)
Auto_Add_IncB_EBSY 带EBSY的Auto_Address_Increment (AAI)
Chip_Erase 擦除整个芯片
Sector_Erase 擦除一个扇区(4 KB)
Block_Erase_32K 擦除一块32 KByte的区域
Block_Erase_64K 擦除一块64 KByte的区域
Wait_Busy 等待空闲(状态寄存器的BUSY位为0)
Wait_Busy_AAI AAI模式下等待空闲
WREN_Check 检查WEL是否被置位
WREN_AAI_Check 检查WEL和AAI模式位被置位
************************************************************************/
/********************************************************************/
/* Copyright Silicon Storage Technology, Inc. (SST), 1994-2005 */
/* Example "C" language Driver of SST25VF016B Serial Flash */
/* Conrado Canio, Silicon Storage Technology, Inc. */
/* */
/* Revision 1.0, August 1st, 2005 */
/* */
/* */
/********************************************************************/
//#include <stdlib.h>
#include <C8051F020.h>
#include "SST25VF016B_SOFT.H"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar xdata upper_128[128]; /* 存取读到的数据,发在外部RAM中 */
/************************************************************************/
/* 程序名称: init */
/* */
/* 程序功能: 用来将时钟线初始化为低. 必须在将设备设置为模式0之前调用*/
/* 输入 : 无 */
/* */
/* 输出 : SCK */
/************************************************************************/
void init()
{
uchar i;
P7 |= 0x7f; /* 设置SCK为低电平初始化状态 */
for(i=255;i>0;i--);
P7 &= 0x80;
}
/***********************************************************************/
/*程序名称: SPI_CFG****/
/*功能: 用来配置SPI */
/************************************************************************/
void SPI_CFG(uchar spicfg,uchar spickr,uchar spicn)
{
SPI0CFG = spicfg;
SPI0CKR = spickr;
SPI0CN = spicn;
EIE1 |= 0X01;
}
/************************************************************************/
/* 程序名称: Send_Byte */
/* 程序功能:在时钟的上升沿在MOSI线上写入一位数据,写满一个字节 */
/* 输入:out */
/* 输出:SI */
/************************************************************************/
void Send_Byte(uchar out)
{
uchar i;
for(i=0;i<3;i++);
SPI0DAT =out;
while(TXBSY);
}
/************************************************************************/
/* 程序名称: Get_Byte */
/* 程序功能:在SCL的下降沿从MISO线上读取数据 */
/* 输入: SO */
/* 输出: None */
/************************************************************************/
uchar Get_Byte()
{
uchar in;
Send_Byte(0x00);//产生8位移位脉冲
in = SPI0DAT;
return in;
}
/************************************************************************/
/* 程序名称: Poll_SO */
/* 程序功能: 在AAI模式下监测MISO线是否变为1,用以显示AAI操作模式完成**/
/* 输入: SO */
/* 输出: None */
/************************************************************************/
void Poll_SO()
{
uchar temp = 0;
CE =0;
while (temp == 0x00) /* waste time until not busy */
temp = SO;
CE =1;
}
/************************************************************************/
/************************************************************************/
/* 程序名称: Read_Status_Register */
/* 程序功能: 用来读取状态寄存器,并返回状态寄存器的值 */
/* 输入: None */
/* 返回: byte */
/************************************************************************/
uchar Read_Status_Register()
{
uchar byte = 0;
CE =0; /* 使能设备 */
Send_Byte(0x05); /* 发送读状态寄存器的命令 */
byte = Get_Byte(); /* 读取状态寄存器 */
CE =1; /* 禁止设备 */
return byte;
}
/************************************************************************/
/* 程序名称: EWSR */
/* 程序功能: 使能改写状态寄存器操作 */
/* 输入: None */
/* 返回: Nothing */
/************************************************************************/
void EWSR()
{
CE =0; /* 使能设备*/
Send_Byte(0x50); /* 发送使能写寄存器的命令 */
CE =1; /* 禁止设备*/
}
/************************************************************************/
/* 程序名称: WRSR */
/* 程序功能: 往状态寄存器里写一个字节 *
/* 输入: byte */
/* 返回: Nothing */
/************************************************************************/
void WRSR(byte)
{
CE =0; /* 使能设备 */
Send_Byte(0x01); /* 发送写状态寄存器 */
Send_Byte(byte); /* 改变寄存器里BPx或者BPL (只有2,3,4,5,7位可以改写) */
CE =1; /* 禁止设备 */
}
/************************************************************************/
/* 程序名称: WREN */
/* 程序功能: 写使能 同样可以用于使能写状态寄存器 */
/* 输入: None */
/* 返回: Nothing */
/************************************************************************/
void WREN()
{
CE =0;
Send_Byte(0x06); /* 发送WREN命令 */
CE =1;
}
/************************************************************************/
/* 名称: WRDI */
/* 功能: 写禁止*/
/* 输入: None */
/* 返回: Nothing */
/************************************************************************/
void WRDI()
{
CE =0;
Send_Byte(0x04); /* 发送WRDI命令*/
CE =1;
}
/************************************************************************/
/* 名称: EBSY */
/* 功能: 允许MISO在AAI模式期间输出RY/BY# 状态 */
/* 输入: None */
/* 返回: Nothing */
/************************************************************************/
void EBSY()
{
CE =0;
Send_Byte(0x70); /* 发送EBSY命令*/
CE =1;
}
/************************************************************************/
/* 名称: DBSY */
/* 功能: 禁止MISO在AAI模式下作为输出RY/BY#状态的信号*/
/* 输入: None */
/* 返回: Nothing */
/************************************************************************/
void DBSY()
{
CE =0;
Send_Byte(0x80); /* 发送DBSY命令 */
CE =1;
}
/************************************************************************/
/* 名称: Read_ID */
/* 功能:用于读取厂商ID 和设备ID.使用90h 或ABh 命令读取ID. */
/* 由用户提供ID_addr ,用以决定是否先输出厂商ID或设备ID */
/* 输入: ID_addr */
/* 返回: byte: ID1(厂商ID = BFh 或设备 ID = 80h) */
/************************************************************************/
uchar Read_ID(ID_addr)
{
uchar byte;
CE =0;
Send_Byte(0x90); /* 发送read ID 指令 (90h or ABh) */
Send_Byte(0x00); /* 发送地址 */
Send_Byte(0x00); /* 发送地址 */
Send_Byte(ID_addr); /* 发送地址00H 或01H */
byte = Get_Byte(); /* 接收 */
CE =1;
return byte;
}
/************************************************************************/
/* 名称: Jedec_ID_Read */
/* 功能: 读取厂商ID(BFh),记忆体类型(25h),设备ID(41h). 使用9Fh作为JEDEC ID命令. */
/* 输入: None */
/* 返回: IDs_Read:ID1(厂商ID = BFh, 记忆体ID(25h), 设备ID(80h)*/
/************************************************************************/
ulong Jedec_ID_Read()
{
ulong temp;
temp = 0;
CE =0; /* enable device */
Send_Byte(0x9F); /* send JEDEC ID command (9Fh) */
temp = (temp | Get_Byte()) << 8; /* receive byte */
temp = (temp | Get_Byte()) << 8;
temp = (temp | Get_Byte()); /* temp value = 0xBF2541 */
CE =1; /* disable device */
return temp;
}
/************************************************************************/
/* 名称: Read */
/* 功能: 读取一个地址内一个字节的数据.返回读取的数据*/
/* 输入: Dst: Destination Address 000000H - 1FFFFFH */
/* 返回: byte */
/************************************************************************/
uchar Read(ulong Dst)
{
uchar byte = 0;
CE =0; /* enable device */
Send_Byte(0x03); /* read command */
Send_Byte(((Dst & 0xFFFFFF) >> 16)); /* send 3 address bytes */
Send_Byte(((Dst & 0xFFFF) >> 8));
Send_Byte(Dst & 0xFF);
byte = Get_Byte();
CE =1; /* disable device */
return byte; /* return one byte read */
}
/************************************************************************/
/* 名称: Read_Cont */
/* 功能: 读取芯片内连续地址内的数据,最多128字节*/
/* 输入: Dst-目标地址 (000000H - 1FFFFFH )*/
/************************************************************************/
void Read_Cont(ulong Dst, ulong no_bytes)
{
ulong i = 0;
CE =0; /* 使能芯片 */
Send_Byte(0x03); /* 发送读命令*/
Send_Byte(((Dst & 0xFFFFFF) >> 16)); /* 发送3字节的地址 */
Send_Byte(((Dst & 0xFFFF) >> 8));
Send_Byte(Dst & 0xFF);
for (i = 0; i < no_bytes; i++) /* 读取数据 */
{
upper_128[i] = Get_Byte(); /* 读取数据存放在80H - FFH */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -