6140|13

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE 驱动测试问题 [复制链接]

各位大侠:
       小弟在WinCE系统中添加了自己写的LED灯的驱动程序,并写了一个MFC程序测试之。却发现存在一些问题。CreateFile成功,但是灯却没有亮,下面的部分代码,大哥大姐们帮忙了。

static AT91PS_PIO   g_pPIOB;
static AT91PS_PMC   g_pPMC;

BOOL Addr_Init()
{
        BOOL bRet = TRUE;
        PHYSICAL_ADDRESS PhysAddrPiob;
        PHYSICAL_ADDRESS PhysAddrPmc;
   
        PhysAddrPiob.LowPart = (DWORD) AT91C_BASE_PIOB;
        PhysAddrPiob.HighPart = 0;
        g_pPIOB = (AT91PS_PIO) MmMapIoSpace(PhysAddrPiob,sizeof(AT91S_PIO),FALSE);
        if (g_pPIOB == NULL)
        {
                RETAILMSG(1,(L"Failed to remap the PIO registrers\r\n"));                                       
                bRet = FALSE;
        }
       
    PhysAddrPmc.LowPart = (DWORD) AT91C_BASE_PMC;
        PhysAddrPmc.HighPart = 0;
        g_pPMC = (AT91PS_PMC) MmMapIoSpace(PhysAddrPmc,sizeof(AT91S_PMC),FALSE);
        if (g_pPMC == NULL)
        {
                RETAILMSG(1,(L" Failed to remap the PMC registrers\r\n"));                                       
                bRet = FALSE;
        }
   
        return bRet;
}


BOOL WINAPI  DllEntry(HANDLE hInstDll,DWORD dwReason,LPVOID lpvReserved)
{   
   
        switch(dwReason)
        {
        case DLL_PROCESS_ATTACH:
                DisableThreadLibraryCalls((HMODULE)hInstDll);
                break;
        case DLL_PROCESS_DETACH:
                break;

        }
        return 1;
}


DWORD LES_Init(DWORD dwContext)
{   

         Addr_Init();
         g_pPMC->PMC_PCER  = 1<<3;

         return 1;
}


DWORD LES_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{      
      
     g_pPIOB->PIO_PER  = (1<<11) |(1<<16) |(1<<17) |(1<<18);
         g_pPIOB->PIO_OER  = (1<<11) |(1<<16) |(1<<17) |(1<<18);
         g_pPIOB->PIO_CODR = (1<<11) |(1<<16) |(1<<17) |(1<<18);   
     return 1;
}

应用程序中打开驱动的函数如下:

void CLedsDlg::OnOpen()
{
        // TODO: Add your control notification handler code here
         hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
        if(hFile == NULL)
        {
         MessageBox(_T("不能打开LES"));
        }
        else
        {
                MessageBox(_T("打开LES成功"));
        }
       
}

我设置LED灯的驱动程序在生成系统镜像的时候就进行了编译,且编译进内核,因此只需打开驱动就可以使用了吧、

现在用到的程序代码主要就这些了。各位大哥帮忙看看是什么地方出问题了。
谢,急等
此帖出自WindowsCE论坛

最新回复

不用......  详情 回复 发表于 2008-12-24 17:15
点赞 关注
 

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在驱动的每个函数入口加一个打印语句,看有没有被调用到;如果调用到了,灯还不亮,肯定是你点错了GPIO;如果没有调用,再研究没有调的缘故。。。。。。。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LED的亮与不亮一般都是GPIO的某一个pin脚的电平的拉高或者拉低,从代码里没有看到相关GPIO的操作,是不是尝试从这个地方入手
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
GPIO 的控制部分,我可以保证没有问题。上述代码中有相关的控制,可能我用的芯片跟大家用的不一样,大家不怎么熟悉吧,我用的是Atmel的芯片
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
那就查接口吧。。
或者, 在驱动里面,初始化的地方点灯一次,看看控制部分是不是正确;
这样,如果应用里面不能正确点灯,那肯定是调用出错了
此帖出自WindowsCE论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
createfile成功灯就一定会亮吗??应用程序调用createfile打开驱动的时候实际上调用的是驱动的XXX_Open()函数,你在XXX_Open()函数中操作gpio点灯了吗??
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

7
 
应该是你的驱动部分有问题
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
DWORD LES_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{      
      
    g_pPIOB->PIO_PER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_OER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_CODR = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);   
    return 1;
}

——————这个函数有问题,回去看看数据手册吧。
据我所知没有任何一款ARM是不用设置输入,输出,上拉,下拉的。看看手册,设置一下,随便都可以了。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 gooogleman 的回复:
DWORD LES_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{      
      
    g_pPIOB->PIO_PER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_OER  = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);
g_pPIOB->PIO_CODR = (1 < <11) |(1 < <16) |(1 < <17) |(1 < <18);   
    return 1;
}

——————这个函数有问题,回去看看数据手册吧。
据我所知没有任何一款ARM是不用设…



第一行代码: 引脚使能
第二行:     输出使能
第三行       低电平 ,led灯亮

如果我把Init中的代码跟Open中的代码结合在一起放入Init中,并设置驱动在系统启动的时候自动加载,那么灯是可以亮的,但是当我让应用程序的CreateFile调用Open函数的时候,就不行了,这到底是为什么呢?

请指点?
此帖出自WindowsCE论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

10
 
void CLedsDlg::OnOpen()
{
// TODO: Add your control notification handler code here
hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hFile == NULL)
{
        MessageBox(_T("不能打开LES"));
}
else
{
MessageBox(_T("打开LES成功"));
}

}
——————貌似TEXT("LES:")应该为TEXT("LES1:"),,你改动试试。我看很多例子都是后面带个数字
还有LES_Open中加入打印信息,看是否被应用调用了。
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
那就在你的LES_Open()函数中打几个消息,看createfile之后程序走进去了没有,执行了那些代码没有,是没有执行,还是执行了但没起作用?
另:你的这个变量g_pPIOB是全局的?
此帖出自WindowsCE论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
非常感谢gooogleman哥哥,正如你所说的,hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 中LES后面必须带上索引号,否则的话是不行的,
希望看过本帖子的初学者可以引以为鉴,
感动的要哭了,
谢谢
结贴
此帖出自WindowsCE论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 9 楼 gooogleman 的回复:
void CLedsDlg::OnOpen()
{
// TODO: Add your control notification handler code here
hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hFile == NULL)
{
        MessageBox(_T("不能打开LES"));
}
else
{
MessageBox(_T("打开LES成功"));
}

}
——————貌似TEXT("LES:")应该为TEXT("LES1:"),,你改动试试。我看很多例子都是后面带个数字
还有LES_Open中加入打印信息,看是否被应用调用了。


哈哈,我也是碰巧。一起学习。
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 qiu__zhi2008 的回复:
非常感谢gooogleman哥哥,正如你所说的,hFile = CreateFile(TEXT("LES:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 中LES后面必须带上索引号,否则的话是不行的,
希望看过本帖子的初学者可以引以为鉴,
感动的要哭了,
谢谢
结贴


不用......
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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