12276|66

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教ZLG7290双边沿触发的奇怪问题 [复制链接]

平台2440 5.0 BSP
我使用ZLG7290这个键盘驱动芯片,如果有键按下就会在它的INT引脚发出一个低电平,如果没有按键按下就是高电平。
现在我采用双边沿触发中断,但是出现只要按下一个键,这个键的功能就会不段重复执行,看打印信息中断线程却执行了一次而已。
后来在老帖看到,这个是由于没有处理按键弹起就会这样。可是我明明配置了双边沿触发,并且我用应用程序读出相应的寄存器,和
数据手册吻合。
后来我把键盘的IST部分移植到BSP下加入了打印信息。
BOOL
KeybdIstLoop(
    PKEYBD_IST pKeybdIst
    )
{
    SETFNAME(_T("KeybdIstLoop"));

    UINT32  rguiScanCode[16];
    BOOL    rgfKeyUp[16];
    UINT    cEvents;
// add by wogo at 2009-03-12
RETAILMSG(1, (TEXT("In KeybdIstLoop Funtion:\r\n")));
    DEBUGCHK(pKeybdIst->hevInterrupt != NULL);
    DEBUGCHK(pKeybdIst->pfnGetKeybdEvent != NULL);
    DEBUGCHK(pKeybdIst->pfnKeybdEvent != NULL);

    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

wait_for_keybd_interrupt:
    if (WaitForSingleObject(pKeybdIst->hevInterrupt, INFINITE) == WAIT_OBJECT_0)
    {
  // add by wogo at 2009-03-12
  RETAILMSG(1, (TEXT("Deal with hevInterrupt@@@!!! :\r\n")));
        cEvents = (*pKeybdIst->pfnGetKeybdEvent)
            (pKeybdIst->uiPddId, rguiScanCode, rgfKeyUp);
            
        for (UINT iEvent = 0; iEvent < cEvents; ++iEvent) {
            (*pKeybdIst->pfnKeybdEvent)(pKeybdIst->uiPddId,
                rguiScanCode[iEvent], rgfKeyUp[iEvent]);
        }
        // cEvents could be 0 if this was a partial scan code, like 0xE0

        InterruptDone(pKeybdIst->dwSysIntr_Keybd);
  // add by wogo at 2009-03-12
  RETAILMSG(1, (TEXT("InterruptDone(pKeybdIst->dwSysIntr_Keybd)@@@!!! :\r\n")));
    }

    goto wait_for_keybd_interrupt;

    ERRORMSG(1, (TEXT("KeybdIstLoop: Keyboard driver thread terminating.\r\n")));
RETAILMSG(1, (TEXT("KeybdIstLoop: Keyboard driver thread terminating!!! :\r\n")));
    return TRUE;
}



     果然按下一次按键只打印了如下信息

Deal with hevInterrupt@@@!!! :
InterruptDone(pKeybdIst->dwSysIntr_Keybd)@@@!!! :
     按照常理,使用双边触发,按一次应该打印如下。

Deal with hevInterrupt@@@!!! :
InterruptDone(pKeybdIst->dwSysIntr_Keybd)@@@!!! :
Deal with hevInterrupt@@@!!! :
InterruptDone(pKeybdIst->dwSysIntr_Keybd)@@@!!! :

     现在难搞了,使用应用程序去读中断寄存器的设置,读出是0x22226242,这个和要求完全吻合,怎么就不产生双边沿触发呢?难道是干扰?我的天啊,真是越来越神奇了。
      后来,我又单独把EINT11配置成上升沿触发,结果也打印了
Deal with hevInterrupt@@@!!! :
InterruptDone(pKeybdIst->dwSysIntr_Keybd)@@@!!! :
这说明这时候才响应了键盘弹起中断。但是不知道为什么配置成双边触发的时候,响应了键按下之后,键弹起中断就不响应了。

shuiyan牛人,你经验丰富,救救小弟吧。谢谢。


最新回复

uping 学习  详情 回复 发表于 2009-11-5 22:46
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
EINT11 [14:12] Setting the signaling method of the EINT11.
000 = Low level      001 = High level        01x = Falling edge triggered
10x = Rising edge triggered                     11x = Both edge triggered


// Setup EINT11 (KBDINT)
    v_pIOPregs->rGPGCON &= ~(0x3 << 6);         // Clear GPG3
    v_pIOPregs->rGPGCON |= (0x2 << 6);          // Set GPG3 to EINT11 for Keyboard interrupt

    v_pIOPregs->rEXTINT1 &= ~(0x7 << 12);    // Clear EINT11
    //v_pIOPregs->rEXTINT1 |= (0x2 << 8);     // fallig edge triggered for EINT11
    v_pIOPregs->rEXTINT1 |= (0x6 << 12);                //both edge

我在应用程序读出rEXTINT1 的值是0x22226242

这个是和数据手册吻合的,但是它只能产生一个中断而已,并且,这个代码本来在4.2BSP运行正常,我放到5.0BSP只是改动了中断的一些申请方法而已。

 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶一下,哈哈,哪位帮分析一下。谢谢。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

4
 
三星的东东没有用过。
我在270上,是在kernle里面将GPIO先设成input,然后将上下边沿检测的寄存器都设置成1,即只要引脚上有跳变,不管是上升还是下降,GPIO都可以检测到。
g_pGPIORegs->GFER1 |=  GPIO_37;
g_pGPIORegs->GRER1 |=  GPIO_37;

收到中断后,先disable中断,然后扫描键盘,然后再enable…………

不知道这样能不能帮到你呢?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
我不明白我双边沿触发只能产生一个中断,
但是我分开来两个中断都能产生,不知道是怎么回事。

2440 有这种功能的——收到中断后,先disable中断,扫描,完毕之后再重新使能中断的。

我觉得可能是这个中断波形不好?导致2440检测不到?
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个芯片如何处理多键呢?“有键按下是低,没键按下是高”,那按下一个不放->中断低->再按另一个呢?


先这样做:
使能下降沿,等待按键按下 -> 按下触发下降沿中断,进入处理流程,在其中将这个脚设置成上升沿触发 -> 结束处理,等待按键释放。

人的机械操作肯定远远超过程序处理时间,所以不用担心会错过上升沿。

然后再看2440的双沿触发为什么没起效果。以前没用过双沿的方式。

270跟2440不一样:270的上升、下降沿是分别在两个寄存器里设置,而2440却是在同一个寄存器的2个bit来配置。不确定这是否是引起不同结果的原因。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 gooogleman 的回复:
我不明白我双边沿触发只能产生一个中断,
但是我分开来两个中断都能产生,不知道是怎么回事。


可能是双边沿触发时,差过了第二个沿。
即第一个沿的处理时间太长
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
多谢各位前辈,我正在按照shuiyan牛人的办法来做,觉得这个方法是可行的。
等下来报告结果,
对了,大家调试本机驱动是怎么调试的?不会每次都打包NK,然后下载吧,这样也太郁闷了吧?
 
 
 

回复

67

帖子

0

TA的资源

禁止访问

9
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
有什么办法减少线程处理时间?
把优先级提高可行吗?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
isr
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 shenmou 的回复:
isr


哦?这个要修改OEMInterruptionHandler函数了?

不过我觉得这个应该影响不大吧。感觉比较郁闷。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
OEMInterruptionHandler——》OEMInterruptHandler
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
两边设置配对好没
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
我觉得极有可能是线程处理函数过长,或者是优先级没有分配好。

总之是领教wince驱动了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
我觉得极有可能是线程处理函数过长,或者是优先级没有分配好。

总之是领教wince驱动了。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
应该是线程处理时间太长。
在最初的设计中,我在扫描函数中等待的时间是大概20多毫秒,结果经常发生按下一个键,屏幕上就出现一堆字母的情况,这个就是没有检测到up中断。
于是就减少时间,………………,直到减小到1uS,才算不会出现此问题。
我有时候再想,这1uS到底有没有用,不过也没有把它拿掉。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

18
 
你是怎么减下来的?

我觉得不可思议,因为这个IST 里面有IIC相关的程序,貌似还有延时。

我原来的4.2BSP可行,5.0BSP却不行了,所以我觉得很奇怪,哎,现在想不到好的计策。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
mark.
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
  1. 哎,真的有个很长的延时。

  2. /********************************************************************************************
  3. ** 函数名称:         DelayMS
  4. ** 功能描述:         长软件延时
  5. ** 输 入: i :        延时参数,值越大时延时越久
  6. ********************************************************************************************/
  7. void DelayMS(int dly)
  8. {  
  9.    int  i;

  10.    for(; dly>0; dly--)
  11.       for(i=0; i<200; i++);
  12. }



  13. /*******************************************************************************************
  14. ** 函数名称:         ZLG7290_GetKey
  15. ** 功能描述:         读取键值
  16. ** 输 入: 无
  17. **         
  18. ** 输 出: >0  键值
  19. **        =0  无键按下
  20. ** 全局变量:        无
  21. ** 调用模块:         IRcvStr、delayMS
  22. **
  23. ********************************************************************************************/
  24. void        ZLG7290_GetKey(unsigned char key[])
  25. {   
  26.         IIC_ReadSerial(ZLG7290,0,key,4);
  27.        
  28.         DelayMS(100);               
  29. }
复制代码
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表