📄 mx25l1602drv.c
字号:
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 + -