项目需要,自己设计了125khz模块,发现了一些不难但是较为耗时的点,需要注意的地方有两个:
1.脉冲宽度的区分,需要根据板载主芯片决定,根据机器周期得出定时器每加一次的时间长短,然后根据半个周期和一个周期的时间长度来确定参数,注意要囊括半个周期最短时间及最长时间,一个周期的最短时间及最长时间。参数的确定尤为重要,差一点可能导致读取数据错误,下面是普通12个机器周期51单片机使用11.0592MHz晶振时的参数设定:
11.0592MHz
#define TIME00 50 //54us
#define TIME05 260 //282us
#define TIME10 550 //597us
2.电压影响,常用的3.3V和5V电压在读卡的时候也会有影响,导致数据错误,在使用5V电压的时候,上升沿或下降沿的坡度变化时间长,当第二次时读取时,电压还没有完全变化,所以可能导致半个周期波形读取失败,一个周期因为时间较长,不会出现错误,但是读到的是稳定的错数据,无法通过后续的奇偶校验。当使用3.3V供电时,斜坡变化比较快,第二次读取的时候,电压已经变化了,所以3.3V的半周期读取时按照读取规则可以正常读取到。
unsigned char readdata()
{
switch(readbit())
{
case 1: //一个周期
return !bitin;
case 2: //半个周期
if(readbit()!=2) return 2; //再读一次半个周期
return !bitin; //3.3V使用
//return bitin; //5V使用
default:
return 2;
}
}