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

📄 card.c

📁 M37546产品群智能水表的解决方案,请需要的朋友下载
💻 C
字号:
/************************************************************************/
/* Renesas System Solutions (Beijing) Co., LTD.							*/
/* All rights reserved.													*/
/*																		*/
/* File Name		: card.c											*/
/* Description		: 													*/
/*																		*/
/* Current Version	: 1.0												*/
/* Designer			: Feng Jun											*/
/* Start Date		: 2006-11-6											*/
/* Complete Date	: 2006-11-22										*/
/*																		*/
/* Lastest Version	:													*/
/* Designer			:													*/
/* Start Date		: 													*/
/* Complete Date	: 													*/
/************************************************************************/
#include "main.h"


#define DELAY_TIME 2 /* Delay time */
#define TRUE 1
#define FALSE 0

extern void DELAY(unsigned int t);
extern void EEPROMReadNBytes(char *buffer, char n, char addr);
extern void EEPROMWriteNBytes(char addr, char n, char *buffer);
extern void TimerAStart(void);

char cardbuffer[32];
char g_cardstatus;

/*************************************************************************
Name: 			CardCoding
Parameters: 	None
Returns: 		None
Description: 	CardCoding
*************************************************************************/
void CardCoding(char *buffer, char n)
{
	int i;
	for (i=0; i<n; i++)
	{
		buffer[i] ^= 0xa5;
	}

/* other operation such as encrypt */



}
/*************************************************************************
Name: 			CardDecode
Parameters: 	None
Returns: 		None
Description: 	CardDecode
*************************************************************************/
char CardDecode(char *buffer, char n)
{
	int i;
	char sumtemp = 0;
	
	for (i=0; i<n; i++)
	{
		buffer[i] ^= 0xa5;
	}
/* other operation such as encrypt */
	g_cardstatus = buffer[1];			/* Command word */
	
	for (i=0; i<buffer[2]; i++)
	{
		sumtemp += buffer[3+i];
	}
	
/* 	Check checksum */
//	if (sumtemp != buffer[28])
//	{
//		g_cardstatus = 0xff;			/* Not card for this system */
//	}
	
}

/*************************************************************************
Name: 			CardI2CStart
Parameters: 	None
Returns: 		None
Description: 	START CONDITION: A high-to-low transition of io_cardDAT with 
				io_cardCLK high is a start condition which must precede any
				other command.
*************************************************************************/
void CardI2CStart(void)
{
	io_cardDAT = 1;
	io_cardCLK = 1;
	DELAY(DELAY_TIME);
	io_cardDAT = 0;
	DELAY(DELAY_TIME);
	io_cardCLK = 0;
	DELAY(DELAY_TIME);
}

/*************************************************************************
Name: 			CardI2CStop
Parameters: 	None
Returns: 		None
Description: 	STOP CONDITION: A low-to-high transition of io_cardDAT with
				io_cardCLK high is a stop condition. After a read sequence,
				the	stop command will place the E2PROM in a standby power mode.
*************************************************************************/
void CardI2CStop(void)
{
	io_cardDAT = 0;
	io_cardCLK = 1;
	DELAY(DELAY_TIME);
	io_cardDAT = 1;
	DELAY(DELAY_TIME);
	io_cardCLK = 0;
	DELAY(DELAY_TIME);
}

/*************************************************************************
Name: 			CardSend0
Parameters: 	None
Returns: 		None
Description: 	Send 0 to Card, 
*************************************************************************/
void CardSend0(void)   /* SEND ACK */
{
	io_cardDAT = 0;
	io_cardCLK = 1;
	DELAY(DELAY_TIME);
	io_cardCLK = 0;
	DELAY(DELAY_TIME);
}

/*************************************************************************
Name: 			CardSend1
Parameters: 	None
Returns: 		None
Description: 	Send 1 to Card
*************************************************************************/
void CardSend1(void)
{
	io_cardDAT = 1;
	io_cardCLK = 1;
	DELAY(DELAY_TIME);
	io_cardCLK = 0;
	DELAY(DELAY_TIME);
}

/*************************************************************************
Name: 			CardCheckAck
Parameters: 	None
Returns: 		None
Description: 	ACKNOWLEDGE: All addresses and data words are serially
				transmitted to and from the E2PROM in 8 bit words.
				The E2PROM sends a zero to acknowledge that it has received
				each word. This happens during the ninth clock cycle.
*************************************************************************/
char CardCheckAck(void)
{
	bit F0;
	io_cardDAT = 1;
	io_cardCLK = 1;
	ioD_cardDAT = 0; 		/* Change io_cardDAT input */
	DELAY(DELAY_TIME/2);
	F0 = io_cardDAT;
	DELAY(DELAY_TIME/2);
	io_cardCLK = 0;
	DELAY(DELAY_TIME);
	ioD_cardDAT = 1;		/* Output */
	
	if(F0 == 1)
	{
		return FALSE;
	}
	else return TRUE;
}

/*************************************************************************
Name: 			CardWriteI2CByte
Parameters: 	b
Returns: 		none
Description: 	Write a byte to I2C
*************************************************************************/
void CardWriteI2CByte(char b)
{
/*向I2C总线写一个字节*/
	char i;
	for(i=0; i<8; i++)
	if((b<<i) & 0x80)
	{
		CardSend1();
	}
	else CardSend0();
}

 

/*************************************************************************
Name: 			CardReadI2CByte
Parameters: 	none
Returns: 		b
Description: 	Write a byte to I2C
*************************************************************************/
char CardReadI2CByte(void)
{
/*从I2C总线读一个字节*/
	char b = 0;
	char i;
	
	ioD_cardDAT = 0;		/* io_cardDAT input */
	
	for(i=0; i<8; i++)
	{
		bit F0;
		io_cardCLK = 1;
		DELAY(DELAY_TIME);
		F0 = io_cardDAT;
		DELAY(DELAY_TIME);
		io_cardCLK = 0;
		if(F0 == 1)
		{
			b = b<<1;
			b = b|0x01;
		}
		else b = b<<1;
	}
	ioD_cardDAT = 1;		/* io_cardDAT output */

	return b;
}




/*************************************************************************
Name: 			CardWriteOneByte
Parameters: 	addr:Card address, data
Returns: 		none
Description: 	Write one byte to Card
*************************************************************************/
//void CardWriteOneByte(char addr, char data)
//{
//	char acktemp = 1;
//
//	CardCoding(&data, 1);			/* Coding */
//	
//	CardI2CStart();
//	CardWriteI2CByte( 0xa0 );
//	acktemp = CardCheckAck();
//	CardWriteI2CByte( addr );		/* Address */
//	acktemp = CardCheckAck();
//	CardWriteI2CByte( data );		/* data */
//	acktemp = CardCheckAck();
//	CardI2CStop();
//}

/*************************************************************************
Name: 			CardWriteNBytes
Parameters: 	addr:Card address, data
Returns: 		none
Description: 	Write one byte to Card
*************************************************************************/
void CardWriteNBytes(char addr, char n, char *buffer)
{
	char addrbak = addr;				/* Bakup parameters */
	char nbak = n;

	char i;
	char itimes = 0;					/* read times */
	char acktemp = 0;
	
	CardCoding(buffer, n);			/* Coding */

	while ( itimes<3 && acktemp==0 )	/* if there is an error, write 3 times */
	{
		addr = addrbak;					/* Review parameters */
		n = nbak;
		
		for (i=0; i<n; i++)
		{
			CardI2CStart();
	
			CardWriteI2CByte( 0xa0 );		/* Send command */
			acktemp = CardCheckAck();
			CardWriteI2CByte( addr );		/* Send address */
			acktemp = CardCheckAck(); 
			CardWriteI2CByte( buffer[i] );/* Send data */
			acktemp = CardCheckAck();
		
			CardI2CStop();
			DELAY(DELAY_TIME);
			addr++;
		}
		itimes++;
	}

	if (acktemp == 0)
	{
		B_errorcard = 1;				/* Card error */
	}	
	
}

/*************************************************************************
Name: 			CardWriteAPage
Parameters: 	none
Returns: 		none
Description: 	
*************************************************************************/
/*void CardWriteAPage(char *buffer, char addr)
{
	char acktemp = 1;
	bit wrtmp;
	int i;

	CardI2CStart();
	CardWriteI2CByte( 0xa0 );
	acktemp = CardCheckAck();
	CardWriteI2CByte( addr );
	acktemp = CardCheckAck();
	for(i=0; i<7; i++)
	{
		CardWriteI2CByte( buffer[i] );
		if(!CardCheckAck())
		{
			CardI2CStop();
		}
	 }

	CardI2CStop();
}
*/

/*************************************************************************
Name: 			CardReadOneByte
Parameters: 	addr:Card address, data
Returns: 		none
Description: 	Read one byte from Card
*************************************************************************/
//char CardReadOneByte(char addr)
//{
//	char acktemp = 1;
//	char mydata;
//
//	CardI2CStart();
//	CardWriteI2CByte(0xa0);
//	acktemp = CardCheckAck();
//	CardWriteI2CByte(addr);			/* Address */
//	acktemp = CardCheckAck();
//	CardI2CStart();
//	CardWriteI2CByte(0xa1);
//	acktemp = CardCheckAck();


//	mydata = CardReadI2CByte();
//	acktemp = CardCheckAck();

//	if (acktemp == 1)
//	{
//		B_errorcard = 1;			/* Card error */
//	}
//	else
//	{
//		CardDecode(&mydata, 1);			/* Decode */
//	}
	
//	CardI2CStop();
//	return mydata;
//}

/*************************************************************************
Name: 			CardReadNBytes
Parameters: 	none
Returns: 		none
Description: 	
*************************************************************************/
void CardReadNBytes(char *buffer, char n, char addr)
{
	char nbak = n;
	char addrbak = addr;
	char acktemp = 0;
	char i;
	char itimes = 0;

	while ( itimes<1 && acktemp==0 )	/* if there is an error, read 1 times */
	{
		addr = addrbak;					/* Review parameters */
		n = nbak;

		CardI2CStart();
		CardWriteI2CByte(0xa0);
		acktemp = CardCheckAck();
		CardWriteI2CByte(addr);			/* address */
		acktemp = CardCheckAck();
		CardI2CStart();
		CardWriteI2CByte(0xa1);

		acktemp = CardCheckAck();

		for(i=0; i<n; i++)
		{
			buffer[i] = CardReadI2CByte();
			if(i != n-1)
			CardSend0();			/* Send Acknowledge */
			else
			CardSend1();			/* Send no acknowledge */
		}
		
		CardI2CStop();
		itimes++;
	}

	CardDecode(buffer, n);

	if (acktemp == 0)
	{
		B_errorcard = 1;				/* Card error */
	}	
}

 
/**************************************************************************************************

Description: 	PROCESS FUCTION CARDS

**************************************************************************************************/
void ProcessOpenCard(void)			/* Open an account */
{
				B_timerA3s = 1;
				TimerAStart();		/* TimerA start */
}
void ProcessUserCard(void)			/* User's card */
{
				B_timerA3s = 1;
				TimerAStart();		/* TimerA start */
}
void ProcessCollectCard(void)		/* Collect data */
{
				B_timerA3s = 1;
				TimerAStart();		/* TimerA start */
}
void ProcessSettingCard(void)		/* Setting meter */
{
				B_timerA3s = 1;
				TimerAStart();		/* TimerA start */
}
 
/*************************************************************************
Name: 			ProcessTestCard
Parameters: 	None
Returns: 		None
Description: 	Test card, if the water meter is an null meter, then write
				5 ton water to water meter.
*************************************************************************/
void ProcessTestCard(void)
{
	EEPROMReadNBytes(cardbuffer, 3, 0x04);			/* User's number */
	if (cardbuffer[0]==0 && cardbuffer[1]==0 && cardbuffer[2]==0)
	{												/* NULL meter */
		cardbuffer[0]=0xff;
		cardbuffer[1]=0xff;
		cardbuffer[2]=0xff;
		EEPROMWriteNBytes(0x04, 3, cardbuffer);		/* Write user's number */
		cardbuffer[0]=0;
		cardbuffer[1]=0;
		cardbuffer[2]=0x05;
		EEPROMWriteNBytes(0x13, 3, cardbuffer);		/* Write user's surplus */
		
		B_openvalve = 1;							/* Open the valve */
	}
	else 
	{
		B_errorcard = 1;							/* Not NULL meter, display '读卡错' */
		g_statusA = 3;
		B_timerA3s = 1;
		TimerAStart();		/* TimerA start */

	}
	
}

/*************************************************************************
Name: 			ProcessClearCard
Parameters: 	None
Returns: 		None
Description: 	Clear the information of water meter
*************************************************************************/
void ProcessClearCard(void)
{
	int i;
/* Same as the operation power up at the first time */
//	EEPROMReadNBytes(cardbuffer, 0x1c, 0);		/* Read information at the EEPROM */
	
	cardbuffer[0] = 0x68;
	for (i=1; i<0x1c; i++)
	{
		cardbuffer[i] = 0;
	}
	cardbuffer[8] = 2;		/* Threshold of display warning */
	cardbuffer[10] = 2;		/* Threshold of closing valve warning */
	cardbuffer[12] = 3;		/* Limit of purchase */
	cardbuffer[13] = 0xe8;
	
	EEPROMWriteNBytes(0, 0x1c, cardbuffer);	/* Water meter initial */
	
	B_closevalve = 1;		/* Close the valve */
	B_dispvalve = 1;		/* Display '关阀' */
}

/*************************************************************************
Name: 			ProcessCard
Parameters: 	None
Returns: 		None
Description: 	Card has been inserted, check the type of card and process 
				the corresponding task
*************************************************************************/
void ProcessCard(void)
{
//	int i;
	io_GNDcontrol = 1;			/* Connect GND of card to GND of board */
/* test */	
//	for (i=0; i<40; i++)
//	{
//		cardbuffer[i] = 21+2*i;
//	}
//	CardWriteNBytes(0x50, 40, cardbuffer);
/* test end */
	CardReadNBytes(cardbuffer, 0x1e, 0);	/* Read information at IC card */
	
	
	if (cardbuffer[0]==0xff && cardbuffer[1]==0xff)
	{							/* Not the card for this system */
		io_GNDcontrol = 0;		/* Disconnect GND */
		g_cardstatus = 0;		/* Error */
	}
	
	switch ( g_cardstatus )
	{
		case 0x01:		
					ProcessOpenCard();		/* Open an account */
					g_statusA = 3;
					break;
		case 0x02:		
					ProcessUserCard();		/* Process User's card */
					break;
		case 0x04:		
					ProcessCollectCard();	/* Collect information of water meter */
					g_statusA = 3;
					break;
		case 0xa5:		
					ProcessSettingCard();	/* Setting water meter */
					g_statusA = 3;
					break;
		case 0xa4:
					ProcessTestCard();		/* Process card for test */
					g_statusA = 3;
					break;
		case 0xa6:
		case 0xa7:		
					ProcessClearCard();		/* Clear information of water meter */
					g_statusA = 3;
					break;
		case 0x00:	
		default :
					B_errorcard = 1;		/* Mark error card */
					g_statusA = 3;
					B_timerA3s = 1;
					TimerAStart();		/* TimerA start */
					break;
	}
	
	io_GNDcontrol = 0;		/* Disconnect GND */
}

⌨️ 快捷键说明

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