一、 简介as608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(synochip)的 as608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于as608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。
三、 as608模块引脚描述vi 模块电源正输入端。
tx 串行数据输出。ttl 逻辑电平
rx 串行数据输入。ttl 逻辑电平
gnd 信号地。内部与电源地连接
wak 感应信号输出,默认高电平有效
(用户可读取状态引脚(wak)判断有无手指按下)
vt 触摸感应电源输入端,.3v 供电
u+ usb d+
u- usb d-
四、开发流程
程序as608.h#ifndef __as608_h #define __as608_h #include #include stm32f10x.h #define as608_user 1 #define ps_sta pain(6)//读指纹模块状态引脚 #define charbuffer1 0x01 #define charbuffer2 0x02 extern u32 as608addr;//模块地址 typedef struct { u16 pageid;//指纹id u16 mathscore;//匹配得分}searchresult; typedef struct { u16 ps_max;//指纹最大容量 u8 ps_level;//安全等级 u32 ps_addr; u8 ps_size;//通讯数据包大小 u8 ps_n;//波特率基数n}syspara; void ps_stagpio_init(void);//初始化pa6读状态引脚 u8 ps_getimage(void); //录入图像 u8 ps_genchar(u8 bufferid);//生成特征 u8 ps_match(void);//精确比对两枚指纹特征 u8 ps_search(u8 bufferid,u16 startpage,u16 pagenum,searchresult *p);//搜索指纹 u8 ps_regmodel(void);//合并特征(生成模板) u8 ps_storechar(u8 bufferid,u16 pageid);//储存模板 u8 ps_deletchar(u16 pageid,u16 n);//删除模板 u8 ps_empty(void);//清空指纹库 u8 ps_writereg(u8 regnum,u8 data);//写系统寄存器 u8 ps_readsyspara(syspara *p); //读系统基本参数 u8 ps_setaddr(u32 addr); //设置模块地址 u8 ps_writenotepad(u8 notepagenum,u8 *content);//写记事本 u8 ps_readnotepad(u8 notepagenum,u8 *note);//读记事 u8 ps_highspeedsearch(u8 bufferid,u16 startpage,u16 pagenum,searchresult *p);//高速搜索 u8 ps_validtempletenum(u16 *validn);//读有效模板个数 u8 ps_handshake(u32 *ps_addr); //与as608模块握手 const char *ensuremessage(u8 ensure);//确认码错误信息解析 #endifas608.c#include #include delay.h #include usart2.h#include as608.hu32 as608addr = 0xffffffff; //默认//初始化pa6为下拉输入 //读摸出感应状态(触摸感应时输出高电平信号)void ps_stagpio_init(void){ rcc- >apb1enr |= 1< crl &=0xf0ffffff;//复位pa6 gpioa- >crl |=0x08000000;//输入模式,默认下拉 gpioa- >odr &=~(1< sr&0x40)==0); usart2- >dr = data;}//发送包头static void sendhead(void){ myusart_senddata(0xef); myusart_senddata(0x01);}//发送地址static void sendaddr(void){ myusart_senddata(as608addr >>24); myusart_senddata(as608addr >>16); myusart_senddata(as608addr >>8); myusart_senddata(as608addr);}//发送包标识,static void sendflag(u8 flag){ myusart_senddata(flag);}//发送包长度static void sendlength(int length){ myusart_senddata(length >>8); myusart_senddata(length);}//发送指令码static void sendcmd(u8 cmd){ myusart_senddata(cmd);}//发送校验和static void sendcheck(u16 check){ myusart_senddata(check >>8); myusart_senddata(check);}//判断中断接收的数组有没有应答包//waittime为等待中断接收数据的时间(单位1ms)//返回值:数据包首地址static u8 *judgestr(u16 waittime){ char *data; u8 str[8]; str[0]=0xef;str[1]=0x01;str[2]=as608addr >>24; str[3]=as608addr >>16;str[4]=as608addr >>8; str[5]=as608addr;str[6]=0x07;str[7]='\\0'; usart2_rx_sta=0; while(--waittime) { delay_ms(1); if(usart2_rx_sta&0x8000)//接收到一次数据 { usart2_rx_sta=0; data=strstr((const char*)usart2_rx_buf,(const char*)str); if(data) return (u8*)data; } } return 0;}//录入图像 ps_getimage//功能:探测手指,探测到后录入指纹图像存于imagebuffer。//模块返回确认字u8 ps_getimage(void){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x03); sendcmd(0x01); temp = 0x01+0x03+0x01; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//生成特征 ps_genchar//功能:将imagebuffer中的原始图像生成指纹特征文件存于charbuffer1或charbuffer2 //参数:bufferid -- > charbuffer1:0x01 charbuffer1:0x02 //模块返回确认字u8 ps_genchar(u8 bufferid){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x04); sendcmd(0x02); myusart_senddata(bufferid); temp = 0x01+0x04+0x02+bufferid; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//精确比对两枚指纹特征 ps_match//功能:精确比对charbuffer1 与charbuffer2 中的特征文件 //模块返回确认字u8 ps_match(void){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x03); sendcmd(0x03); temp = 0x01+0x03+0x03; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//搜索指纹 ps_search//功能:以charbuffer1或charbuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。//参数: bufferid @ref charbuffer1 charbuffer2//说明: 模块返回确认字,页码(相配指纹模板)u8 ps_search(u8 bufferid,u16 startpage,u16 pagenum,searchresult *p){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x08); sendcmd(0x04); myusart_senddata(bufferid); myusart_senddata(startpage >>8); myusart_senddata(startpage); myusart_senddata(pagenum >>8); myusart_senddata(pagenum); temp = 0x01+0x08+0x04+bufferid +(startpage >>8)+(u8)startpage +(pagenum >>8)+(u8)pagenum; sendcheck(temp); data=judgestr(2000); if(data) { ensure = data[9]; p- >pageid =(data[10]< mathscore=(data[12]< >8); myusart_senddata(pageid); temp = 0x01+0x06+0x06+bufferid +(pageid >>8)+(u8)pageid; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure; }//删除模板 ps_deletchar//功能: 删除flash数据库中指定id号开始的n个指纹模板//参数: pageid(指纹库模板号),n删除的模板个数。//说明: 模块返回确认字u8 ps_deletchar(u16 pageid,u16 n){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x07); sendcmd(0x0c); myusart_senddata(pageid >>8); myusart_senddata(pageid); myusart_senddata(n >>8); myusart_senddata(n); temp = 0x01+0x07+0x0c +(pageid >>8)+(u8)pageid +(n >>8)+(u8)n; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//清空指纹库 ps_empty//功能: 删除flash数据库中所有指纹模板//参数: 无//说明: 模块返回确认字u8 ps_empty(void){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x03); sendcmd(0x0d); temp = 0x01+0x03+0x0d; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//写系统寄存器 ps_writereg//功能: 写模块寄存器//参数: 寄存器序号regnum:4\\5\\6//说明: 模块返回确认字u8 ps_writereg(u8 regnum,u8 data){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x05); sendcmd(0x0e); myusart_senddata(regnum); myusart_senddata(data); temp = regnum+data+0x01+0x05+0x0e; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; if(ensure==0) printf(\\r\\n设置参数成功!); else printf(\\r\\n%s,ensuremessage(ensure)); return ensure;}//读系统基本参数 ps_readsyspara//功能: 读取模块的基本参数(波特率,包大小等)//参数: 无//说明: 模块返回确认字 + 基本参数(16bytes)u8 ps_readsyspara(syspara *p){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x03); sendcmd(0x0f); temp = 0x01+0x03+0x0f; sendcheck(temp); data=judgestr(1000); if(data) { ensure = data[9]; p- >ps_max = (data[14]< ps_level = data[17]; p- >ps_addr=(data[18]< <24)+(data[19]< <16)+(data[20]< ps_size = data[23]; p- >ps_n = data[25]; } else ensure=0xff; if(ensure==0x00) { printf(\\r\\n模块最大指纹容量=%d,p- >ps_max); printf(\\r\\n对比等级=%d,p- >ps_level); printf(\\r\\n地址=%x,p- >ps_addr); printf(\\r\\n波特率=%d,p- >ps_n*9600); } else printf(\\r\\n%s,ensuremessage(ensure)); return ensure;}//设置模块地址 ps_setaddr//功能: 设置模块地址//参数: ps_addr//说明: 模块返回确认字u8 ps_setaddr(u32 ps_addr){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x07); sendcmd(0x15); myusart_senddata(ps_addr >>24); myusart_senddata(ps_addr >>16); myusart_senddata(ps_addr >>8); myusart_senddata(ps_addr); temp = 0x01+0x07+0x15 +(u8)(ps_addr >>24)+(u8)(ps_addr >>16) +(u8)(ps_addr >>8) +(u8)ps_addr; sendcheck(temp); as608addr=ps_addr;//发送完指令,更换地址 data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; as608addr = ps_addr; if(ensure==0x00) printf(\\r\\n设置地址成功!); else printf(\\r\\n%s,ensuremessage(ensure)); return ensure;}//功能:模块内部为用户开辟了256bytes的flash空间用于存用户记事本,// 该记事本逻辑上被分成 16 个页。//参数: notepagenum(0~15),byte32(要写入内容,32个字节)//说明: 模块返回确认字u8 ps_writenotepad(u8 notepagenum,u8 *byte32){ u16 temp; u8 ensure,i; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(36); sendcmd(0x18); myusart_senddata(notepagenum); for(i=0;i< 32;i++) { myusart_senddata(byte32[i]); temp += byte32[i]; } temp =0x01+36+0x18+notepagenum+temp; sendcheck(temp); data=judgestr(2000); if(data) ensure=data[9]; else ensure=0xff; return ensure;}//读记事ps_readnotepad//功能:读取flash用户区的128bytes数据//参数: notepagenum(0~15)//说明: 模块返回确认字+用户信息u8 ps_readnotepad(u8 notepagenum,u8 *byte32){ u16 temp; u8 ensure,i; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x04); sendcmd(0x19); myusart_senddata(notepagenum); temp = 0x01+0x04+0x19+notepagenum; sendcheck(temp); data=judgestr(2000); if(data) { ensure=data[9]; for(i=0;i>8); myusart_senddata(startpage); myusart_senddata(pagenum >>8); myusart_senddata(pagenum); temp = 0x01+0x08+0x1b+bufferid +(startpage >>8)+(u8)startpage +(pagenum >>8)+(u8)pagenum; sendcheck(temp); data=judgestr(2000); if(data) { ensure=data[9]; p- >pageid =(data[10]< mathscore=(data[12]< <8) +data[13]; } else ensure=0xff; return ensure;}//读有效模板个数 ps_validtempletenum//功能:读有效模板个数//参数: 无//说明: 模块返回确认字+有效模板个数validnu8 ps_validtempletenum(u16 *validn){ u16 temp; u8 ensure; u8 *data; sendhead(); sendaddr(); sendflag(0x01);//命令包标识 sendlength(0x03); sendcmd(0x1d); temp = 0x01+0x03+0x1d; sendcheck(temp); data=judgestr(2000); if(data) { ensure=data[9]; *validn = (data[10]< <8) +data[11]; } else ensure=0xff; if(ensure==0x00) { printf(\\r\\n有效指纹个数=%d,(data[10]< <8)+data[11]); } else printf(\\r\\n%s,ensuremessage(ensure)); return ensure;}//与as608握手 ps_handshake//参数: ps_addr地址指针//说明: 模块返新地址(正确地址) u8 ps_handshake(u32 *ps_addr){ sendhead(); sendaddr(); myusart_senddata(0x01); myusart_senddata(0x00); myusart_senddata(0x00); delay_ms(200); if(usart2_rx_sta&0x8000)//接收到数据 { if(//判断是不是模块返回的应答包 usart2_rx_buf[0]==0xef &&usart2_rx_buf[1]==0x01 &&usart2_rx_buf[6]==0x07 ) { *ps_addr=(usart2_rx_buf[2]< <24) + (usart2_rx_buf[3]< <16) +(usart2_rx_buf[4]< <8) + (usart2_rx_buf[5]); usart2_rx_sta=0; return 0; } usart2_rx_sta=0; } return 1; }//模块应答包确认码信息解析//功能:解析确认码错误信息返回信息//参数: ensureconst char *ensuremessage(u8 ensure) { const char *p; switch(ensure) { case 0x00: p=ok;break; case 0x01: p=数据包接收错误;break; case 0x02: p=传感器上没有手指;break; case 0x03: p=录入指纹图像失败;break; case 0x04: p=指纹图像太干、太淡而生不成特征;break; case 0x05: p=指纹图像太湿、太糊而生不成特征;break; case 0x06: p=指纹图像太乱而生不成特征;break; case 0x07: p=指纹图像正常,但特征点太少(或面积太小)而生不成特征;break; case 0x08: p=指纹不匹配;break; case 0x09: p=没搜索到指纹;break; case 0x0a: p=特征合并失败;break; case 0x0b: p=访问指纹库时地址序号超出指纹库范围; case 0x10: p=删除模板失败;break; case 0x11: p=清空指纹库失败;break; case 0x15: p=缓冲区内没有有效原始图而生不成图像;break; case 0x18: p=读写 flash 出错;break; case 0x19: p=未定义错误;break; case 0x1a: p=无效寄存器号;break; case 0x1b: p=寄存器设定内容错误;break; case 0x1c: p=记事本页码指定错误;break; case 0x1f: p=指纹库满;break; case 0x20: p=地址错误;break; default : p=模块返回确认码有误;break; } return p; }刷指纹void press_fr(void){ searchresult seach; u8 ensure; ensure=ps_getimage(); if(ensure==0x00)//获取图像成功 { ensure=ps_genchar(charbuffer1); if(ensure==0x00) //生成特征成功 { ensure=ps_highspeedsearch(charbuffer1,0,300,&seach); if(ensure==0x00)//搜索成功 { printf(search the fingerprint successfully\\n);//搜索指纹成功 printf(match id:%d match score:%d\\n,seach.pageid,seach.mathscore);//显示匹配指纹的id和分数 if(seach.pageid==0) led=0; } else { printf(%c,ensure); led=1; } } else printf(%c,ensure); delay_ms(1000);//延时后清除显示 printf(\\n); }}录入指纹
void add_fr(void){ u8 i=0,ensure ,processnum=0; u16 id; while(1) { switch (processnum) { case 0: i++; printf(please finger\\n); //请按手指 ensure=ps_getimage();//录入图像返回字 if(ensure==0x00) { ensure=ps_genchar(charbuffer1);//生成特征 if(ensure==0x00) { printf(zhengque\\n);//指纹正确 i=0; processnum=1;//跳到第二步 } else printf(%c\\n,ensure); } else printf(%c\\n,ensure); break; case 1: i++; printf(please click on the finger\\n);//再按一次手指 ensure=ps_getimage(); if(ensure==0x00) { ensure=ps_genchar(charbuffer2);//生成特征 if(ensure==0x00) { printf(fingerprint right\\n);//指纹正确 i=0; processnum=2;//跳到第三步 }else printf(%c,ensure); }else printf(%c,ensure); break; case 2: printf(comparing two fingerprints\\n); //对比两次指纹 ensure=ps_match();//精确比对两枚指纹特征返回字 if(ensure==0x00) { printf(two fingerprints is the same\\n);//两次指纹是一样的 processnum=3;//跳到第四步 } else { printf(comeparative failure,please press fingers again\\n);//对比失败,请重新按手指 printf(%c,ensure); i=0; processnum=0;//跳回第一步 } delay_ms(1000); break; case 3: printf(generate a fingerprint template\\n);//产生一个指纹模板 ensure=ps_regmodel(); if(ensure==0x00) { printf(generate a fingerprint template is successful\\n);//生成指纹模板成功 processnum=4;//跳到第五步 }else {processnum=0;printf(%c,ensure);} delay_ms(1000); break; case 4: printf(input the id and press enter to save\\n);//输入id并按“enter”保存 printf(0=< id <=299\\n); do { id++; } while(!(id< 300));//输入di必须小于300 ensure=ps_storechar(charbuffer2,id);//储存模板 if(ensure==0x00) { printf(add the fingerprint successfully\\n);//添加指纹成功 ps_validtempletenum(&validn);//读库指纹个数 printf(%d\\n,as608para.ps_max-validn);//显示剩余指纹个数 delay_ms(1500);//延时后清除显示 printf (\\n); return ; }else {processnum=0; printf(%c\\n,ensure);} break; } delay_ms(800); if(i==5)//超过5次没有按手指则退出 { printf(\\n); break; } }}
新能源汽车有哪些优势_比传统汽车的优势在哪里
GaN 助力电源的效率和小型化
芯盾时代入选年度成长力10强,获评未来网络安全中坚力量
3D打印机多少钱一台,如何挑选一台性价比高的3D打印机
电平标准RS485接口学习笔记
AS608指纹识别模块简介
COVID-19加速了对5G技术的需求
物联网网关与plc怎么连接?
基于晶体管的麦克风前置放大器电路图
什么原因会使变压器发出异常音响?
新款iPhone或抛弃“刘海屏”
彩虹五无人机试飞成功,正式进入批量生产阶段
苹果第五代4K版Apple TV 和印度产iPhoneSE或将年内上市
利亚德表示未来将提高LED影像显示领域市占率
雷神911黑武士Ⅱ代游戏主机评测 一键超频功能简单易用
比亚迪海豚的热泵空调系统
同内存版本差价400!OPPO华为千元5G谁更具性价比?
深开鸿携手行业伙伴助力公路数字化转型升级
信号串扰的原理、实例以及实现步骤
Imagination公司的战略设想和发展规划