AS608指纹模块的调试与具体代码实现
AS608模块引脚:
序号 | 名称 | 说明 | 技术特性 |
---|---|---|---|
1 | Vi | 模块电源正输入端 | 主供电引脚(范围参考手册值) |
2 | Tx | 串行数据输出端 | TTL逻辑电平(兼容3.3V/5V系统) |
3 | Rx | 串行数据输入端 | TTL逻辑电平(需外部控制器驱动) |
4 | GND | 信号接地端 | 与电源地内部直连 |
5 | WAK | 感应信号输出 | 高电平有效(非接触触发信号) |
6 | Vt | 触摸感应电源输入 | 低压供电端(建议.3V) |
7 | U+ | USB D+数据线 | USB通信差分信号正极 |
8 | U- | USB D-数据线 | USB通信差分信号负极 |
验证AS608模块是否可以正常使用
我们通过上位机和CH341 USB转TTL模块来进行验证。
AS608与CH341接线如图,接完后插入电脑USB口中:
序号 | AS608 | CH341 |
---|---|---|
1 | Vi | VCC |
2 | Tx | Rx |
3 | Rx | Tx |
4 | GND | GND |
注意:两个跳线帽,一个接TTL,一个接3.3V
我这里使用的是厂商资料里自带的上位机软件。
第一步:打开设备连接,选择我们的端口型号(在设备管理器中可查看)
第二步:把手指放在指纹模块上,点击获取图像,如果图像获取成功,则证明我们的AS608指纹模块是完好无损,可正常使用的。
AS608与CH32开发板进行串口通信
AS608与CH32V307ZET6开发板接线如图(我们使用的是CH32的串口7):
序号 | AS608 | CH32 |
---|---|---|
1 | Vi | 3.3V |
2 | Tx | PC2 |
3 | Rx | PC3 |
4 | GND | GND |
5 | WAK | PA1 |
6 | Vt | 3.3V |
串口7主要函数
/* 变量声明 */
uint8_t uart7_rec_string[20]={0}; //串口7接收数组
uint8_t uart7_rec_index; //串口7接收索引值
uint8_t uart7_rec_tick; //串口7接收时间
uint8_t mode; //指纹工作模式,0-验证指纹,1-录入指纹
uint8_t ps_wait_flag;
uint8_t as608_proc_flag; //指纹处理标志位 0-未检测到手指,1-已检测到手指
uint8_t as608_proc_flag_old; //上一次的指纹处理标志位
uint8_t as608_store_index=1; //flash存放位置索引值
uint8_t ps_wait_flag; //等待标志位 0-退出等待函数,1-执行等待函数
/* 串口7初始化函数 */
void Uart7_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART7 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//2TX 3RX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_Init(UART7, &USART_InitStructure);
USART_ITConfig(UART7, USART_IT_RXNE,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = UART7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(UART7, ENABLE);
USART_ClearFlag(UART7,USART_FLAG_TC);//清空串口7的发送标志位
}
/* 串口7中断 */
void UART7_IRQHandler(void)
{
u8 temp=0;
if(USART_GetITStatus(UART7, USART_IT_RXNE) != RESET)
{
ps_wait_flag=0;//复位等待标志位
if(uart7_rec_tick>10)uart7_rec_index=0;//超过10毫秒没接收到数据时,串口7接收索引值归零
temp=USART_ReceiveData(UART7);
uart7_rec_string[uart7_rec_index]=temp;//接收串口7的数据,并依次存储到数组里面
uart7_rec_index++;//串口7接收索引值++
uart7_rec_tick=0;//串口7接收时间归零
}
USART_ClearITPendingBit(UART7, USART_IT_RXNE);
}
/* 串口7快速中断 */
void UART7_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
/* 串口7发送数据函数 */
void uart7_send_string(u8* string,u8 len)
{
u8 i;
for(i=0;i<len;i++)
{
USART_SendData(UART7,string[i]);
while( USART_GetFlagStatus(UART7, USART_FLAG_TC)==0 );
}
}
注意:串口7快速中断,需要放在main.c中。
AS608.c源文件
/* AS608初始化函数 */
void as608_init()
{
Uart7_Init();
}
按两次指纹登录一个模板存入flash指纹库的流程框图:
从传感器读入现场指纹搜索从 10—100 的指纹库区间的流程框图:
ps_getimage():录入图像函数
/* 从传感器中读取图像存于图像缓存区 */
void ps_getimage()
{
//Get_Image的指令包
uint8_t string[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};
uart7_send_string(string,12);//发送给指纹模块
}
ps_genchar():生成特征函数
/* 生成特征,并存放在buffer中 */
void ps_genchar(uint8_t buffer)
{
//PS_GenChar的指令包
uint8_t string[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x04,0x02,buffer,0x00,0x01+0x00+0x04+0x02+buffer};
uart7_send_string(string,13);//发送给指纹模块
}
ps_storechar():储存模板
/* 存入flash指纹库 */
void ps_storechar(uint8_t addr)
{
//PS_StoreChar的指令包
u8 string[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x06,0x06,0x02,0x00,addr,0x00,0x01+0x00+0x06+0x06+0x02+0x00+addr};
uart7_send_string(string,15);
}
PS_Search():验证指纹
/* 验证指纹 */
void PS_Search()
{
u8 string[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x08,0x04,0x02,0x00,0x00,0x00,0xff,0x01,0x0e};
uart7_send_string(string,17);
}
PS_Empty():清空指纹
/* 清空指纹 */
void PS_Empty()
{
u8 string[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x0d,0x00,0x11};
uart7_send_string(string,12);
}
As608_Gpio_Init():配置AS608指纹识别模块的控制引脚
/*初始化*/
void As608_Gpio_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
Ps_Wait():等待函数
void Ps_Wait()
{
ps_wait_flag=1; // 设置等待标志位
do
{
Delay_Ms(200); // 200毫秒延时
}
while(ps_wait_flag); // 循环直到标志位清零
}
AS608_proc():指纹处理函数
void AS608_proc()
{
as608_proc_flag = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);//读取连接AS608模块的PA1引脚当前电平,高电平(WAK有效,表示检测到手指触摸)
if(as608_proc_flag == as608_proc_flag_old) return;//比较当前状态与前一次状态,如果状态未发生变化(相同),则立即退出函数
as608_proc_flag_old = as608_proc_flag;//更新历史状态
if(as608_proc_flag == 0)return;//抬起时就return
if(mode == 1)//录入指纹
{
// 第一次采集
ps_getimage();//获取指纹图像到暂存区
ps_wait();//等待接收数据包
ps_genchar(1);//存放到 buffer1 中
ps_wait();//等待接收数据包
// 第二次采集
ps_getimage();//获取指纹图像到暂存区
ps_wait();//等待接收数据包
ps_genchar(2);//存放到 buffer2 中
ps_wait();//等待接收数据包
// 合成存储
ps_regmode1();//合成特征
ps_wait();//等待接收数据包
ps_storechar(as608_store_index);//存入flash模块区
as608_store_index++;//更新索引
ps_wait();//等待接收数据包
mode = 0;//mode回到验证指纹模式
}
if(mode == 0)//验证指纹
{
// 单次采集
ps_getimage();//获取指纹图像到暂存区
ps_wait();//等待接收数据包
ps_genchar(2);//存放到 buffer2 中
ps_wait();//等待接收数据包
// 匹配识别
PS_Search();//: 以 CharBuffer1 或 CharBuffer2 中的特征文件搜索整个或部分指纹库。若搜索到,则返回页码
ps_wait();//等待接收数据包
// 结果判断
if(uart7_rec_string[13] > 50)//指纹匹配,匹配分数阈值判断
{
}
else//指纹不匹配
{
}
}
}