5058|12

96

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急!!2450 wince5.0 怎么用IIC的中断??? [复制链接]

while(_iicDataCount!=-1)
     {   Run_IicPoll();}
这段代码,若是没有产生中断的话,会一直在这死等,占用资源,造成系统慢或死机。
现在我想用中断来做IIC,
UINT32 g_charge_Irq2 = IRQ_IIC;
UINT32 g_charge_detect_SysIntr2=0;
HANDLE g_charge_detect_Event2=NULL;
然后
    g_charge_detect_Event2 = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_charge_Irq2, sizeof(UINT32), &g_charge_detect_SysIntr2, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: Plug Failed to request sysintr value for g_charge_Irq2 interrupt.\r\n")));
        return(0);
    }  
    RETAILMSG(1,(TEXT("INFO: Plug: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_charge_Irq2, g_charge_detect_SysIntr2));
        if (!(InterruptInitialize(g_charge_detect_SysIntr2, g_charge_detect_Event2, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: Plug: Interrupt initialize failed.\r\n")));
        }

ghBattChargeThread2=CreateThread (NULL, 0, ReceiveIICInterruptEventThread, NULL, 0, NULL);

我用WaitForSingleObject(g_charge_detect_Event2, INFINITE);发现一直在这个线程里,根本就没有产生中断,是不是IIC的中断不能这样做呀? 有不有人用过IIC的中断,用WaitForSingleObject做的?
此帖出自WindowsCE论坛

最新回复

up  详情 回复 发表于 2009-11-11 13:35
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
寄存器没配置好吧
看一下波形对不对
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
up!!!知道的教一下呀!!!多少分都给!!!
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
2450的IIC中断应该是没有响应。好像有三个source可以出发中断,
1,1 byte数据传输和发送完成。
2,从地址符合或者是校验错误。
还有的具体也记不清你可以查查看这些中断源有没有发生。
说到底还是要对照datasheet中的寄存器设置来看。
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

1

TA的资源

一粒金砂(初级)

5
 
我设的都没有问题。我将
RETAILMSG(1,(TEXT("*******s2450IIC->IICCON   =  0x%x*********************\r\n"),s2450IIC->IICCON));

RETAILMSG(1,(TEXT("*******s2450INTR->INTMSK1   =  0x%x*********************\r\n"),s2450INTR->INTMSK1));
数据都打出来看,发现IICCON是有中断产生的,中断那一位有变成1,而INTMSK1中没有,INT_IIC那一位一直是0.是不是该中断源只能作为外部中断,即2450当成从设备,响应外部中断呀???有没有做过的!
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有写过2450的iic驱动,不太确定那个中断是不是需要isr的参与
但是如果你是想ist里面等到那个中断事件的话,就挨个来查
hw irq产生--》oeminterrupthandle中可以看到-->event找到
俺也是菜鸟,哈哈
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
既然IIC的寄存器检测有中断,我觉得首先还是要检查INTMSK,SRCPND等寄存器设置,UINT32 g_charge_Irq2 = IRQ_IIC里面的IRQ_IIC值为多少?27吗?
还有就是你的中断线程里面具体做的是什么操作,是发送一次数据还是接受数据?这个两个响应中断是有区别的,还有就是最后有没有清intrrupt Control标志位。
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
忘了说一点,你检测INTMSK1是不对的 INTMSK1中的INT_IIC就应该是0(Service available)这个是完全正确的。应该检测SRCPND1中的IIC位看是不是为1。2450我也没见过数据手册,你可以仔细看看Interrupt control部分的寄存器
此帖出自WindowsCE论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 heyme 的回复:
既然IIC的寄存器检测有中断,我觉得首先还是要检查INTMSK,SRCPND等寄存器设置,UINT32 g_charge_Irq2 = IRQ_IIC里面的IRQ_IIC值为多少?27吗?
还有就是你的中断线程里面具体做的是什么操作,是发送一次数据还是接受数据?这个两个响应中断是有区别的,还有就是最后有没有清intrrupt Control标志位。


对 IRQ_IIC值是27 发送数据的时候,不会产生中断的吧。接收数据的时候会产生中断。我就是在接收数据那边等待中断。我也有检测SRCPND1中的IIC位,发现一直都是0。
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
读出来的数一直是
s2450INTR->SRCPND1   =  0x3000
IIC的那一位一直都是0

在线程中
void ReceiveIICInterruptEventThread(PVOID pArg)
{
        HANDLE PendingEvents[]={ghBattChargeInsertEvent,ghBattChargeDesertEvent};
        DWORD Res;
        while(TRUE)
        {
                RETAILMSG(1,(TEXT("*******s2450IIC->IICCON   =  0x%x*********************\r\n"),s2450IIC->IICCON));
                RETAILMSG(1,(TEXT("*******s2450INTR->SRCPND1   =  0x%x*********************\r\n"),s2450INTR->SRCPND1));
                WaitForSingleObject(g_charge_detect_Event2, INFINITE);       
               
                if(_iicDataCount>-1)
                {
                        Poll(); //中断服务子程序
                                        }
               
                InterruptDone(g_charge_detect_SysIntr2);
                                         
        }
}
每次我都用InterruptDone清中断了呀。事实上是,一次中断都没产生过。这个中断跟IICCON的中断那一位变成1,是一样的吗?
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
只要你初始化的时候INTMSK1和IICCON都允许中断,应该没有理由不进中断,实在不行你在ADS下试试看,ADS下可以进中断就说明是你的WinCE下驱动有问题。
还有就是一次接受完成后最好清一下SRCPND1和INTPND1这些寄存器。
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
s2450IIC->IICCON = 0xAF;
这段那一位[5]我一直是允许中断的,即是1。
s2450INTR->INTMSK1的数据我也有打出来,[27]一直是0。一直是Interrupt service is available。奇怪了。InterruptDone就是清中断呀,我也有做了。
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

13
 
up
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表