问题依旧。。以为自己解决了
为什么ioctl(fd,I2C_SLAVE,0x50) 正确,这个是EEPROM
而ioctl(fd,I2C_SLAVE,0xea) 则提示INVALID ARGUMENT? 这个是I/O扩展器件
可以肯定的是,硬件没问题的,因为别的CPU不用linux可以控制这两个器件
估计是地址不对,你应该给的是高6位的地址,然后加读写位,
比如: 0x50其实对应的是0xA0,
估计你应该送0x75(0xEA>>1);
内核里关于I2C的ioctl有这么一段:
switch(cmd){
case I2C_SLAVE:
case I2C_SLAVE_FORCE:
if((arg>0x3ff)||
(((client->flags&I2C_M_TEN)==0)&&arg>0x7f)
return -EINVAL;
.....
其中arg就是ioctl传递的器件地址,我设置0x7f之前都是可以的,但是0x7f之后的地址都会出现-EINVAL的错误,0x7f是一个什么值? 为什么设定的是这个值??
那就对了,因为这里给的是高7位,CPU会自动在最后一位加上R/W位,这个是和CPU架构相关的。
比如说如果是slave地址是0xA0,那么你只需要给0x50(0xA0>>1),
CPU或者可能驱动会做这样的处理: (0x50 < < 1) | R/W,这就是最终的地址。
这里还与扩展的十位地址和7位地址有关的,7位地址最大只能到0x7f。楼主这里应该是7位地址模式。
恩,楼上的说的没错,不过我送0x75地址,读写的时候出现
at91_i2c: timeout 3
而write函数却返回success
这是啥原因?
那你就看看代码,看这个timeout是什么原因导致的。
看了下,TIMEOUT是由于从器件没有应答,用示波器看了下,确实是这样。
相关问答:
大家好!我是一位C爱好者,向大家请教下,C程序员可好找工作?公司用C干些什么?
无所谓好不好找工作,一般通信、系统、嵌入式、硬件方面用的多,而且由于C的底层特性,学会后在学其他的会比较容易
不管用什么语 ......
'\108'作为字符常量对不对?
转义字符'\ddd'表示3位8进制所代表的字符。 但是108不是正确的8进制表示方法,因此应该是错误的。
但是char a='\108'; 为什么编译不出错呢?
\108 没超过 ......
请问各位高手如何用C/C++获得系统未安装补丁
好像很专业的东西。。。
查注册表
每个补丁如果安装了都会在注册表里面登记
请问能不能更清晰些,我想用c\c++查出来,不好意思,我是新手。还望指教。谢
分值 ......
C盘上多的文件名为:dosh , Recycled ,System Volum information, AUTOEXEC.BAT, BOOT.INT , bootfoot.bin, CONFIG.SYS,IO.SYS, MSDOS.SYS, DETECT.COM ,ntldr, pagefile.sys;
而且每个盘上都有这些文件:RECYCLER ......