📄 sst25vf016bdrv.c
字号:
}
}
while (StatRgVal & 0x01); /* 一直等待,直到芯片空闲 */
if (n > 0) {
return F016BOK;
} else {
return F016BERROR;
}
}
/**********************************************************************************************************
** Function name: sstf016bWr
** Descriptions: SST25VF016B的写函数,可写1个和多个数据到指定地址
** input parameters: Dst: 目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** SndbufPt: 发送缓存区指针
** NByte: 要写的数据字节数
** output parameters: None
** Returned value: F016BERROR: 错误; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bWr (uint32 Dst,
uint8 *SndbufPt,
uint32 NByte)
{
uint8 StatBak = 0;
uint32 i = 0;
if (((Dst + NByte - 1) > __F016B_MAX_ADDR) || (NByte == 0)) { /* 检查入口参数 */
return (F016BERROR);
}
__F016B_CE_Low();
__f016bSendByte(0x05); /* 发送读状态寄存器命令 */
__f016bGetByte(&StatBak); /* 保存读得的状态寄存器值 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x50); /* 使状态寄存器可写 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x01); /* 发送写状态寄存器指令 */
__f016bSendByte(0); /* 清0BPx位,使Flash全区可写 */
__F016B_CE_High();
if (Dst & 0x00000001) {
__F016B_CE_Low();
__f016bSendByte(0x06); /*_ 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x02); /* 发送字节数据烧写命令 */
__f016bSendByte((uint8)(((Dst & 0xFFFFFF) >> 16))); /* 发送3个字节的地址信息 */
__f016bSendByte((uint8)(((Dst & 0xFFFF) >> 8)));
__f016bSendByte((uint8)(Dst & 0xFF));
__f016bSendByte((uint8)(*SndbufPt++)); /* 发送被烧写的数据 */
__F016B_CE_High();
__WaitWrEnd();
NByte--;
Dst++;
}
if (NByte > 1) {
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0xAD); /* 发送字节数据烧写命令 */
__f016bSendByte((uint8)(((Dst & 0xFFFFFF) >> 16))); /* 发送3个字节的地址信息 */
__f016bSendByte((uint8)(((Dst & 0xFFFF) >> 8)));
__f016bSendByte((uint8)(Dst & 0xFF));
__f016bSendByte((uint8)(*SndbufPt++)); /* 发送被烧写的数据 */
__f016bSendByte((uint8)(*SndbufPt++)); /* 发送被烧写的数据 */
__F016B_CE_High();
__WaitWrEnd();
NByte -= 2;
Dst += 2;
for(i = 0; i < (NByte / 2); i++) {
__F016B_CE_Low();
__f016bSendByte(0xAD); /* 发送字数据烧写命令 */
__f016bSendByte((uint8)(*SndbufPt++)); /* 发送被烧写的数据 */
__f016bSendByte((uint8)(*SndbufPt++)); /* 发送被烧写的数据 */
__F016B_CE_High();
__WaitWrEnd();
}
__F016B_CE_Low();
__f016bSendByte(0x04); /* 结束AAI */
__F016B_CE_High();
__WaitWrEnd();
}
if (NByte & 0x00000001) {
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x02); /* 发送字节数据烧写命令 */
__f016bSendByte((uint8)((((Dst + NByte - 1)
& 0xFFFFFF) >> 16)));
__f016bSendByte((uint8)(((Dst + NByte - 1) & 0xFFFF) >> 8)); /* 发送3个字节的地址信息 */
__f016bSendByte((uint8)((Dst + NByte - 1) & 0xFF));
__f016bSendByte((uint8)(*SndbufPt)); /* 发送被烧写的数据 */
__F016B_CE_High();
__WaitWrEnd();
NByte--;
Dst++;
}
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x50); /* 使状态寄存器可写 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x01); /* 发送写状态寄存器指令 */
__f016bSendByte(StatBak); /* 恢复状态寄存器设置信息 */
__F016B_CE_High();
return (F016BOK);
}
/**********************************************************************************************************
** Function name: sstf016bErase
** Descriptions: 根据指定的扇区号选取最高效的算法擦除
** input parameters: sec1: 起始扇区号,范围(0~511)
** sec2: 终止扇区号,范围(0~511)
** output parameters: None
** Returned value: F016BERROR: 错误; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bErase (uint32 sec1, uint32 sec2)
{
uint8 StatBak = 0;
uint32 temp = 0;
uint32 SecnHdAddr = 0;
uint32 no_SecsToEr = 0; /* 要擦除的扇区数目 */
uint32 CurSecToEr = 0; /* 当前要擦除的扇区号 */
if ((sec1 > __F016B_SEC_MAX) || (sec2 > __F016B_SEC_MAX)) {
return (F016BERROR);
}
__F016B_CE_Low();
__f016bSendByte(0x05); /* 发送读状态寄存器命令 */
__f016bGetByte(&StatBak); /* 保存读得的状态寄存器值 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x50); /* 使状态寄存器可写 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x01); /* 发送写状态寄存器指令 */
__f016bSendByte(0); /* 清0BPx位,使Flash全区可写 */
__F016B_CE_High();
if (sec1 > sec2) { /* 如果用户输入的起始扇区号大于 */
/* 终止扇区号,则在内部作出调整 */
temp = sec1;
sec1 = sec2;
sec2 = temp;
}
if (sec1 == sec2) { /* 起止扇区号相等则擦除单个扇区 */
SecnHdAddr = __F016B_SEC_SIZE * sec1; /* 计算扇区的起始地址 */
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x20); /* 发送扇区擦除指令 */
__f016bSendByte((uint8)(((SecnHdAddr & 0xFFFFFF) >> 16))); /* 发送3个字节的地址信息 */
__f016bSendByte((uint8)(((SecnHdAddr & 0xFFFF) >> 8)));
__f016bSendByte((uint8)(SecnHdAddr & 0xFF));
__F016B_CE_High();
__WaitWrEnd();
goto EraseEnd;
}
if ((sec2 - sec1) == __F016B_SEC_MAX) { /* 根据起始扇区和终止扇区间距调 */
/* 用最快速的擦除功能 */
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x60); /* 发送芯片擦除指令(60h or C7h) */
__F016B_CE_High();
__WaitWrEnd();
goto EraseEnd;
}
no_SecsToEr = sec2 - sec1 + 1; /* 获取要擦除的扇区数目 */
CurSecToEr = sec1; /* 从起始扇区开始擦除 */
while (no_SecsToEr >= 1) { /* 用扇区擦除算法擦除剩余扇区 */
SecnHdAddr = __F016B_SEC_SIZE * CurSecToEr; /* 计算扇区的起始地址 */
__F016B_CE_Low();
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x20); /* 发送扇区擦除指令 */
__f016bSendByte((uint8)(((SecnHdAddr & 0xFFFFFF) >> 16))); /* 发送3个字节的地址信息 */
__f016bSendByte((uint8)(((SecnHdAddr & 0xFFFF) >> 8)));
__f016bSendByte((uint8)(SecnHdAddr & 0xFF));
__F016B_CE_High();
__WaitWrEnd();
CurSecToEr += 1;
no_SecsToEr -= 1;
}
EraseEnd:
__F016B_CE_Low(); /* 擦除结束,恢复状态寄存器信息 */
__f016bSendByte(0x06); /* 发送写使能命令 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x50); /* 使状态寄存器可写 */
__F016B_CE_High();
__F016B_CE_Low();
__f016bSendByte(0x01); /* 发送写状态寄存器指令 */
__f016bSendByte(StatBak); /* 恢复状态寄存器设置信息 */
__F016B_CE_High();
return (F016BOK);
}
/**********************************************************************************************************
END FILE
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -