4100卡调试记录

2023-12-20 13:50
文章标签 调试 记录 4100

本文主要是介绍4100卡调试记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、参考资料

            参考文档

 

2、采集电路

 

         

3、采集流程

            1)CLK每隔250ms给一个40us的125KHZ方波,然后AD口检测高低电平来判断是不是有卡。当有卡的时候,卡会吸收线圈上的能量,导致AD口的电平为低

            2)如果检测到有卡,CLK持续给125KHZ的方波,OUT供高,运放工作,然后采集SINGER的数据。4100卡采用的是2K编码,用的是曼彻斯特编码格式,所以我们采集的速率至少要4K才能还原信号

            3)采集完一定数据量后开始解码

 

4、调试问题

           1)本来卡片读取没有问题,但是装在壳子里面发现,会一直检测到卡,这样功耗会增加,最后发现是由于天线是在主板下面,而且离主板又很近,板子是有铺地,导致能量全部被吸收。

 

5、代码

/*********************************************功能:4100驱动*输入:无*输出:无*条件:无*返回:无注意:
*********************************************/
static T_U8 u8SampleData[500];
static T_U8 u8SampleId[4];
T_VOID ID_Sample(T_VOID)
{T_U32 u32Cnt = 0;T_U32 u32Delay = 0;ID_OUT_H();ADVTIM_CtrlPWMOutputs(ADVTIM1, ENABLE);u32Delay = 5000; while(u32Delay--);memset(u8SampleData, 0, sizeof(u8SampleData));while(1){if(ID_SINGER_PORT->DI & ID_SINGER_PIN){u8SampleData[u32Cnt/8] |= (1 << (u32Cnt%8));}u32Delay = 290; while(u32Delay--);u32Cnt++;if(u32Cnt >= 8*sizeof(u8SampleData)){break;}}ID_OUT_L();ADVTIM_CtrlPWMOutputs(ADVTIM1, DISABLE);
}
T_U8* ID_GetId(T_U8 *pu8SpData, T_U32 u32SpLen)
{T_U32 u32Cnt = 0;T_U32 u32Step = 0;T_U32 u32NowFlg = 0,u32OldFlg = 0;T_U32 u32StartFlg = 0; //开始解码标志T_U32 u32LCnt = 0, u32HCnt = 0;T_U32 u32OneCnt = 0, u32OneFlg = 0;T_U32 u32BitCnt = 0;T_U8  u8BitArray[20] = {0};T_U32 u32Bit1Cnt = 0,u32Bit2Cnt = 0,u32Bit3Cnt = 0,u32Bit4Cnt = 0;memset(u8BitArray, 0 , sizeof(u8BitArray));//有找到起始码 或者 解码数据已经全部遍历while(u32Cnt < u32SpLen){u32NowFlg = (pu8SpData[u32Cnt/8]>>(u32Cnt%8)) & 0x1;if(u32OldFlg == 1 && u32NowFlg == 0){if(u32StartFlg){if(u32LCnt >= 3 && u32LCnt <= 5&& u32HCnt >= 3&& u32HCnt <= 5){if(1 == u32OneFlg){u8BitArray[u32BitCnt/5] |= (1 << (u32BitCnt%5));u32BitCnt++;if(u32BitCnt >= 55){goto Sample_Chk;}}u32OneCnt++;if(u32OneCnt == 9){u32OneFlg = 1;}}else if(u32HCnt >= 7 && u32HCnt <= 9 ){if(u32OneFlg){u8BitArray[u32BitCnt/5] |= (1 << (u32BitCnt%5));u32BitCnt+=2;if(u32BitCnt >= 55){goto Sample_Chk;}}u32Cnt += 4;//跳3u32OneCnt = 0;}else if(u32LCnt < 3 && u32HCnt >= 3&& u32HCnt <= 5){if(u32OneFlg){u32BitCnt++;if(u32BitCnt >= 55){goto Sample_Chk;}}u32Cnt += 4;//跳3u32OneCnt = 0;}else{u32OldFlg = u32NowFlg;u32OneCnt = 0;}}else{if(u32HCnt >= 7 && u32HCnt <= 9 ){u32Cnt += 4;u32StartFlg = 1;  //开始解码u32OneCnt = 0;}}u32LCnt = 0;u32HCnt = 0;}else{if(u32NowFlg){u32HCnt++;}else{u32LCnt++;}}u32Cnt++;			u32OldFlg = u32NowFlg;}return T_NULL;Sample_Chk :u8SampleId[0] = u8BitArray[2]&0xff;u8SampleId[0] += (u8BitArray[3]&0xff)*16;u8SampleId[1] = u8BitArray[4]&0xff;u8SampleId[1] += (u8BitArray[5]&0xff)*16;u8SampleId[2] = u8BitArray[6]&0xff;u8SampleId[2] += (u8BitArray[7]&0xff)*16;u8SampleId[3] = u8BitArray[8]&0xff;u8SampleId[3] += (u8BitArray[9]&0xff)*16;return u8SampleId;
#if 0	for(u32Cnt = 1; u32Cnt < 10; u32Cnt++){if(u8BitArray[u32Cnt]>>0 & 0x1){u32Bit1Cnt++;}if(u8BitArray[u32Cnt]>>1 & 0x1){u32Bit2Cnt++;}if(u8BitArray[u32Cnt]>>2 & 0x1){u32Bit3Cnt++;}if(u8BitArray[u32Cnt]>>3 & 0x1){u32Bit4Cnt++;}}if(u32Bit1Cnt % 2){u32Bit1Cnt = 1;}else{u32Bit1Cnt = 0;}if(u32Bit2Cnt % 2){u32Bit2Cnt = 1;}else{u32Bit2Cnt = 0;}if(u32Bit3Cnt % 2){u32Bit3Cnt = 1;}else{u32Bit3Cnt = 0;}if(u32Bit4Cnt % 2){u32Bit4Cnt = 1;}else{u32Bit4Cnt = 0;}if( (u32Bit1Cnt == (u8BitArray[10]>>0&0x01))&&(u32Bit2Cnt == (u8BitArray[10]>>1&0x01))&&(u32Bit3Cnt == (u8BitArray[10]>>2&0x01))&&(u32Bit4Cnt == (u8BitArray[10]>>3&0x01))	){u8SampleId[0] = u8BitArray[2]&0xff;u8SampleId[0] += (u8BitArray[3]&0xff)*16;u8SampleId[1] = u8BitArray[4]&0xff;u8SampleId[1] += (u8BitArray[5]&0xff)*16;u8SampleId[2] = u8BitArray[6]&0xff;u8SampleId[2] += (u8BitArray[7]&0xff)*16;u8SampleId[3] = u8BitArray[8]&0xff;u8SampleId[3] += (u8BitArray[9]&0xff)*16;return u8SampleId;}
#endif	return T_NULL;
}
T_U32 ID_ReadChk(T_VOID)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = ID_AD_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_Init(ID_AD_PORT, &GPIO_InitStruct);//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//GPIO_Init(ID_AD_PORT, &GPIO_InitStruct);//GPIO_ResetBits(ID_AD_PORT, ID_AD_PIN);ADVTIM_CtrlPWMOutputs(ADVTIM1, ENABLE);//while(1);T_U32 u32Delay = 150; //调成40uswhile(u32Delay--);ADVTIM_CtrlPWMOutputs(ADVTIM1, DISABLE);ID_AD_PORT->DIR |= (GPIO_PIN_OUT_MODE << (uint8_t)6);ID_AD_PORT->DOCL = ID_AD_PIN;u32Delay = 80; //不灵敏延长这里 增大灵敏增大while(u32Delay--);ID_AD_PORT->DIR &= ~(GPIO_PIN_OUT_MODE << (uint8_t)6);u32Delay = 10; //延时读数据while(u32Delay--);if(ID_AD_PORT->DI & ID_AD_PIN){ID_AD_PORT->DIR |= (GPIO_PIN_OUT_MODE << (uint8_t)6);ID_AD_PORT->DOCL = ID_AD_PIN;return 0;}else{return 1;}
}
T_VOID ID_ReadTask(T_VOID *pvData)
{if(1 == ID_ReadChk()){//有卡ID_Sample();T_U8 *pu8Data = T_NULL;pu8Data = ID_GetId(u8SampleData, 8*sizeof(u8SampleData));if(T_NULL != pu8Data){g_stGpioCtl.u8PopFlag = 1;g_stGpioCtl.stGpio.u8Type |= E_GPIO_READ_TYPE_ID;memcpy(g_stGpioCtl.stGpio.u8Data, pu8Data, 4);}}MDL_DRVTIMER_AddTimerRelative(ID_ReadTask, T_NULL, 250);
}
static T_VOID ID_Pwm_Init(T_VOID)
{ADVTIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;ADVTIM_OCInitTypeDef  TIM_OCInitStructure;GPIOD->AFR = 0x00100000;TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period = 186;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;ADVTIM_TimeBaseInit(ADVTIM1, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;ADVTIM_OC1Init(ADVTIM1, &TIM_OCInitStructure);ADVTIM_CtrlPWMOutputs(ADVTIM1, DISABLE);ADVTIM_Cmd(ADVTIM1, ENABLE);}static T_VOID ID_Init(T_VOID)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = ID_OUT_PIN;GPIO_Init(ID_OUT_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = ID_AD_PIN;GPIO_Init(ID_AD_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = ID_SINGER_PIN;GPIO_Init(ID_SINGER_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Pin = ID_CLK_PIN;GPIO_Init(ID_CLK_PORT, &GPIO_InitStruct);ID_OUT_L();ID_Pwm_Init();MDL_DRVTIMER_AddTimerRelative(ID_ReadTask, T_NULL, 250);}

 

 

这篇关于4100卡调试记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516277

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板