• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : I2C驱动如何使用 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7008
精华: 0
发帖: 13
金钱: 130 两
威望: 105 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2009-06-28
最后登录: 2009-11-26
楼主  发表于: 2009-08-15 18:20

 I2C驱动如何使用

最新的BSP里面I2C驱动程序如何使用?请大虾指点一二。

是不是只需要drv.c文件中I2C_Init(); I2C_Open(); I2C_IOControl(); 就够了?但是看不懂。能不能举个简单例子。多谢多谢!
级别: 新手上路
UID: 7008
精华: 0
发帖: 13
金钱: 130 两
威望: 105 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2009-06-28
最后登录: 2009-11-26
1楼  发表于: 2009-08-15 21:26

 回 楼主(yjjyjj) 的帖子

我在OnInitDialog()函数中
my_I2C_Device = CreateFile(L"I2C1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL );
//创建设备

然后在OnBnClickedButton1()函数中调用
DeviceIoControl(my_I2C_Device,IOCTL_I2C_READ, NULL,0,NULL,0,NULL,NULL);
可是编译时在这一行报错,'FILE_DEVICE_CONTROLLER':  undeclared identifier
请问该怎么解决?多谢!
级别: 新手上路
UID: 7008
精华: 0
发帖: 13
金钱: 130 两
威望: 105 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2009-06-28
最后登录: 2009-11-26
2楼  发表于: 2009-08-15 23:30

 re: I2C驱动如何使用

终于搜到了,添加
#include "winioctl.h"
之后就不会报错了。但是现在还是不知道怎么用这些I2C的函数。请大侠指点一二:
1)到哪里去设置2440的IICCON寄存器?是用CreateFile函数返回的HANDLE吗?怎么用法?
2)如果要从EEPROM芯片AT24C08中某指定地址读取一个字节的数据,那DeviceIOControl函数的参数应该怎样写?
DeviceIoControl(my_I2C_Device,IOCTL_I2C_READ, pBufIn,dwLenIn,NULL,0,NULL,NULL);
I2C_IOControl(PI2C_CONTEXT pI2C,    DWORD dwCode,    PBYTE pBufIn,    DWORD dwLenIn,    PBYTE pBufOut,    DWORD dwLenOut,    PDWORD pdwActualOut   )
这些参数都应该怎样设置?含义是什么?
级别: 新手上路
UID: 5456
精华: 0
发帖: 5
金钱: 45 两
威望: 36 点
贡献值: 0 点
综合积分: 10 分
注册时间: 2009-04-24
最后登录: 2011-06-14
3楼  发表于: 2009-09-17 10:07
不知道楼主解决没有,我正好也在调试这块。
发现    hI2cFile = CreateFile(TEXT("I2C0:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
    if(hI2cFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(_T("打开I2C驱动失败!"));
        return;
    }
打开驱动失败,进一步在C:\WINCE500\PLATFORM\mini2440\target\ARMV4I\retail
目录下没有找到i2c.dll文件,难道没有把驱动加入系统?
然后又在PB5.0环境下找到PLATFORM->mini2440->src->drivers->IIC工程,而且编译通过:0 warnings,0 errors;但是生成的Files也是0 !!囧  不知道怎么回事  
级别: 新手上路
UID: 10525
精华: 0
发帖: 31
金钱: 270 两
威望: 123 点
贡献值: 0 点
综合积分: 62 分
注册时间: 2009-11-07
最后登录: 2017-09-13
4楼  发表于: 2009-11-29 17:07
我也碰到类似问题,把相关的IF I2C去掉就可以编译产生DLL了,现在在调用,搞不明白,一直错误,有没有高手做成功I2C的,分享一下成功经验
级别: 新手上路
UID: 10525
精华: 0
发帖: 31
金钱: 270 两
威望: 123 点
贡献值: 0 点
综合积分: 62 分
注册时间: 2009-11-07
最后登录: 2017-09-13
5楼  发表于: 2009-12-01 20:11
终于读写成功了I2C,一周的时间就被一点小问题费掉,郁闷
级别: 新手上路
UID: 6366
精华: 0
发帖: 3
金钱: 30 两
威望: 15 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2009-05-29
最后登录: 2010-06-03
6楼  发表于: 2009-12-06 18:03
现在又有时间来搞这个I2C了。读写总是失败,打开设备createfile和关闭设备closehandle没有问题。
在VS2008中写了个小程序,按下对话框中的某个按钮时,执行下面的代码:
    I2C_IO_DESC xx;
    BYTE Buffin[100];
    PBYTE pBuffin;
    xx.SlaveAddr = 0xa0;    xx.WordAddr = 0x01;    xx.Count = 1;
    pBuffin = Buffin;    xx.Data = pBuffin;
    if(!DeviceIoControl(my_I2C_Device,IOCTL_I2C_READ, &xx,sizeof(xx),NULL,0,&RetBytes,NULL))
        MessageBox(L"Read Error!",0,0);
通过I2C从EEPROM读数据总是出错(写入也是失败),但是打开设备没问题。也就是执行下面这条语句时是返回正常的。
    my_I2C_Device = CreateFile(L"I2C0:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL );

这里I2C_IO_DESC的定义在I2C.h文件中
typedef struct _I2C_IO_DESC {
    DWORD   SlaveAddr;      // Target Slave Address
    UCHAR   WordAddr;       // Starting Slave Word Address
    PUCHAR  Data;           // pBuffer
    DWORD   Count;          // nBytes to read/write
} I2C_IO_DESC, *PI2C_IO_DESC;

从调试串口读取I2C错误信息如下:
                >I2C_IOControl(0x40000, 0x1806f9a4, 16, 0x0)
                                                            +I2C_Read[1]:

0xA0,
0x1, 0x1806F8D4, 1
SyncIst...
I2C_IST[5, 1]
A1[0]: 0x1
I2C_IST[5, 0]
A2[-1]
SetEvent DONE
...SyncIst: 0x0
SyncIst...
I2C_IST[4, 1]
Drop: 0xA1
R1:0x0
I2C_IST[4, 0]
I2C_IST[4, 0]: ACK NOT received
Data Abort: Thread=83bf7000 Proc=82026340 'device.exe'
AKY=00000005 PC=029a2670(i2c.dll+0x00002670) RA=029a2538(i2c.dll+0x00002538)

BVA
=1806f8dc FSR=00000005
SetEvent DONE
...SyncIst: 0xC0000005
RX_TIMEOUT.2
-I2C_Read:3221225477
I2C_IOControl ERROR: 3221225477
<I2C_IOControl:0

根据串口输出的信息,结合驱动源程序I2C.c和DRV.c,可以看到程序是按照预期的流程在运行。
上面的串口信息I2C_IST[5, 1] 和 I2C_IST[5, 0]表示I2C处于“SET_READ_ADDR模式,剩余字节数是1;”以及处于“SET_READ_ADDR模式,剩余字节数是0”。
这表示S3c2440发出slave地址和请求EEPROM地址的两个字节都是成功发出去的。
接下来就是“I2C_IST[4, 1],”和"I2C_IST[4, 0]: ACK NOT received“;这表示I2C_STATE处于READ_DATA模式,待处理字节数是1,待处理字节数是0,然后这里没有收到ack。
结果就报错了。不知道是驱动的问题还是我的程序的问题。我用2440test.bin试过(在supervivi中download&run),读写EEPROM都没有问题的,并且不管是查询方式还是中断方式都是OK的。现在不知道该怎么办了请大虾指点一下方向。

还有一个问题,连接上USB、串口、网线之后,我在VS2008中编译并运行自己的程序(开始调试),这时候S3C2440的显示屏上出现了我的程序,我在执行DeviceIOControl()函数之前设置了断点,可执行到这里的时候,查看各个变量xx.SlaveAddr, xx.WordAddr, xx.Count, xx.Data,结果都是0,我以为是我程序有问题,可是在串口调试信息中看到
+I2C_Read[1]:

0xA0,
0x1, 0x1806F8D4, 1
对应驱动程序的代码:
DEBUGMSG(ZONE_READ|ZONE_TRACE,(TEXT("+I2C_Read[%u]: 0x%X, 0x%X, 0x%X, %u\r\n"),
        pI2C->State, SlaveAddr, WordAddr, pData, Count));
这表示参数的传递都正确呀。难道VS2008的调试功能不能用来查看各个变量的值?
级别: 新手上路
UID: 6366
精华: 0
发帖: 3
金钱: 30 两
威望: 15 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2009-05-29
最后登录: 2010-06-03
7楼  发表于: 2009-12-06 18:07

 回 5楼(caolc3333) 的帖子

楼上的兄弟,你的I2C读写是怎么解决的?可否把测试代码贴出来学习一下?
级别: 新手上路
UID: 10525
精华: 0
发帖: 31
金钱: 270 两
威望: 123 点
贡献值: 0 点
综合积分: 62 分
注册时间: 2009-11-07
最后登录: 2017-09-13
8楼  发表于: 2009-12-06 22:18
你确认驱动已经注册并激活了么?
级别: 新手上路
UID: 6366
精华: 0
发帖: 3
金钱: 30 两
威望: 15 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2009-05-29
最后登录: 2010-06-03
9楼  发表于: 2009-12-06 22:40

 回 8楼(caolc3333) 的帖子

加载驱动时的串口信息如下:
不知道为什么,我想应该是加载驱动时执行I2C_Init就好了,可是不知道为什么连I2C_Open, I2C_IOControl, I2C_Close也都执行了。明明I2C_Init的代码中没有执行这些函数呀。
并且,下面的信息中"<I2C_Open:1”表示执行了I2C_Open中的代码"pI2C->OpenCount++;"即pI2C->OpenCount=1;
是不是这意味着已经打开了一个I2C端口了。
可是后面还出现了一个"<I2C_Open:2”,难道系统正要打开第二个I2C端口,只不过后来又执行了I2C_Close。
这样的话,每次我自己的程序中执行I2C_Open就是第二个I2C端口了,可能是这个原因造成了错误。
但是始终没搞懂,为什么会在I2C_Init中出现I2C_Open/I2c_IOControl/I2c_Close

I2C: Process Attach
>I2C_Init(1C10EE9C)
                   Try to open Drivers\Active\35
I2C_Init - Mode: INTERRUPT
+I2C_Init: 1, 0x0, 0xffff
-I2C_Init
<I2C_Init:0x3a7d0
                 >I2C_Open(0x3a7d0, 0x0, 0x3)
                                             <I2C_Open:1
                                                        >I2C_IOControl

(0x321000,
0x0, 0, 0x64749c8, 48)
                       <I2C_IOControl:1
                                       >I2C_Open(0x3a7d0, 0x0, 0x3)
                                                                  

<I2C_Open:2
                                                                            

I2C_Close(0x3a7d0)
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go