?? card.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總線寫一個字節(jié)*/
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總線讀一個字節(jié)*/
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 '關(guān)閥' */
}
/*************************************************************************
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 + -