CreateFile调用 IIC驱动问题

a28914768 2009-07-09 01:59:57
再EVC下用CreateFile()打开IIC设备成功返回句柄,用返回的句柄调用WriteFile(),WriteFile的返回值wRetSize为0;GetLastError返回的也为0
代码如下:
hT2C = CreateFile(TEXT("I2C1:"),
GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hT2C == INVALID_HANDLE_VALUE)
{

if (GetLastError() == ERROR_DEV_NOT_EXIST)
{
// register I2C device driver
hDriver = RegisterDevice(TEXT("I2C"), 1, TEXT("I2C.DLL"), 0);
if (!hDriver)
{
RETAILMSG(1, (TEXT("Failed to register I2C device driver.\r\n")));
}
hT2C = CreateFile(TEXT("I2C1:"),
GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
}

if (hT2C == INVALID_HANDLE_VALUE)
{
dwErrorCode = GetLastError();
return dwErrorCode ;
}
}


WriteFile ( hT2C, BUFFER, writesize, &wRetSize, NULL);

//判断存储是否成功
if (!wRetSize)
{
dwErrorCode = GetLastError();
CloseHandle( hT2C );
return 1;
}
...全文
341 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
datacodecat 2010-04-04
  • 打赏
  • 举报
回复
我想看看答案
ccyy2002 2009-07-10
  • 打赏
  • 举报
回复
除了驱动DLL加载,你还要确认你的驱动能够正确匹配硬件资源啊,比如IIC的器件地址设置和你的器件本身的是否一致等等,不是下载个驱动就能直接用的
a28914768 2009-07-10
  • 打赏
  • 举报
回复
谢谢大家的回复,现在问题已经解决了。

问题在down的驱动代码中,需要传入的buffer是一个驱动中定义好的结构体,并且有相关的数据操作。

之前没有仔细看底层代码,而是看了EVC中的帮助文档中WriteFile的操作,随便传了一个指针进去。

结贴
zaodt 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lmlmlmnew 的回复:]
呵呵 光想第一个,没想第二个~~

解决这个问题也许只要改BSP的2-3个文件和驱动程序就好了,但这都得建立在对wince的结构和驱动的结构以及相关知识了解的基础上。

我建议楼主:
解决这个问题两种办法:
1、找人帮忙,比如zaodt。
2、先学习一段时间,在来解决这个问题。

当然如果驱动太合适了,改吧改吧就好用了~也有可能哦~

[/Quote]


“解决这个问题也许只要改BSP的2-3个文件和驱动程序就好了,但这都得建立在对wince的结构和驱动的结构以及相关知识了解的基础上。”



这句话说的太对了!
zaodt 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 a28914768 的回复:]
是IOControl吗?不是DeviceIOControl吗?
[/Quote]


你说的对,是 DeviceIoControl , 我搞错了。
lmlmlmnew 2009-07-09
  • 打赏
  • 举报
回复
呵呵 光想第一个,没想第二个~~

解决这个问题也许只要改BSP的2-3个文件和驱动程序就好了,但这都得建立在对wince的结构和驱动的结构以及相关知识了解的基础上。

我建议楼主:
解决这个问题两种办法:
1、找人帮忙,比如zaodt。
2、先学习一段时间,在来解决这个问题。

当然如果驱动太合适了,改吧改吧就好用了~也有可能哦~
a28914768 2009-07-09
  • 打赏
  • 举报
回复
是IOControl吗?不是DeviceIOControl吗?
a28914768 2009-07-09
  • 打赏
  • 举报
回复
谢谢你们的回答,

基本上现在可以肯定的是,驱动加载时成功的对吧?

那就是要去研究一下底层的驱动代码。我去看看,然后再调用一次试试。

到时候有问题再来问大家。

不管到时候行不行,我星期一下班之前结贴。
zaodt 2009-07-09
  • 打赏
  • 举报
回复
更正一下:


在应用程序中是通过 IOControl 函数配置 IIC


这个函数与 DLL 中的 XXX_IOControl 对应。
zaodt 2009-07-09
  • 打赏
  • 举报
回复
这里有 2 个概念:

1、流驱动是否加载成功;

2、驱动程序是否可以驱动硬件;

=====================================


调用 CreateFile 成功,只能说明流驱动加载成功了;

但不一定驱动就可以使用了,也许还有问题。



就向楼主说的一样,他调用 CreateFile 成功了,说明流驱动加载成功了,


接下来就要看看驱动能否工作了。


如果确定 2440 IIC 中断可以工作的话,那接下来就要看看 这个下载下来的 DLL 驱动如何调用?


这个要看看代码。

===========================


我看过几个 IIC 驱动,一般都这样用:


1、通过 CreateFile 打开设备;

2、通过 XXX_IOControl 来配置 IIC ,如 你要操作的从设备地址,如:AT24C04

3、然后才是 ReadFile WriteFile


所以说,这个你要看看它的驱动是 怎么写的。
a28914768 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lmlmlmnew 的回复:]
象 CreateFile WriteFile 等函数为【应用层】函数,调用成功并不能保证驱动就正确。
?????????????????????????????????????????????????????????????????????
流驱动中CreateFile调用的成功和失败不是完全看驱动里面的函数XXX_Open 的返回值么?
如果CreateFile 这类函数不能保证,不就是说明驱动里面的函数有问题了么?

还是你想说阻塞和非阻塞情况下的这些函数实现方式不一样? 也就是中断和查询等待的区别~
[/Quote]

呵呵,我看不明白你说的这个内容,你是在回答我问的问题吗?

是的,我现在的困扰就是我现在的问题应该不在我【用户层】的代码对不对?

那么就应该在驱动层老?

如果是驱动层的话,是我的驱动代码的问题的,还是我驱动没有加载成功,

还是你们分析的可能是驱动代码没有被激活?


那么,我要如何定位问题到底是在这三部分的那一个目录下?


ps:是不是只有这三种情况了?
a28914768 2009-07-09
  • 打赏
  • 举报
回复
至尊宝宝[大哥] @ 杭州:

请问我怎么样才能确认如何驱动是否加载成功了。

我现在是没有将驱动烧到硬件上去的,

每次就拖一个IIC.dll IIC.reg到ce操作系统中,然后进行测试。


至尊宝宝是杭州的吗?我也是杭州的,能不能留个号码给我。我的QQ是66643042
lmlmlmnew 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 a28914768 的回复:]
2440+ce5.0
烧的OS是YC公司,DVD盘中自带的NK,因为没有IIC的驱动,所以要自己写一个。

我理解你的意思了,我看过代码,是用中断实现的。

那么,我可以在用户层,用虚拟地址映射的方式设置寄存器,你是这个意思吗?

但是我看了一下驱动的代码,貌似在init中,已经对寄存器都进行过了初始化,难道你的意思是我调用CreateFile的时候,

驱动层并没有对寄存器进行设置,使能IIC中断?
[/Quote]
我的理解,他不是你说的那个意思.
lmlmlmnew 2009-07-09
  • 打赏
  • 举报
回复
象 CreateFile WriteFile 等函数为【应用层】函数,调用成功并不能保证驱动就正确。
?????????????????????????????????????????????????????????????????????
流驱动中CreateFile调用的成功和失败不是完全看驱动里面的函数XXX_Open 的返回值么?
如果CreateFile 这类函数不能保证,不就是说明驱动里面的函数有问题了么?

还是你想说阻塞和非阻塞情况下的这些函数实现方式不一样? 也就是中断和查询等待的区别~
a28914768 2009-07-09
  • 打赏
  • 举报
回复
2440+ce5.0
烧的OS是YC公司,DVD盘中自带的NK,因为没有IIC的驱动,所以要自己写一个。

我理解你的意思了,我看过代码,是用中断实现的。

那么,我可以在用户层,用虚拟地址映射的方式设置寄存器,你是这个意思吗?

但是我看了一下驱动的代码,貌似在init中,已经对寄存器都进行过了初始化,难道你的意思是我调用CreateFile的时候,

驱动层并没有对寄存器进行设置,使能IIC中断?
zaodt 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a28914768 的回复:]
谢谢你的分析,
我在网上down了一个驱动的代码,并且包含dll,source,def文件的。
我用流驱动加载工具加载了这个DLL,并且修改了reg,提示激活成功。我是在流驱动加载工具最小化的前提下进行的测试。
不知道我这样说你能不能明白。
弱弱的问一下,如果我要自己生成一个DLL要怎么弄。
用PB编译吗?
需要对应的PSB下建立和我烧到板子上对应的OS下进行编译吗?
网上的资料我也看了有点多,但是自己理起来感觉还是有点乱。
[/Quote]


我前段时间刚做过这个,我的平台为:

2410 + CE 5.0

是读写 AT24C04 EEPROM 。

==============================

你现在已经有驱动的源码,所以可以看看源码,看看它使用的是

中断方式,还是 查询方式。


如果是查询方式,那就可以直接拿来用;


如果是中断方式,那就需要你改动 BSP 的 OAL 中断部分,


具体的就是 IIC 的 ISR 部分,来完成中断服务程序,


否则,驱动中的 IST 部分收不到中断。

===================================


你可以说说你的平台和硬件情况。
a28914768 2009-07-09
  • 打赏
  • 举报
回复
对不起,没有驱动工程师
a28914768 2009-07-09
  • 打赏
  • 举报
回复
不好意思,说错了。 down下来的文件夹中包含makefile,source,def。
DLL应该是我用PB编译的时候产生的吧。
我要怎么样才能了解DLL是什么方式呢?
驱动的代码要发出来吗?
gooogleman 2009-07-09
  • 打赏
  • 举报
回复
请和驱动工程师配合好。
a28914768 2009-07-09
  • 打赏
  • 举报
回复
谢谢你的分析,
我在网上down了一个驱动的代码,并且包含dll,source,def文件的。
我用流驱动加载工具加载了这个DLL,并且修改了reg,提示激活成功。我是在流驱动加载工具最小化的前提下进行的测试。
不知道我这样说你能不能明白。
弱弱的问一下,如果我要自己生成一个DLL要怎么弄。
用PB编译吗?
需要对应的PSB下建立和我烧到板子上对应的OS下进行编译吗?
网上的资料我也看了有点多,但是自己理起来感觉还是有点乱。
加载更多回复(2)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧