OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2616|回复: 4

GPIO模拟IC卡通信的数据过程中出现偶发错误

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-11-30
在线时间
3 小时
发表于 2017-11-30 14:56:12 | 显示全部楼层 |阅读模式
10金钱
请问一下:
我在使用M3内核的MH1902芯片的GPIO对IC卡进行通信,模拟原本IC卡专用芯片对其的各种操作,目的是舍弃原有的那张专用芯片,直接使用GPIO进行操作
现在在发送一帧数据(10位)的过程中会偶然出现发送的某一位被莫名拉长的情况,导致被卡片误判成两位造成数据错误和校验出错
这种错误不一定出现,出现的位置也不固定(第几帧,第几位),有时完全正常,有时又会出现(要错也只错一位,其他帧其他位都正常),发送流程的装载计时器和上下拉电平操作都已放在中断中执行,定时时间也是const变量且没有改动它的操作,误差都已经通过示波器减去,基本能够将每一位(不出错的)的持续时间维持在正确的值上
目前只知道卡片波特率不同这个错误出现的概率也不同,波特率越大,位持续时间越短,这个错误的出现概率就越大
我求助这个错误可能的症结在哪,如何让它不要随机出现错误……下面附上一部分代码
中断外:
        set_iomux_pad(EM_ICCARDIO_PIN,MUX_CONFIG_ALT1,0,0);
        TIM_WaitEnd(TIMM0, TIM_5, (Count - 0x00000208));//这边是由于IO驱动能力不足,在设置成输出之后需延迟一段时间才能正常发送,否则前几位乃至第一帧会消失
        ptTempPara->TIM_Flag = INTR_FLAG_APDU;
        ptTempPara->Tag = 0;
        gpio_set_level(EM_ICCARDIO_PIN,0);
        TIM_WaitEnd(TIMM0, TIM_5, Count);//该延时函数是等到中断结束后才算执行完毕
        while(ptTempPara->Tag != 10)
        {
        }
        ……………………………………//后续操作

中断内:
        case INTR_FLAG_APDU:
                {
                        TIM_Cmd(TIMM0,TIM_5,DISABLE);
                        ptTempPara->Tag++;
                        if(ptTempPara->Tag < 10)
                        {
                                gpio_set_level(EM_ICCARDIO_PIN,ptTempPara->SendBuffer[ptTempPara->Tag]);
                                TIM5_Charge(ETUCount-0x0000010A);//这个函数只装载定时器,并不等待其中断结束
                        }
                        break;
                }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-11-30
在线时间
3 小时
 楼主| 发表于 2017-11-30 14:58:33 | 显示全部楼层
在此之前我的定时器中断优先级已经被我设置成最高
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-1 00:28:42 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-11-30
在线时间
3 小时
 楼主| 发表于 2017-12-1 14:41:50 | 显示全部楼层
我不信邪想改一下系统中断的优先级,然而用了下列函数他直接就HardFault 0x03给我扔出来了……

        /*NVIC_SetPriority(TIM0_5_IRQn,0x00);
       
        NVIC_SetPriority(NonMaskableInt_IRQn,0x01);
        NVIC_SetPriority(MemoryManagement_IRQn,0x02);
        NVIC_SetPriority(BusFault_IRQn,0x01);
        NVIC_SetPriority(UsageFault_IRQn,0x03);
        NVIC_SetPriority(SVCall_IRQn,0x04);
        NVIC_SetPriority(DebugMonitor_IRQn,0x05);
        NVIC_SetPriority(PendSV_IRQn ,0x06);
        NVIC_SetPriority(SysTick_IRQn ,0x07);*/
其他的外设中断优先级在初始化的时候都是15(PriorityGroup0),之前我把定时器中断升到了0,然并卵。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-3 01:19:02 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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