现在又有时间来搞这个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的调试功能不能用来查看各个变量的值?