⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 card_pro.c

📁 一些经常用到的单片机底层驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			}
			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 + -