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

📄 cfcard.c

📁 AVR读写CF卡的应用例子
💻 C
字号:
#include <atmega128.h>
#include <ina90.h>
#include <string.h>
#include <__debug_stdio.h>


#include "compactflash.h"
#include "delays.h"
#include "airdrop.h"


void printByte(unsigned char);
void printInt(unsigned int);


#define	make16(varhigh,varlow)	(((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)

#define NULL 0







void wr_cf_addr(unsigned int addr)
{
	addr_hi = 0xff&(addr>>8);//(make8(addr,1));
	addr_lo = addr & 0x00FF;
	
}

void wr_cf_reg(unsigned int reg_data,unsigned int reg_addr)
{
	TO_NIC;
	wr_cf_addr(reg_addr);
	data_out = reg_data;
	clr_WE;
	Delay10KTCYx(1);
	set_WE;
	FROM_NIC;
}
	
void wr_cf_io16(unsigned int data16,unsigned int addr)
{
	unsigned char i;

	wr_cf_addr(addr);
	data_out = data16&0xff;//LOW_BYTE(data16);
	TO_NIC;
	clr_IOWR;
	Delay10TCYx(1);
	set_IOWR;
	Nop();
	data_out = 0xFF;
	
	wr_cf_addr(addr+1);
	data_out = (data16>>8)&0xff;//HIGH_BYTE(data16);
	clr_IOWR;
	Delay10TCYx(1);
	set_IOWR;
	Nop();
	data_out = 0xFF;
	FROM_NIC;
}

void wr_cf_io8(unsigned char data8,unsigned int addr)
{
	

	wr_cf_addr(addr);
	data_out = data8;//LOW_BYTE(data16);
	TO_NIC;
	clr_IOWR;
	Delay10TCYx(1);
	set_IOWR;
	Nop();
	data_out = 0xFF;
	FROM_NIC;
}


unsigned char rd_cf_reg(unsigned int reg_addr)
{
	unsigned char data,i;
	wr_cf_addr(reg_addr);
	clr_OE;
	Delay10TCYx(1);
	data = data_in;
	set_OE;
	return(data);
}

unsigned char rd_cf_io8(unsigned int addr)
{
	unsigned char data8;

	wr_cf_addr(addr);
	clr_IORD;
	Delay10TCYx(2);
	data8=data_in;
	set_IORD;
	Nop();

	return(data8);
}
unsigned int rd_cf_io16(unsigned int addr)
{
	unsigned char data_lo,data_hi,i;
	unsigned int data16;

	wr_cf_addr(addr);
	clr_IORD;
	Delay10TCYx(2);
	data_lo=data_in;
	set_IORD;
	Nop();

	wr_cf_addr(addr+1);
	clr_IORD;
	Delay10TCYx(2);
	data_hi=data_in;
	set_IORD;
	Nop();
	data16 = make16(data_hi,data_lo);
	return(data16);
}




/***********************
/ CF management
/***********************/

void resetCF(void)
{
	SETUP_IO_PORTS;
	set_RSET;
	Delay100TCYx(1);
	FROM_NIC;
	clr_RSET;
}

void getCISTuples(void)
{
    unsigned int i;
    unsigned int cis_addr=0;

    unsigned char code_tuple,link_tuple;

    for(i=0;i<500;i++)
    {
        Delay10KTCYx(1);
        if(rd_cf_reg(0x0000)==1) break;
    }	

    do
    {
        code_tuple = rd_cf_reg(cis_addr);
        cis_addr+=2;	

        link_tuple = rd_cf_reg(cis_addr);	
        
        cis_addr+=2;  
        
        if(code_tuple != 0xFF)
      	{
            printf("%02x %02x\n",code_tuple,link_tuple);
            cis_addr+=2*link_tuple;
        }
    } while(code_tuple!=0xff);
}

unsigned char tupleInList(unsigned char tuple,unsigned char nTuples,unsigned char tuples[])
{
	unsigned char i;
	
	for(i=0;i<nTuples;i++) if(tuple==tuples[i]) return 1;
	return 0;
}

void getCISInfo(NetworkParameters *params,unsigned char nTuples,unsigned char tuples[])
{	
	
	unsigned char len;
	
	unsigned int cis_addr=0;	
	unsigned char code_tuple;			
    unsigned char link_tuple;           	
    unsigned char tuple_link_cnt;		
	
	unsigned int i;
	static unsigned char data[32];
	
	for(i=0;i<500;i++)
	{
		Delay10KTCYx(1);
		if(rd_cf_reg(0x0000)==1) break;
	}	
	
   initNetworkParameters(params);
	
	do
	{
   		code_tuple = rd_cf_reg(cis_addr);
        cis_addr+=2;	

        link_tuple = rd_cf_reg(cis_addr);	
        len=link_tuple;
        if(len>32) len=32;
        cis_addr+=2;  
        
	  	if(code_tuple != 0xFF)
      	{
	   		if(tupleInList(code_tuple,nTuples,tuples))
	   		{
       			for(tuple_link_cnt=0;tuple_link_cnt<link_tuple;++tuple_link_cnt)		
       			{	
      	 			if(tuple_link_cnt<len) data[tuple_link_cnt]=rd_cf_reg(cis_addr);
	         		cis_addr+=2;
				}
				addNetworkParameter(params,code_tuple,len,data);
			}
			else cis_addr+=2*link_tuple;
		}
	} while(code_tuple!=0xff);
}


static NetworkParameters CISInfo;

unsigned int getCORCONAddress(void)
{
	unsigned char tuples[]={CISTPL_CONFIG};
	unsigned char data[16];
	unsigned char length,label,i;
	
	getCISInfo(&CISInfo,(unsigned char)1,tuples);
	resetNetworkParameters(&CISInfo);
	while(getNextNetworkParameter(&CISInfo,&label,&length,data)) if(label==CISTPL_CONFIG) return make16(data[3],data[2]);
	return 0;
}





int getVoltage(unsigned char *data,unsigned char *pos)
{
	unsigned char c;
	unsigned int m;
	unsigned int h=0;
	
	c=data[(*pos)++];
	if(c&0x80) h=data[(*pos)++];
	m=(int)((0x7f&c)>>3);
	return h+50*m;
}

void getOperatingVoltage(int *min,int *max,int *nominal)
{
	unsigned char tuples[]={CISTPL_CFTABLE_ENTRY};
	unsigned char data[32];
	unsigned char length,label,i,paramSel,pos;
	
	getCISInfo(&CISInfo,(unsigned char)1,tuples);
	resetNetworkParameters(&CISInfo);
	*min=*max=*nominal=-1;
	while(getNextNetworkParameter(&CISInfo,&label,&length,data)) if(label==CISTPL_CFTABLE_ENTRY)
	{
		paramSel=data[3];
		pos=4;
		if(paramSel&1) *nominal=getVoltage(data,&pos);
		if(paramSel&2) *min=getVoltage(data,&pos);
		if(paramSel&4) *max=getVoltage(data,&pos);
	}
}

void getCardInfo(unsigned char *string)
{
    unsigned char tuples[]={CISTPL_VERS_1};

    unsigned char length,label,i;
  
    string[0]='\0';
    getCISInfo(&CISInfo,(unsigned char)1,tuples);
    resetNetworkParameters(&CISInfo);
    while(getNextNetworkParameter(&CISInfo,&label,&length,string))
    {
      if(label==CISTPL_VERS_1)
      {
        string[length]='\0';
        for(i=0;i<length;i++) if(string[i]==0x00) string[i]='_';
      }
    }

}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -