最近学了一下IIC总线,感觉挺有收获的,把自己的一些心得,体会与大家分享!
我的开发板上有个LM75的芯片,要通过IIC总线访问得到其温度的值,在单片机
接触过IIC总线,单片机中应该说比这个要麻烦!因为要单片机程序要控制其中的数据线
和时钟线,在arm应用层下,由于linux系统中已经有IIC驱动(当然是自己裁剪内核是流下的),
i2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read()、write()和ioctl()等接口,
应用层可以借用这些接口访问挂接在适配器上的i2c设备的存储空间或寄存器,并控制I2C设备的
工作方式。
下面是我的关于LM75读取温度芯片的程序!
其中的注释部分都是在调试过程中留下的。
这样写时可以得到温度的数据,也是正确的。但是这种使用
read()、write()方法都只适合于如下方式的数据格式(可查看内核相关源码)
图1 单开始信号时序
就是说只有一个开始信号,当有多个信号是就不可用啦!我在刘老师的博客中看到了一篇文章http://blog.csdn.net/hongtao_liu/archive/2009/12/08/4964244.aspx是讲述怎么通过Ioctl ()
函数处理多开始信号的问题的。函数写的很好我在自己的板子上改了一些相应的东西之后验证了哈是正确的!
在这里感谢刘老师。
之后我也想通过同样的方法来访问一个时钟芯片:DS1307,采集时间数据。但是失败啦!每次在读芯片数据时
ret=ioctl(fd,I2C_RDWR,(unsigned long)&ds1307_data);这句话通过perror报错为 :Connection timed out
把timeout的时间设置长点也还是一样!我在想是不是这样一个原因!因为的的内核驱动里面有DS1307的驱动,
得到的数据也是通说IIC总线传送的,我再在应用层通过IIC访问这个芯片的话就不行啦!不知道具体是不是这样的。
希望哪位看到了我的疑问的能给我个确定的回答!不甚感激!!!!!!!!!!