📄 card_pro.c
字号:
}
else if(i==2) //TCi
{
if(!ti) cpu_tc1=r_w_byte; //TC1决定发送字符间最小时间
else if(ti==1) cpu_tc2=r_w_byte; //TC2决定接收字符间最大时间
}
else if(i==1) //TDi---是否有TCK
{
if(r_w_byte&0x0f) cpu_tck=1; //TDi表示有TCK校验
ti++;
goto atr_cpu1;
}
}
temp=temp>>1;
}while(--i);
if(bw.byte.Hi) //有历史数据
{
i=bw.byte.Hi;
bw.byte.Hi+=atr_len;
do //读出历史字节:T1...Tk
{
error=rece_cpu_byte();
if(error)
{
bw.byte.Lo=error;
EA=1;
return bw.word;
}
*p=r_w_byte;
p++;
atr_len++;
if(atr_len==32) //数据超长出错
{
EA=1;
bw.byte.Lo=1;
return bw.word;
}
}while(--i);
}
else
bw.byte.Hi=atr_len;
if(cpu_tck) //有TCK校验
{
error=rece_cpu_byte(); //读出TCK校验值
if(error)
{
bw.byte.Lo=error;
EA=1;
return bw.word;
}
*p=r_w_byte;
p++;
atr_len++;
temp=0; //TCK校验
for(i=1;i<atr_len;i++) temp^=ptr[i];
if(temp) //异或校验出错
{
EA=1;
bw.byte.Lo=1;
return bw.word;
}
}
if(!cpu_tc2)
cpu_tc2=10;
switch(cpu_ta1&0x0f)
{
case 1:
cpu_d=1;
break;
case 2:
cpu_d=2;
break;
case 3:
cpu_d=4;
break;
case 4:
cpu_d=8;
break;
case 5:
cpu_d=16;
break;
case 6:
cpu_d=32;
break;
case 8:
cpu_d=12;
break;
case 9:
cpu_d=20;
break;
default:
break;
}
EA=1;
return bw.word;
}
//================================================================================
void card_vcc(uchar i)
{
if(i == 1)
{
IC_CARD_IO=1;
SAM_CARD_IO=1;
SetupPortB(Sim_pwr,0);
Writ_cpld(Sm_pwr,0);
En_cpu_clk(); //enable CPU 3.67M
En_sam_clk(); //enable SAM 3.67M
delayms(50);
}
else
{
SetupPortB(Sim_pwr,1);
Writ_cpld(Sm_pwr,1);
Dis_cpu_clk(); //disable CPU 3.67M
Dis_sam_clk(); //disable SAM 3.679M
delayms(50);
}
}
//===========================================================================
/*FLASH CARD 的操作*/
#ifdef RW_FLASH_CARD
/* AT45D041 FLASH CARD*/
#ifdef POLARITY_LOW
/****************************************************************/
/*写卡命令微指令*/
void w_flash_card(uchar byte) /* write flash card pluse */
{
uchar i=8;
//send_char(byte);
PSD8xx_reg.DIRECTION_C|=0x80;
r_w_byte=byte;
do
{
if(r_w_byte&0x80)
PSD8xx_reg.DATAOUT_C|=0x80;
else
PSD8xx_reg.DATAOUT_C&=0x7f;//FLASH_DI=HBIT;
FLASH_CARD_CLK=1;
FLASH_CARD_CLK=0;
r_w_byte=r_w_byte<<1;
}while(--i);
}
/*********************************************************/
/*读卡数据微指令*/
uchar r_flash_card(void) /* read flash card pluse */
{
uchar i=8;
FLASH_DO=1;
do
{
r_w_byte=r_w_byte<<1;
FLASH_CARD_CLK=1;
FLASH_CARD_CLK=0;
//LBIT=FLASH_DO;
if(FLASH_DO)
r_w_byte|=0x01;
}while(--i);
//send_char(r_w_byte);
return (r_w_byte);
}
#else //SPI_MODE
/****************************************************************/
/*写卡命令微指令*/
void w_flash_card(uchar byte) /* write flash card pluse */
{
uchar i=8;
PSD8xx_reg.DIRECTION_C|=0x80;
r_w_byte=byte;
do
{
FLASH_CARD_CLK=0;
if(r_w_byte&0x80)
PSD8xx_reg.DATAOUT_C|=0x80;
else
PSD8xx_reg.DATAOUT_C&=0x7f;//FLASH_DI=HBIT;
r_w_byte=r_w_byte<<1;
FLASH_CARD_CLK=1;
}while(--i);
}
/*********************************************************/
/*读卡数据微指令*/
uchar r_flash_card(void) /* read flash card pluse */
{
uchar i=8;
//FLASH_CARD_IO=1;
FLASH_DO=1;
do
{
r_w_byte=r_w_byte<<1;
FLASH_CARD_CLK=1;
FLASH_CARD_CLK=0;
//LBIT=FLASH_DO;
if(FLASH_DO)
r_w_byte|=0x01;
}while(--i);
return (r_w_byte);
}
#endif //POLARITY_LOW
/***********************************************************/
//读卡状态,空闲返回0,否则返回1
uchar read_card_status(void)
{
uint i=500;
do
{
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
_nop_ ( );
_nop_ ( );
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
Writ_cpld(Sm_cs,0);//FLASH_CARD_CS=0;
_nop_ ( );
_nop_ ( );
w_flash_card(STATUS_READ_COM);
r_flash_card();
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
//send_char(r_w_byte);
if((r_w_byte&0xc0)==0x80) return (0);
}while(--i);
return 1;
}
/**************************************************************/
//发送读FLASH卡缓冲区命令及地址
void read_flash_buffer(uint baddr)
{
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
_nop_ ( );
_nop_ ( );
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
Writ_cpld(Sm_cs,0);//FLASH_CARD_CS=0;
_nop_ ( );
_nop_ ( );
w_flash_card(BUFFER_READ_COM);
w_flash_card(0);
w_flash_card((baddr>>8)&0xff);
w_flash_card(baddr&0xff);
w_flash_card(0x0);
}
/**************************************************************/
//发送写FLASH卡缓冲区命令及地址
void write_flash_buffer(uint page,uint baddr)
{
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
Writ_cpld(Sm_cs,0);//FLASH_CARD_CS=0;
_nop_ ( );
_nop_ ( );
w_flash_card(BUFFER_WRITE_COM); /* command 82h write main page though buffer1 */
w_flash_card((page>>7)&0xff);
//send_char((page>>7)&0xff);
w_flash_card(((page<<1)|(baddr>>8))&0xff);
//send_char(((page<<1)|(baddr>>8))&0xff);
w_flash_card(baddr&0xff);
//send_char(baddr&0xff);
}
/********************************************************************/
//发送FLASH卡缓冲区与主存储区交换或比较命令及地址
uchar write_card_com(uchar command,uint page)
{
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
_nop_ ( );
_nop_ ( );
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
Writ_cpld(Sm_cs,0);//FLASH_CARD_CS=0;
_nop_ ( );
_nop_ ( );
w_flash_card(command);
w_flash_card((page>>7)&0xff);
w_flash_card((page<<1)&0xff);
w_flash_card(0x0);
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
return(read_card_status());
}
#if 0
/********************************************************************/
//发送直接阵列或页方式读FLASH卡命令及地址
void array_page_read(uchar command,uint page,uint baddr)
{
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
_nop_ ( );
_nop_ ( );
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
Writ_cpld(Sm_cs,0);//FLASH_CARD_CS=0;
_nop_ ( );
_nop_ ( );
w_flash_card(command);
w_flash_card((page>>7)&0xff);
w_flash_card(((page<<1)|(baddr>>8))&0xff);
w_flash_card(baddr&0xff);
w_flash_card(0x0);
w_flash_card(0x0);
w_flash_card(0x0);
w_flash_card(0x0);
}
#endif
/**************************************************************/
// FLASH CARD卡的上电
void Reset_flash_card1(void)
{
//select_card_type(FLASH_CARD);
Writ_cpld(Sm_pwr,0);//card_vcc(1);
Writ_cpld(Sm_rst,1);//IC_CARD_RST=1;
delayms(25);
Writ_cpld(Sm_rst,0);//IC_CARD_RST=0;
delayms(250);
Writ_cpld(Sm_rst,1);//IC_CARD_RST=1;
delayms(1000);
}
#ifdef FLASH_BUFFER //缓冲区模式
/**************************************************************/
/*BUFFER READ*/
uchar read_flash_card1(ulong addr,uint leng,uchar xdata *str)
{
uint sector,card_addr;
Reset_flash_card1();
sector=(addr/0x108)&0xfff;
if(sector>=MAXPAGE) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=(addr%0x108)&0x1ff;//页的起始地址
//FLASH卡主存储区数据读到缓冲区
if(write_card_com(BUFFER_SECTOR_COM,sector))
{
Writ_cpld(Sm_pwr,1);
return 1;
}//{card_vcc(0);return 1;}
//发送读FLASH缓冲区命令及地址
read_flash_buffer(card_addr);
do
{
*str=r_flash_card(); //读1字节缓冲区数据
//send_char(*str);
str++;
card_addr++;
if((card_addr>=MAXBYTE)&&(leng!=1))
{
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif //HIGH
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
sector++;
if(sector>=MAXPAGE) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=0;
//FLASH卡主存储区数据读到缓冲区
if(write_card_com(BUFFER_SECTOR_COM,sector)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
//发送读FLASH缓冲区命令及地址
read_flash_buffer(card_addr);
}
}while(--leng);
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
Writ_cpld(Sm_pwr,1);//card_vcc(0);
return 0;
}
#endif //FLASH_BUFFER
#ifdef FLASH_PAGE //页模式
/**************************************************************/
/*PAGE READ*/
uchar read_flash_card1(ulong addr,uint leng,uchar xdata *str)
{
uint sector,card_addr;
Reset_flash_card1();
sector=(addr/0x108)&0xfff;
if(sector>=MAXPAGE) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=(addr%0x108)&0x1ff;
//发送直接页方式读FLASH卡主存储区命令及地址
array_page_read(PAGE_READ_COM,sector,card_addr);
do
{
*str=r_flash_card(); //读1字节FLASH卡主存储区数据
str++;
card_addr++;
if((card_addr>=MAXBYTE)&&(leng!=1))
{
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif //HIGH
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
sector++;
if(sector>=MAXPAGE) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=0;
array_page_read(PAGE_READ_COM,sector,card_addr);
}
}while(--leng);
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
Writ_cpld(Sm_pwr,1);//card_vcc(0);
return 0;
}
#endif //FLASH_PAGE
#ifdef FLASH_ARRAY //阵列模式
/**************************************************************/
/*PAGE READ*/
uchar read_flash_card1(ulong addr,uint leng,uchar xdata *str)
{
uint sector,card_addr;
Reset_flash_card1();
sector=(addr/0x108)&0xfff;
if(sector>=MAXPAGE) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=(addr%0x108)&0x1ff;
//发送直接阵列方式读FLASH卡主存储区命令及地址
array_page_read(ARRAY_READ_COM,sector,card_addr);
do
{
*str=r_flash_card(); //读1字节FLASH卡主存储区数据
str++;
}while(--leng);
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif //HIGH
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
Writ_cpld(Sm_pwr,1);//card_vcc(0);
return 0;
}
#endif //FLASH_ARRAY
uchar read_flash_card(ulong addr,uint leng,uchar xdata *str)
{
uchar i;
uint crcnum;
if(initial_flash_card())return 1;
for(i=0;i<3;i++)
{
if(read_flash_card1(addr,leng,str))
{
delayms(250); //卡放电时间
continue;
}
//send_str(leng,str);
crcnum=crcxdata(leng,str);
if(read_flash_card1(addr,leng,str))
{
delayms(250); //卡放电时间
continue;
}
//send_str(leng,str);
if(crcnum==crcxdata(leng,str)) return 0;
}
return 1;
}
/*******************************************************************/
uchar write_flash_card1(ulong addr,uint leng,uchar xdata *str)
{
uchar card_data;
uint sector,card_addr;
Reset_flash_card1();
sector=(addr/0x108)&0xfff;//264 byte
if(sector>=(MAXPAGE-1)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=(addr%0x108)&0x1ff;
//FLASH卡主存储区数据读到缓冲区
if(write_card_com(BUFFER_SECTOR_COM,sector)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
//发送写缓冲区命令及地址
write_flash_buffer(sector,card_addr);
do
{
card_data=*str;
str++;
w_flash_card(card_data); //写1字节到缓冲区
//send_char(card_data);
card_addr++;
if((card_addr>=MAXBYTE)&&(leng!=1))
{
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
if(read_card_status()) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
//缓冲区数据写到FLASH卡主存储区
if(write_card_com(BUFFER_RWRITE_COM,sector)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
sector++;
if(sector>=(MAXPAGE-1)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
card_addr=0;
//FLASH卡主存储区数据读到缓冲区
if(write_card_com(BUFFER_SECTOR_COM,sector)) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
//发送写缓冲区命令及地址
write_flash_buffer(sector,card_addr);
}
}while(--leng);
#ifdef HIGH
FLASH_CARD_CLK=1;
#else
FLASH_CARD_CLK=0;
#endif
_nop_ ( );
_nop_ ( );
Writ_cpld(Sm_cs,1);//FLASH_CARD_CS=1;
if(read_card_status()) {Writ_cpld(Sm_pwr,1);return 1;}//{card_vcc(0);return 1;}
if(write_card_com(BUFFER_RWRITE_COM,sector)) {Writ_cpld(Sm_pwr,1);return 1;}//card_vcc(0);return 1;}
Writ_cpld(Sm_pwr,1);//card_vcc(0);
return 0;
}
/*******************************************************************/
uchar write_flash_card(ulong addr,uint leng,uchar xdata *str)
{
uchar i;
uchar xdata buf[1030];
uchar xdata *pointer;
uint length,crcnum;
pointer=str;
if(initial_flash_card())
{return 1;}
while(1)
{
if(leng>1024) length=1024;
else length=leng;
crcnum=crcxdata(length,pointer);
for(i=0;i<3;i++)
{
if(write_flash_card1(addr,length,pointer))
{
delayms(250); //卡放电时间
continue;
}
if(read_flash_card(addr,length,buf)) return 1;
if(crcnum==crcxdata(length,buf)) break;
}
if(i==3) return 1;
pointer+=length;
addr+=length;
leng-=length;
if(!leng) return 0;
}
}
/**************************************************************/
uchar initial_flash_card(void) /* FLASH CARD卡的上电及卡确认*/
{
uchar i,error;
for(i=0;i<3;i++)
{
Reset_flash_card1();
error=read_card_status();
Writ_cpld(Sm_pwr,1);//card_vcc(0);
if(error)
{
delayms(250);
continue;
}
if((r_w_byte&0x38)==0x18) return 0;
delayms(250);
continue;
}
return 1;
}
#endif //RW_FLASH_CARD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -