Вс июл 24, 2016 11:18:54
Вс июл 31, 2016 13:49:27
Вс сен 18, 2016 10:48:06
Чт сен 22, 2016 05:26:35
Чт сен 22, 2016 08:21:45
Чт сен 22, 2016 10:58:03
Чт сен 22, 2016 19:39:21
Чт сен 29, 2016 11:27:55
Сб ноя 12, 2016 21:06:48
//----------
//пауза Start Gap
//----------
void StartGap_4305(void)
{
FieldOff();
_delay_us(55*8);
FieldOn();
_delay_us(17*8);
}
//----------
//отправить единицу
//----------
void SendOne_4305(void)
{
FieldOn();
_delay_us(32*8);
//FieldOff();
}
//----------
//отправить ноль
//----------
void SendZero_4305(void)
{
FieldOff();
_delay_us(15*8);
FieldOn();
_delay_us(17*8);
//FieldOff();
}
//----------
//записать блок по адресу
//----------
void WriteEM4305(unsigned char addr,char b0,char b1,char b2,char b3)
{
unsigned char n;
//HIGHT - поле выключено
unsigned char data[4]={b0,b1,b2,b3};
StartGap_4305();
SendZero_4305();//logic bit
//шлём 0101
SendZero_4305();//CC0
SendOne_4305();//CC1
SendZero_4305();//CC2
SendOne_4305();//P
//шлём адрес слова (младший бит первый)
unsigned char p=0;
for(n=0;n<4;n++)
{
if (addr&(1<<n))
{
SendOne_4305();
p^=1;
}
else SendZero_4305();
}
//дополняющие нули и чётность
SendZero_4305();
SendZero_4305();
if (p==0) SendZero_4305();
else SendOne_4305();
//шлём данные
p=0;
for(n=0;n<4;n++)
{
unsigned char l_p=0;
for(unsigned char m=0;m<8;m++)
{
unsigned char mask=(1<<m);
if (data[n]&mask)
{
SendOne_4305();
l_p^=1;
p^=mask;
}
else SendZero_4305();
}
//шлём чётность по строкам
if (l_p==0) SendZero_4305();
else SendOne_4305();
}
//шлём чётность по столбцам
for(n=0;n<8;n++)
{
unsigned char mask=(1<<n);
if (p&mask) SendOne_4305();
else SendZero_4305();
}
//шлём 0
SendZero_4305();
FieldOn();
_delay_ms(500);
}
FieldOn();//включаем электромагнитное поле
_delay_ms(500);
//запись конфигурации (манчестер, RF/64, выдача слова 5)
WriteEM4305(4,0x5F,0x40,0x01,0x00);
FieldOn();//включаем электромагнитное поле
_delay_ms(500);
//запись ID карты в слово 5
WriteEM4305(5,id[1],id[2],id[3],id[4]);
FieldOn();//включаем электромагнитное поле
_delay_ms(500);
FieldOff();//отключаем электромагнитное поле
_delay_ms(500);
Сб ноя 19, 2016 18:39:00
//----------
//записать ID карты
//----------
void WriteCardID(unsigned char id[5])
{
static unsigned char RFID_Send_Buffer[8];//буфер записи RFID
static unsigned char RFID_Config[4];//буфер конфигурации RFID
unsigned char n;
//запись карты em4305
//в слова 5 и 6 карты EM4305 записываем UID (40 бит сначала конвертируем в 64 бита)
//задаём номер карты
RFIDBuffer[0]=id[0];
RFIDBuffer[1]=id[1];
RFIDBuffer[2]=id[2];
RFIDBuffer[3]=id[3];
RFIDBuffer[4]=id[4];
PrepareSendBuffer(RFIDBuffer,RFID_Send_Buffer);
//функция WriteEM4305Word требует прямой порядок бит, а после перекодирования порядок обратный - переставляем
for(n=0;n<8;n++)
{
unsigned char v=RFID_Send_Buffer[n];
RFID_Send_Buffer[n]=0;
unsigned char m;
for(m=0;m<8;m++)
{
unsigned char m1=(1<<m);
unsigned char m2=(128>>m);
if (v&m1) RFID_Send_Buffer[n]|=m2;
}
}
FieldOn();//включаем электромагнитное поле
_delay_ms(500);
//шлём логин
SendEM4305Login(0xFF,0xFF,0xFF,0xFF);
//запись конфигурации (манчестер, RF/64, выдача слова 6)
WriteEM4305Word(4,0x5F,0x80,0x01,0x00);
//запись ID карты в слова 5 и 6
WriteEM4305Word(5,RFID_Send_Buffer[0],RFID_Send_Buffer[1],RFID_Send_Buffer[2],RFID_Send_Buffer[3]);
WriteEM4305Word(6,RFID_Send_Buffer[4],RFID_Send_Buffer[5],RFID_Send_Buffer[6],RFID_Send_Buffer[7]);
FieldOff();//отключаем электромагнитное поле
_delay_ms(500);
}
//----------
//пауза FirstFieldStop для em4305
//----------
void FirstFieldStop_4305(void)
{
FieldOff();
_delay_us(6*8);
FieldOn();
_delay_us(12*8);
FieldOff();
_delay_us(40*8);
FieldOn();
_delay_us(17*8);
FieldOff();
}
//----------
//отправить единицу для em4305
//----------
void SendOne_4305(void)
{
FieldOn();
_delay_us(30*8);
}
//----------
//отправить ноль для em4305
//----------
void SendZero_4305(void)
{
FieldOff();
_delay_us(18*8);
FieldOn();
_delay_us(17*8);
}
//----------
//передать карте Em4305 блок данных 32 бита
//----------
void SendEM4305DataBlock(char b0,char b1,char b2,char b3)
{
unsigned char n;
unsigned char data[4]={b0,b1,b2,b3};
//шлём данные
unsigned char p=0;
for(n=0;n<4;n++)
{
unsigned char l_p=0;
p^=data[n];
for(unsigned char m=0;m<8;m++)
{
unsigned char mask=(1<<m);
if (data[n]&mask)
{
SendOne_4305();
l_p^=1;
}
else SendZero_4305();
}
//шлём чётность по строкам
if (l_p==0) SendZero_4305();
else SendOne_4305();
}
//шлём чётность по столбцам
for(n=0;n<8;n++)
{
unsigned char mask=(1<<n);
if (p&mask) SendOne_4305();
else SendZero_4305();
}
//шлём 0
SendZero_4305();
FieldOn();
_delay_ms(500);
}
//----------
//передать карте Em4305 логин
//----------
void SendEM4305Login(char b0,char b1,char b2,char b3)
{
FirstFieldStop_4305();
SendZero_4305();//'0'
//шлём 0011
SendZero_4305();//CC0
SendZero_4305();//CC1
SendOne_4305();//CC2
SendOne_4305();//P
//шлём данные
SendEM4305DataBlock(b0,b1,b2,b3);
}
//----------
//записать слово в Em4305
//----------
void WriteEM4305Word(unsigned char addr,char b0,char b1,char b2,char b3)
{
//HIGHT - поле выключено
FirstFieldStop_4305();
SendZero_4305();//'0'
//шлём 0101
SendZero_4305();//CC0
SendOne_4305();//CC1
SendZero_4305();//CC2
SendOne_4305();//P
//шлём адрес слова (младший бит первый)
unsigned char p=0;
for(unsigned char n=0;n<4;n++)
{
if (addr&(1<<n))
{
SendOne_4305();
p^=1;
}
else SendZero_4305();
}
//дополняющие нули и чётность
SendZero_4305();
SendZero_4305();
if (p==0) SendZero_4305();
else SendOne_4305();
//шлём данные
SendEM4305DataBlock(b0,b1,b2,b3);
}
Сб ноя 19, 2016 21:45:50
Сб ноя 19, 2016 23:17:16
Вс ноя 20, 2016 10:27:04
Вс ноя 20, 2016 11:37:44
Вс ноя 20, 2016 17:38:21
Пн ноя 21, 2016 19:12:25
Вс дек 04, 2016 04:11:31
da-nie писал(а):3) Код записи ключа я взял у BolshoyK ( http://kazus.ru/forums/showthread.php?t=101565 )
Вс дек 04, 2016 07:38:12
Вт дек 06, 2016 12:10:40
Вт дек 06, 2016 18:24:49