📄 sst25vf016bdrv.c
字号:
CE_Low();
Send_Byte(0x02); // 发送字节数据烧写命令
Send_Byte((((Dst+i) & 0xFFFFFF) >> 16));// 发送3个字节的地址信息
Send_Byte((((Dst+i) & 0xFFFF) >> 8));
Send_Byte((Dst+i) & 0xFF);
Send_Byte(SndbufPt[i]); // 发送被烧写的数据
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
}
CE_Low();
Send_Byte(0x06); // 发送写使能命令
CE_High();
CE_Low();
Send_Byte(0x50); // 使状态寄存器可写
CE_High();
CE_Low();
Send_Byte(0x01); // 发送写状态寄存器指令
Send_Byte(temp); // 恢复状态寄存器设置信息
CE_High();
return (OK);
}
/************************************************************************
** 函数名称:SSTF016B_Erase
** 函数功能:根据指定的扇区号选取最高效的算法擦除
** 入口参数:
** uint32 sec1:起始扇区号,范围(0~499)
** uint32 sec2:终止扇区号,范围(0~499)
** 出口参数:操作成功则返回OK,失败则返回ERROR
************************************************************************/
uint8 SSTF016B_Erase(uint32 sec1, uint32 sec2)
{
uint8 temp1 = 0,temp2 = 0,StatRgVal = 0;
uint32 SecnHdAddr = 0;
uint32 no_SecsToEr = 0; // 要擦除的扇区数目
uint32 CurSecToEr = 0; // 当前要擦除的扇区号
/* 检查入口参数 */
if ((sec1 > SEC_MAX)||(sec2 > SEC_MAX))
{
return (ERROR);
}
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
temp1 = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
CE_Low();
Send_Byte(0x50); // 使状态寄存器可写
CE_High();
CE_Low();
Send_Byte(0x01); // 发送写状态寄存器指令
Send_Byte(0); // 清0BPx位,使Flash芯片全区可写
CE_High();
CE_Low();
Send_Byte(0x06); // 发送写使能命令
CE_High();
/* 如果用户输入的起始扇区号大于终止扇区号,则在内部作出调整 */
if (sec1 > sec2)
{
temp2 = sec1;
sec1 = sec2;
sec2 = temp2;
}
/* 若起止扇区号相等则擦除单个扇区 */
if (sec1 == sec2)
{
SecnHdAddr = SEC_SIZE * sec1; // 计算扇区的起始地址
CE_Low();
Send_Byte(0x20); // 发送扇区擦除指令
Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
Send_Byte(SecnHdAddr & 0xFF);
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
return (OK);
}
/* 根据起始扇区和终止扇区间距调用最快速的擦除功能 */
if (sec2 - sec1 == SEC_MAX)
{
CE_Low();
Send_Byte(0x60); // 发送芯片擦除指令(60h or C7h)
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
return (OK);
}
no_SecsToEr = sec2 - sec1 +1; // 获取要擦除的扇区数目
CurSecToEr = sec1; // 从起始扇区开始擦除
/* 若两个扇区之间的间隔够大,则采取16扇区擦除算法 */
while (no_SecsToEr >= 16)
{
SecnHdAddr = SEC_SIZE * CurSecToEr; // 计算扇区的起始地址
CE_Low();
Send_Byte(0xD8); // 发送64KB块擦除指令
Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
Send_Byte(SecnHdAddr & 0xFF);
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
CurSecToEr += 16; // 计算擦除了16个扇区后,和擦除区域相邻的待擦除扇区号
no_SecsToEr -= 16; // 对需擦除的扇区总数作出调整
}
/* 若两个扇区之间的间隔够大,则采取8扇区擦除算法 */
while (no_SecsToEr >= 8)
{
SecnHdAddr = SEC_SIZE * CurSecToEr; // 计算扇区的起始地址
CE_Low();
Send_Byte(0x52); // 发送32KB擦除指令
Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
Send_Byte(SecnHdAddr & 0xFF);
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
CurSecToEr += 8;
no_SecsToEr -= 8;
}
/* 采用扇区擦除算法擦除剩余的扇区 */
while (no_SecsToEr >= 1)
{
SecnHdAddr = SEC_SIZE * CurSecToEr; // 计算扇区的起始地址
CE_Low();
Send_Byte(0x20); // 发送扇区擦除指令
Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 发送3个字节的地址信息
Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
Send_Byte(SecnHdAddr & 0xFF);
CE_High();
do
{
CE_Low();
Send_Byte(0x05); // 发送读状态寄存器命令
StatRgVal = Get_Byte(); // 保存读得的状态寄存器值
CE_High();
}
while (StatRgVal == 0x03); // 一直等待,直到芯片空闲
CurSecToEr += 1;
no_SecsToEr -= 1;
}
/* 擦除结束,恢复状态寄存器信息 */
CE_Low();
Send_Byte(0x06); // 发送写使能命令
CE_High();
CE_Low();
Send_Byte(0x50); // 使状态寄存器可写
CE_High();
CE_Low();
Send_Byte(0x01); // 发送写状态寄存器指令
Send_Byte(temp1); // 恢复状态寄存器设置信息
CE_High();
return (OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -