?? mx25l1602drv.c
字號:
CE_Low();
Send_Byte(0x50); /* 使狀態寄存器可寫 */
CE_High();
CE_Low();
Send_Byte(0x01); /* 發送寫狀態寄存器指令 */
Send_Byte(0); /* 清0BPx位,使Flash芯片全區可寫*/
CE_High();
for(i = 0; i < NByte; i++) {
CE_Low();
Send_Byte(0x06); /* 發送寫使能命令 */
CE_High();
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);
}
/*********************************************************************************************************
** 函數名稱:MX25L1602_Erase
** 函數功能:根據指定的扇區號選取最高效的算法擦除
** 輸入參數:
** INT32U sec1:起始扇區號,范圍(0~499)
** INT32U sec2:終止扇區號,范圍(0~499)
** 輸出參數:操作成功則返回OK,失敗則返回ERROR
*********************************************************************************************************/
INT8U MX25L1602_Erase(INT32U sec1, INT32U sec2)
{
INT8U temp1 = 0,temp2 = 0,StatRgVal = 0;
INT32U SecnHdAddr = 0;
INT32U no_SecsToEr = 0; /* 要擦除的扇區數目 */
INT32U 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 & 0x01); /* 一直等待,直到芯片空閑 */
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 & 0x01); /* 一直等待,直到芯片空閑 */
return (OK);
}
no_SecsToEr = sec2 - sec1 +1; /* 獲取要擦除的扇區數目 */
CurSecToEr = sec1; /* 從起始扇區開始擦除 */
/*
* 若兩個扇區之間的間隔夠大,則采取16扇區擦除算法
*/
while (no_SecsToEr >= 16)
{
CE_Low();
Send_Byte(0x06); /* 發送允許寫命令 */
CE_High();
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 & 0x01); /* 一直等待,直到芯片空閑 */
CurSecToEr += 16; /* 計算擦除了16個扇區后和擦除區*/
/* 域相鄰的待擦除扇區號 */
no_SecsToEr -= 16; /* 對需擦除的扇區總數作出調整 */
}
/*
* 采用扇區擦除算法擦除剩余的扇區
*/
while (no_SecsToEr >= 1) {
CE_Low();
Send_Byte(0x06); /* 發送允許寫命令 */
CE_High();
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 & 0x01 ); /* 一直等待,直到芯片空閑 */
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);
}
/*********************************************************************************************************
** End Of File
*********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -