📄 flashcc.c
字号:
#include "include.h"
uchar hantemp[1005];
void flash_read(uchar column,uint page,uint length,uchar fors) //fors 表示是第一或者第二区段
{
uchar temp,temp1;
uint num;
DDRA = 0xff; //PORTA 变成输出口
dir_1h; //设置 UC1 方向为写
NOP();
oe_1l; //设置 UC1 输出使能
NOP();
dir_2h; //设置 UC2 方向为写
NOP();
oe_2l; //设置 UC2 输出使能
NOP();
rd_fh; //设置 FLASH 读为高
NOP();
ale_fl; //ALE_4245 = 0 ALE置低
NOP();
we_fl; //WE_4245 = 0 WE置低
NOP();
cle_fh; //CLE_4245 = 1 CLE置高
NOP();
PORTA = fors; //命令字,'00'从前面为读 '01'从后面读
NOP();
we_fh; //WE_4245 = 1 WE置高
NOP();
cle_fl; //CLE_4245 = 0 CLE置低
NOP();
ale_fh; //ALE_4245 = 1 ALE置高
NOP();
we_fl; //WE_4245 = 0 WE置低
NOP();
PORTA = column; //P0 = column 地址0-7位
NOP();
we_fh; //WE_4245 = 1 WE置高
NOP();
we_fl; //WE_4245 = 0 WE置低
NOP();
temp = (uchar)((page>>1) & 0x00ff);
NOP();
PORTA = temp; //P0 = temp 地址8-15位
NOP();
we_fh; //WE_4245 = 1 WE置高
NOP();
we_fl; //WE_4245 = 0 WE置低
NOP();
temp = (uchar)((page>>9) & 0x00ff);
NOP();
PORTA = temp; //P0 = temp 地址16-23位
NOP();
we_fh; //WE_4245 = 1 WE置高
NOP();
ale_fl; //ALE_4245 = 0 ALE置低
NOP();
for(temp = 0;temp < 50;temp++)
NOP();
dir_1l; //设置UC1 方向为读
NOP();
PORTA = 0XFF;
NOP();
DDRA = 0x00; //PORTA 变成输入口
NOP();
for(num = 1;num <= length; num++)
{
rd_fl; //读为低
NOP();NOP();//加两个NOP 才能满足,64太快了
temp = PINA;
NOP();
rd_fh; //读为高
// hantemp[num-1] = temp;
uart1_txd(temp);
}
oe_1h;//断开数据总线
}
uchar flash_write(uchar col,uint page,uchar *Ptr,uint length,uchar fors)
{
uchar COMP;
uint temp1=0;
uint change;
uint i;
change=page;
temp1=0;
while(temp1<length)
{
DDRA = 0xff; //PORTA 变成输出口
dir_1h; //设置 UC1 方向为写
NOP();
oe_1l; //设置 UC1 输出使能
NOP();
dir_2h; //设置 UC2 方向为写
NOP();
oe_2l; //设置 UC2 输出使能
rd_fh; //设置 FLASH 读为高
NOP();
ale_fl;
NOP();
we_fl;
NOP();
cle_fh;
NOP();
PORTA = fors; NOP();
we_fh; NOP();
we_fl; NOP();
PORTA = 0x80; NOP();
we_fh; NOP();NOP();
we_fl;
cle_fl; NOP(); NOP(); //CLE_4245 = 0 CLE置低
ale_fh; NOP(); NOP();// ALE_4245 = 1; //ALE置高
// if(temp1>527)
// change=page+(temp1>>9);
// else
// change=page;
PORTA= col; //0-7位
NOP(); NOP();
we_fh;// WE_4245 = 1; //WE置高
NOP(); NOP(); NOP();
we_fl; //WE_4245 = 0; //WE置低
NOP();// WE_4245 = 0; //WE置低
NOP();
//PORTA = (uchar)(change& 0x00ff); //地址8-15位
// PORTA =(uchar)((change>>1) & 0x00ff);//地址16-23位
COMP = (uchar)((change>>1) & 0x00ff);
PORTA =COMP;
NOP(); NOP();
we_fh;// WE_4245 = 1; //WE置高
NOP(); NOP();
we_fl; // WE_4245 = 0; //WE置低
NOP(); NOP();
COMP =(uchar)((change>>9) & 0x00ff);//地址16-23位
PORTA =COMP;
we_fh; NOP(); NOP();// WE_4245 = 1; //WE置高
we_fl;
ale_fl;// ALE_4245 = 0; //ALE置低
NOP(); NOP();
for(i=0;(i<528)&&(temp1<length);i++)
{
we_fl;// WE_4245 = 0;NOP();
NOP(); NOP();
PORTA =*Ptr;
NOP(); NOP();
we_fh; // WE_4245 = 1;
temp1++;
Ptr++;
}
change+=0x0002;
we_fl;// WE_4245 = 0;
NOP(); NOP();
ale_fl;//ALE_4245 = 0;
NOP(); NOP();
cle_fh;//CLE_4245 = 1;
NOP(); NOP();
we_fl;// WE_4245 =0;
NOP(); NOP();
PORTA =0x10;
NOP(); NOP();
we_fh; // WE_4245 =1;
NOP(); NOP(); NOP();
//we_fl;
for(i=0;i<10000;i++)
{
NOP();
}
dir_2h; //设置 UC2 方向为写
NOP();
oe_2l; //设置 UC2 输出使能
cle_fh;// CLE_4245 = 1;
NOP(); NOP();
we_fl;//WE_4245 = 0 ;
NOP(); NOP();
PORTA =0x70;
NOP(); NOP();
we_fh;// WE_4245 = 1;
NOP(); NOP();
we_fl;
cle_fl;//CLE_4245 = 0;
NOP(); NOP();
rd_fh; //读为高 RE_4245 = 1;
DDRA=0X00;
PORTA=0XFF;
dir_1l; //设置UC1 方向为读
NOP(); NOP();
rd_fl; //RE_4245 = 0;
NOP(); NOP();
COMP=PINA;
i=0;
rd_fh;
if(COMP&0x01!=0)
{oe_1h;//断开数据总线
return 1;
}
// else
// {
// return 0;//写成功 返回 0
// }
}//while(temp1!=length)
oe_1h;//断开数据总线
return 0;
}
void flash_id(void)
{uchar temp,COMP;
uint i;
DDRA = 0xff; //PORTA 变成输出口
dir_1h; //设置 UC1 方向为写
NOP();
oe_1l; //设置 UC1 输出使能
NOP();
dir_2h; //设置 UC2 方向为写
NOP();
oe_2l; //设置 UC2 输出使能
//while(1);
rd_fh; NOP(); NOP();
ale_fl; //ALE_4245 = 0 ALE置低
NOP(); NOP();
we_fl; //WE_4245 = 0 WE置低
NOP(); NOP();
rd_fh; //设置 FLASH 读为高
NOP();
cle_fh; //CLE_4245 = 1 CLE置高
NOP(); NOP();
PORTA = 0x90;NOP(); NOP();
//while(1);
we_fh; NOP();NOP();
cle_fl; NOP();NOP();
ale_fh;NOP();NOP(); NOP();
we_fl; NOP();NOP();
NOP();
//temp = (uchar)((block<<5)&0x00ff);//取低三位 a14---a16
temp=0;
PORTA=temp; //地址8-15位
we_fh; NOP();NOP();//WE_4245 = 1; //WE置高
ale_fl; //ALE_4245 = 0 ALE置低
NOP(); NOP();
for( i=0;i<10000;i++)
{ NOP();
//延时3ms以上
}
dir_1l; // RW_4245_1 = 0; //设置第一个4245方向为读
//OE_4245_1 = 0; //第一个4245使能输出
DDRA=0X00;
PORTA=0XFF;
rd_fh;NOP(); NOP(); //RE_4245 = 1 ;
rd_fl;NOP(); NOP();
COMP=PINA;
NOP(); NOP();
if(debug)
uart1_txd(COMP);//读成功返回 0XEC
rd_fh;NOP(); NOP(); //RE_4245 = 1 ;
rd_fl;NOP(); NOP();NOP();
COMP=PINA;
NOP();
if(debug)
uart1_txd(COMP);//读成功返回 0X73
oe_1h;//断开数据总线
}
/////////////////////////////////////////////////////////////////////////
uchar flash_erase(uint block)
{
uchar temp,COMP;
uint i;
DDRA = 0xff; //PORTA 变成输出口
dir_1h; //设置 UC1 方向为写
NOP();
oe_1l; //设置 UC1 输出使能
NOP();
dir_2h; //设置 UC2 方向为写
NOP();
oe_2l; //设置 UC2 输出使能
rd_fh; NOP(); NOP();
ale_fl; //ALE_4245 = 0 ALE置低
NOP(); NOP();
we_fl; //WE_4245 = 0 WE置低
NOP(); NOP();
rd_fh; //设置 FLASH 读为高
NOP();
cle_fh; //CLE_4245 = 1 CLE置高
NOP(); NOP();
PORTA = 0x60;NOP(); NOP();
we_fh; NOP();NOP();
cle_fl; NOP();NOP();
ale_fh;NOP();NOP();
we_fl; NOP();NOP();
NOP();
//temp = (uchar)((block<<5)&0x00ff);//取低三位 a14---a16
temp = (uchar)((block>>1)&0x00ff);
// (uchar)((change>>1) & 0x00ff);
//temp=0;
PORTA=temp; //地址8-15位
we_fh; NOP();NOP();//WE_4245 = 1; //WE置高
we_fl; NOP(); NOP();//WE_4245 = 0; //WE置低
//temp=(uchar)((block>>3)&0x00ff);
temp=(uchar)((block>>9)&0x00ff);//取高七位 共1024个BLOCK
//temp=0;
PORTA=temp; //地址16-23位
we_fh;NOP();NOP();//WE_4245 = 1; //WE置高
ale_fl;NOP();NOP();//ALE_4245 = 0; //ALE置低
cle_fh; NOP();NOP();//CLE_4245 = 1;
we_fl; NOP();NOP();/////WE_4245 = 0;
PORTA=0xd0;NOP(); //写入开始擦除命令
we_fh; NOP(); NOP();
cle_fl; NOP();NOP();//CLE_4245 = 0;
for( i=0;i<10000;i++)
{ NOP();
//延时3ms以上
}
ale_fl;NOP();NOP();// ALE_4245 = 0;
cle_fh;NOP();NOP(); // CLE_4245 = 1;
we_fl; NOP();NOP();/// WE_4245 =0;
PORTA=0x70; //写入读状态命令
we_fh; NOP(); NOP();// WE_4245 = 1;
cle_fl; NOP();NOP();// CLE_4245 = 0;
for(temp = 0;temp < 70;temp++)
NOP();
dir_1l; // RW_4245_1 = 0; //设置第一个4245方向为读
//OE_4245_1 = 0; //第一个4245使能输出
DDRA=0X00;
PORTA=0XFF;
rd_fh;NOP(); NOP(); //RE_4245 = 1 ;
rd_fl;NOP(); NOP();
COMP=PINA;
NOP(); NOP();
rd_fh;NOP();
if((COMP&0x01)==0)
{oe_1h;//断开数据总线
return 0;//擦除成功返回 0
}
else
{oe_1h;//断开数据总线
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -