新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2017-11-30
- 在线时间
- 3 小时
|
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;
}
|
|