搜索
bottom↓
回复: 18

T5557与门禁种种

[复制链接]

出0入0汤圆

发表于 2011-6-18 15:25:24 | 显示全部楼层 |阅读模式
最近很烦恼,原因是参与T5557卡门禁系统设计项目。以下是写卡的最低层驱,哪位帮我看看哪里出问题了。
特别说明:本人基本实现读卡,但写卡一直写不了,请高手指点!!!!!!!!!!!!

写卡操作要不要进行曼码转换?        如果要,有没有具体的转换算法?

数据格式:00 0 00000000 00000000 00000000 000  (操作码2+锁定位1+数据位32+地址位3=38)
         

void SendCmd5557(unsigned char *cd, unsigned char mode)
{
        unsigned char ch=0, i, len;
        OSCTUNE = osctune_picc;
        EnableRFDecode();       
        if (mode & 0x80)   //1000 0000开始复位
        {
                RFOFF(); TMR0 = 0;       
        }
        len = mode & 0x3f;  //0011 1111   检查发送的位数
       
        for (i=0; i<len; i++)   //发送多少位
        {
                if ((i%8)==0) {ch = *cd++;}          //满8位指针换下一个字节
                while(TMR0<MaskGapS) {};            //开始间隙TMR0<54
                RFON();                              //
                if (ch & 0x80)        TMR0= 0;               
                else TMR0 = Mask5557_1-Mask5557_0;        //TMR0=42-16=26
                ch <<= 1;
                while(TMR0<Mask5557_1) {};          //TMR0<42
                RFOFF(); TMR0= MaskGapS-MaskGapW;        //TMR0=54-36=18
        }       
        DisableRFDecode();
        OSCTUNE = 0;
        if (mode & 0x40)  //0100 0000 发送完毕自动开始发自下一块
        {
                while(TMR0<MaskGapS) {};  //TMR0<54 开始间隙
                RFON();
        }
}

unsigned char BlockWrite5557(unsigned char block, unsigned char *key, unsigned char *sDat)
{
        unsigned char temp[3];
        unsigned char stu;
       
        temp[0] = 0x80 | ((block & 0x10) << 2);  //1100 0000或1000 0000
        temp[1] = (block & 0x08) << 4;           //1000 0000 0000
        temp[2] = (block & 0x07) << 5;           //1110 0000 0000
       
        SendCmd5557(&temp[0], 0x80 | 2);            //2位操件码
        if (key[0]) SendCmd5557(&key[1], 32);   //装载块0的32位       
        SendCmd5557(&temp[1], 1);                            //1位锁定位
        SendCmd5557(&sDat[0], 32);                     //32位数据位       
        SendCmd5557(&temp[2], 0x40 | 3);            //3位块地址位
       
        stu =1;
        return stu;
}

unsigned char WG_WriteT5557(unsigned char *sdat) //返回1有效
{
        unsigned char SysKey[] = {0x01, 0x01, 0x02, 0x02, 0x24};
        unsigned char i,ch,stu;
        for (i=0; i<6; i++)
        {
                for (ch=0; ch<3; ch++)
                {
                        stu = BlockWrite5557(i+1, &SysKey[0], &sdat[4*i]);
                }
                if (stu) break;
        }
        return stu;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-6-18 15:29:13 | 显示全部楼层
硬件没有问题的话,应该是时序问题。
读卡对时序要求不太严格,写卡就不一样了,好好看看技术手册的时序,再比较一下程序实际的时序。

出0入0汤圆

 楼主| 发表于 2011-6-21 08:38:06 | 显示全部楼层
嗯,是时序问题,在T5557说明书上的标准时序,上下值都试过了,还是不行。用示波器看又看不到变化……囧呀……

有没有哪位能把自己能写的间隙值让我参考一下呀?不胜感激!

出0入0汤圆

发表于 2011-6-21 08:45:09 | 显示全部楼层
#define START_TIME          280                    //起始延时时间         ---280us
#define SEND_ONE_TIME       432                    //发送 "  1  "时间     ---432us
#define SEND_ZERO_TIME      192                    //发送 "  0  "时间     ---192us
#define SEND_GAP_TIME       100                    //发送 " gap "时间     ---100us
#define STOP_TIME           5000                  //结束延时时间         ---6mS

#define READ_15P_TIME       310                   //读取1.5p时间         ---310us
#define READ_10P_TIME       278                   //读取1.0p时间         ---278us
#define READ_05P_TIME       176                   //读取0.5p时间         ---176us
#define READ_TIME_OUT       0x1000                //读取超时时间

这个肯定是没有问题的

出0入0汤圆

发表于 2011-6-21 09:17:35 | 显示全部楼层
LZ的读写模块用的U2270B还是自己搭的电路?

出0入0汤圆

 楼主| 发表于 2011-6-21 18:57:35 | 显示全部楼层
回复【4楼】qiushui
-----------------------------------------------------------------------

是自己搭的电路呀。

出0入228汤圆

发表于 2011-6-22 00:56:28 | 显示全部楼层
看我的贴,里面有时序图

出0入0汤圆

 楼主| 发表于 2011-6-23 15:46:06 | 显示全部楼层
可以写入了,但现在出现一个问题,就是为了提高写入准确性,想读回数据校验,卡编程完成之后立马返回的数据是不是就是我刚刚写进去的?

unsigned char BlockWrite5557(unsigned char block, unsigned char *key, unsigned char *sDat,unsigned char *rDat)
{
        unsigned char temp[3];
        unsigned char stu;
       
        temp[0] = 0x80 | ((block & 0x10) << 2);  //1100 0000或1000 0000
        temp[1] = (block & 0x08) << 4;           //1000 0000 0000
        temp[2] = (block & 0x07) << 5;           //1110 0000 0000
       
        SendCmd5557(&temp[0], 0x80 | 2);            //2位操件码
        if (key[0]) SendCmd5557(&key[1], 32);   //密码位       
        SendCmd5557(&temp[1], 1);                            //1位锁定位
        SendCmd5557(&sDat[0], 32);                     //32位数据位       
        SendCmd5557(&temp[2], 0x40 | 3);            //3位块地址位
       
        stu =1;
        if (GetPreamble()==0)   //捕捉头
        {
                if (ReadWord(rDat,4))  读入rDat[4]中……
                {
                        stu=0;
                }
        }
        return stu;
}

unsigned char WG_WriteT5557(unsigned char *sdat) //返回0有效
{
        unsigned char SysKey[] = {0x01, 0x01, 0x02, 0x02, 0x24};
        unsigned char i,ch,stu;
        unsigned char rdat[4];
        unsigned char text[4]={0xFF,0xFF,0xFF,0xFF};
        for (i=0; i<1; i++)        //试写块1
        {
                for (ch=0; ch<3; ch++)  //循环3次写入并校验
                {
                        stu = BlockWrite5557(i+1, &SysKey[0], &sdat[4*i],rdat);  //读取写入数据
                        eeprom_write_block(text,0x60,4);
                        eeprom_write_block(rdat,0x60,4);   返回的数据(32位)写入EEPROM便于观察
                        Sound(RED_LONG|1);
                        if (stu==0)
                        {
                                if (memcmp(&sdat[4*i],rdat,4)==0) break;   //比较数据正确就跳出
                                stu = 1;
                        }
                        if(stu==1) break;
                }
                if(stu==0) break;  //3次写入失败 stu=1;
        }
        return stu; //写入成功 stu=1;
}

出0入0汤圆

 楼主| 发表于 2011-6-23 22:59:17 | 显示全部楼层
重新整理思路,可以写入数据了!!!!!!!!!!!!!!!!!豁然开朗

现在只能实现块写,如果要实现把24个字节数全部写入到:块1~块7中时,每次都要像以下这样发吗?我想一次性写满1~6块的数据,但我每次只写了其中一块就退出来不再写其它数据了,这样变成如果要写满6块的数据,要尝试写好多次。源代码在下面,望过路的朋友指导一下怎么让我一次性写入24个字节的数据!!!!

2位操作码+32位密码位+1锁定位+32位数据+3块地址位
67ms(上电复位)+数据处理时间+5.6ms(编程时间)
对应如下源代码:

void SendCmd5557(unsigned char *cd, unsigned char mode)
{
        unsigned char ch=0, i, len;
       
        if (mode & 0x80)               //开始发送
        {   
                  RFON();
                  __delay_ms(67);       //上电延时
                RFOFF(); TMR0 = 0;           //开始间隙 GAPS:54个场时钟
        }
        len = mode & 0x3f;   //发送数据位
       
        for (i=0; i<len; i++)
        {
                if ((i%8)==0) {ch = *cd++;}
                while(TMR0<MaskGapS) {};
                RFON();
                if (ch & 0x80)        TMR0 = 0;           //发送数据“1”       
                else TMR0 = Mask5557_1-Mask5557_0;        //发送数据“0”
                ch <<= 1;
                while(TMR0<Mask5557_1) {};
                RFOFF(); TMR0 = MaskGapS-MaskGapW;        //GAPW 写间隙:36个场时钟
        }
       
        if (mode & 0x40)   //发送完毕
        {
                while(TMR0<MaskGapS) {};
                RFON();
                  __delay_ms(6);   //6ms的编程时间
                  RFOFF();
        }

出0入0汤圆

发表于 2011-7-2 22:47:17 | 显示全部楼层
这个卡片是每次只能写4个字节的,不能一次写24字节。

出0入0汤圆

 楼主| 发表于 2011-7-4 11:23:33 | 显示全部楼层
谢谢提醒!写卡已经准确无误了。在此感谢所有路过的大侠。

出0入0汤圆

发表于 2011-10-29 08:53:49 | 显示全部楼层
T5557卡 MARK!

出0入0汤圆

发表于 2012-2-18 10:59:37 | 显示全部楼层
回复【10楼】worksnfkpynn99 如影客
谢谢提醒!写卡已经准确无误了。在此感谢所有路过的大侠。
-----------------------------------------------------------------------

请问源程序哪里进行了改进呀?

出0入0汤圆

发表于 2012-6-13 11:34:37 | 显示全部楼层
T5557 mark!

出0入0汤圆

发表于 2012-8-25 13:03:56 | 显示全部楼层
T5557卡 MARK!

出0入0汤圆

发表于 2013-2-2 11:00:00 | 显示全部楼层
请问这个程序你是用的什么单片机和晶振是多少的,RF是多少的?

出0入0汤圆

发表于 2013-2-22 17:14:01 | 显示全部楼层
mark!标记下!

出0入0汤圆

发表于 2013-2-28 00:14:16 | 显示全部楼层
楼主,现在正在做T5557的东西,方便把你的程序发一份参考下么?不知道怎么读卡啊,资料不全!多谢了!邮箱:hbmyhuwei@163.com!非常感谢!很急用!

出0入0汤圆

发表于 2013-3-15 21:26:25 | 显示全部楼层
T5557 mark!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-17 14:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表