最近一直在做IIC读写测试,网上下载的驱动测试程序可以正确读写一个字节,但是整个读写就会导致SCL或者SDA一直为低。但是我自己的程序用示波器跟踪SCL和SDA信号一直都是高电平。由于是第一次接触这方面,不知道问题出在哪儿。
后来终于发现,可以调整驱动从串口打印驱动运行的信息,经过对比两个程序打印的信息,发现我的程序根本没有进入iocontrol的case里面。对比驱动打印的信息,发现我的控制码有错误。 我的驱动中控制码是通过CTL_CODE(FILE_DEVICE_IIC, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)函数得到的,并不是单纯的0,1,2。。。更改控制码以后,发现我自己的程序可以正确读写一个字节了。但是数据量大了还是会出现data abort的问题,由于csdn上有人问过这个问题,我照着他的方法修改了驱动以后,还是不对。但是如果修改时钟或者增加一点时延的话,可以连续读写的数据量会有适当的增加。我觉得这个跟iic的时序有关系。但是现在不知道应该怎么修改。哎。。还需要好好研究研究,做这方面的朋友我们可以一起讨论。(*^__^*) 嘻嘻……
补充:控制码应该是这样:
#define FILE_DEVICE_IIC 0x00000004
#define METHOD_BUFFERED (0)
#define FILE_ANY_ACCESS (0)
#define CTL_CODE(DeviceType, Function, Method, Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
#define IOCTL_IIC_SET_CLOCK CTL_CODE(FILE_DEVICE_IIC, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IIC_SET_DELAY CTL_CODE(FILE_DEVICE_IIC, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IIC_WRITE CTL_CODE(FILE_DEVICE_IIC, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IIC_READ CTL_CODE(FILE_DEVICE_IIC, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IIC_SET_MODE CTL_CODE(FILE_DEVICE_IIC, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IIC_SET_FILTER CTL_CODE(FILE_DEVICE_IIC, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)