?? 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 + -