找回密码
 注册

微信扫码登录

使用验证码登录

只需一步,快速开始

胜天工科技销售各种数字电视信号调制卡胜天工科技销售各种数字电视信号码流卡

【游客、新手、注册会员的区别】 【积分策略和会员晋级说明】 【发帖和附件上传规则】 【如何下载感兴趣的资料】 【如何获取梦游币】 【侵权资料处理及免责说明】
查看: 1974|回复: 1

6410 io口配置为输出模式两种不同写法造成bug

[复制链接]
  • TA的每日心情
    擦汗
    2013-7-5 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2012-3-29 12:39:48 | 显示全部楼层 |阅读模式
    分享到:
    消息来自- 浙江杭州
    近期在做磁条刷卡器的驱动,需要通过两个IO口输出高低电平序列将磁条刷卡器开机初始化为新模式。 我按照Datasheet 写好后,怎么调试都无法进入新模式。给厂家打电话也无法解决。最总决定重写所有代码,很凑巧的搞定了。对比错误代码,和正确代码:

    运行良好的代码1:

    VOID IO_set_StrobeHigh()
    {
        v_pIOPregs->GPPCON = (v_pIOPregs->GPPCON & (~(0x3 << 16))) | (0x1 << 16);
        v_pIOPregs->GPPDAT |= 0x01 << 8;
    }
    VOID IO_set_StrobeLow()
    {
        v_pIOPregs->GPPCON = (v_pIOPregs->GPPCON & (~(0x3 << 16))) | (0x1 << 16);
        v_pIOPregs->GPPDAT &= ~(0x01 << 8);
    }


    无法得到结果的代码2:

    VOID IO_set_StrobeHigh()
    {
        v_pIOPregs->GPPCON &= (~(0x03 << 16));
        v_pIOPregs->GPPCON |= 0x01 << 16;
        v_pIOPregs->GPPDAT |= 0x01 << 8;
    }

    VOID IO_set_StrobeLow()
    {
        v_pIOPregs->GPPCON &= (~(0x03 << 16));
        v_pIOPregs->GPPCON |= 0x01 << 16;
        v_pIOPregs->GPPDAT &= ~(0x01 << 8[col
    or=#0000cc])
    ;
    }


    事后比较两处代码,在示波器上看到得波形完全一样。但是结果确不一样。


    后来询问高手,意见不一,大致如下:

    总结一下大家的回答:
    1. 编译器问题:
      1.1 编译器将代码2作为8位来处理得。
      针对这个,我将代码修改为:
    C/C++ code
    VOID IO_set_strobe_H()
    {
        v_pIOPregs->GPPCON &=  (~(0x00000003 << 16));
        v_pIOPregs->GPPCON |= 0x00000001 << 16;
        v_pIOPregs->GPPDAT |= 0x00000001 << 8;
    }
    VOID IO_set_strobe_L()
    {
        v_pIOPregs->GPPCON &=  (~(0x00000003 << 16));
        v_pIOPregs->GPPCON |= 0x00000001 << 16;
        v_pIOPregs->GPPDAT &= ~(0x00000001 << 8);
    }



    重新测试,问题依旧。
    1.2 编译器优化问题。
      这个我对vs2005 编译器不太熟悉。没有论证。

    2. 寄存器配置问题
      这种说法主要是说代码2分两步设置IO为输出状态:
      第一步是现将IO口配置为输入状态,
      然后再配置为输出状态。
      这个时候第一步设为输入状态会产生隐患,输入状态下,IO口电平可能会被外部电路拉高或者拉低,产生毛刺。 如果在这一步被中断,毛刺可能会更大。



    至于示波器问题, 我写得延时函数是us 级的,但S3C6410命令执行是ns 级的, 示波器没有分析出毛刺成分也是可能的。


    总的来说,我比较倾向于第二种说法,将寄存器配置成输入状态会造成隐患。
    踩过的脚印

    该用户从未签到

    发表于 2014-3-1 21:04:03 | 显示全部楼层
    消息来自- 北京
    涨知识!
    回复

    使用道具 举报

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

    本版积分规则

    QQ|Archiver|手机版|小黑屋|数字电视开发网 ( 京ICP备16008897号-5 )

    GMT+8, 2026-6-2 03:02 , Processed in 0.098669 second(s), 24 queries , Gzip On.

    Powered by Discuz! X3.5

    © 2001-2026 Discuz! Team.

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