根据前篇iic驱动基本概念,可以做一个简单的总结
i2c-core
postcore_initcall(i2c_init)->bus_register(&i2c_bus_type);i2c_add_driver(&dummy_driver);实现设备与驱动匹配检测的match,probe,remove等函数,实现底层通信函数
i2c_adapter
处于platform总线的i2c控制器,与控制器驱动在platform总线match上就会执行probe函数如下 i2c_add_numbered_adapter->i2c_register_adapter->of_i2c_register_devices(轮询并解析节点下的device_node子节点,将其转换成i2c_client(还可通过i2c_new_device新增))
i2c_add_driver调用栈
配置地址
一般作为图像传感器的命令通讯协议,比如红外传感器,ov系列传感器,一般的传感器都会有两个地址,这个完全可以根据厂商提供的设备地址分辨出来地址是几位,有的是7位,有的是8位(包含了读写位,取前7位做地址就好),10位(在初始化时配置成10位地址模式,就可以正常使用10位地址通讯了)
调试
做硬件或多或少都会出现一些错误,比如scl跟sda线反了,这种错误没有示波器是找不出通讯失败的原因
还有就是上拉电阻焊成了0欧姆,导致下拉却拉不下来,通讯也是肯定会失败,可用万用表测量电阻
一般可用i2c-tool调试,这个其实调试的就是i2c适配器,挂没挂设备都能使用,可用示波器探测信号是否正常