OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 126|回复: 4

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

[复制链接]

  离线 

1

主题

3

帖子

0

精华

新手上路

Rank: 1

积分
7
金钱
7
注册时间
2017-11-30
在线时间
2 小时
发表于 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;
                }

回复

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

485

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

新手上路

Rank: 1

积分
7
金钱
7
注册时间
2017-11-30
在线时间
2 小时
 楼主| 发表于 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,然并卵。
回复

使用道具 举报

  离线 

485

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-1-22 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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