I2C-SPI接口技术笔记与解析
"i2c-SPI笔记" 在嵌入式系统和物联网(IoT)设备中,I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)是两种常见的通信协议,用于微控制器与外部设备之间的低速数据传输。本文将详细阐述I2C协议及其在Linux系统中的实现。 I2C协议主要由以下组件构成: 1. **驱动程序**:在Linux内核中,I2C驱动程序通常位于`drivers/i2c/i2c-dev.c`和`i2c-core.c`中。`i2c-dev.c`处理用户空间对I2C总线的访问,而`i2c-core.c`则包含了I2C总线类型的定义和管理。`boardinfo.c`文件用于在系统启动时配置I2C设备。初始化过程通常在`postcore_initcall(i2c_init)`中执行,这确保了I2C系统在设备初始化之前准备就绪。 2. **总线适配器**:每个I2C总线都有一个对应的适配器,它在`busses/i2c-s3c2410.c`这样的文件中定义。适配器是连接硬件设备到I2C协议的关键,通过注册机制与内核交互。适配器的注册可以通过`i2c_add_numbered_adapter()`或`i2c_add_adapter()`函数完成,它们会将适配器添加到内核的适配器列表中。 3. **算法接口**:`struct i2c_algorithm`定义了一个结构体,包含了用于数据传输的`master_xfer()`函数和查询功能的`functionality()`函数。这些函数由具体的硬件驱动提供,实现了I2C协议的底层操作。 4. **I2C设备管理**:Linux内核提供了几个API来管理I2C设备。例如,`i2c_register_board_info()`在系统启动时注册I2C设备信息,`struct i2c_client`代表I2C总线上连接的设备,而`i2c_new_device()`用于动态添加新的I2C设备。`i2c_driver`结构体表示I2C驱动程序,`i2c_add_driver()`用于注册I2C驱动,使它能够识别并控制相应的I2C设备。 5. **设备信息**:`i2c_board_info`结构体存储了关于I2C设备的详细信息,如设备地址和类型。这些信息通常在`__i2c_board_list`链表中维护,并通过`list_add_tail()`函数添加。当需要注册新设备时,`i2c_board_info`中的数据会被用来初始化`struct i2c_client`实例。 6. **设备注册**:`i2c_register_adapter()`函数负责向内核注册一个新的I2C适配器,同时`device_register(&adap->dev)`会将适配器作为设备进行注册,使其可见于系统。 7. **扫描设备**:有时需要检测I2C总线上连接的设备,这可以通过`i2c_scan_something()`之类的函数来实现,该函数会遍历总线,尝试与每个可能的设备地址通信,从而确定实际连接的设备。 I2C协议的优势在于其简单性和效率,允许多个设备共享两根线进行通信,而SPI协议则提供了更高的数据传输速率和灵活性,适用于需要高速通信的场景。理解这些通信协议以及它们在Linux内核中的实现对于开发和调试嵌入式系统至关重要。
-----------------------------
1.IIC核心层 drivers/i2c/i2c-dev.c(过时,通用设备驱动) i2c-core.c (bus_type匹配函数) i2cboardinfo.c
通用代码,实现adapter,设备注册、注销方法及iic通信函数通用部分
i2c-core.c
postcore_initcall(i2c_init); //早起初始化,要早于设备初始化;比设备函数先调用
postcore_initcall(fn) =》__define_initcall("2",fn,2) //2启动时调用等级
module_init(fn) =》__initcall(fn) =》 device_initcall(fn) =》 __define_initcall("6",fn,6)
------------------------------
2.IIC总线驱动 busses/i2c-s3c2410.c 适配器驱动(adapter驱动)厂商完成
----匹配方式
1)pdrv->id_table pdev
2)drv->name pdev->name
---控制器注册
struct i2c_adapter adap; //控制器设备 适配器结构体
i2c_add_numbered_adpter(&i2c->adap) //适配器第一种注册函数 自己指定总线号(0)
i3c_add_adapter(); //适配器第二种注册函数 总线号动态分配
i2c->adap.nr适配器对应的I2C总线号
struct i2c_algorithm *algo //算法,总线驱动提供的通信函数
mater_xfer//通信传输函数
functionality//检查总线支持的通信协议函数
-------------------------------
3.IIC设备驱动 添加设备信息 API:i2c_register_board_info()//添加设备信息 总线驱动注册驱动之前添加 ******
struct i2c_client client;//iic丛机设备 i2c_board_info 填充
i2c_new_device(); //设备注册
驱动注册
i2c_add_driver(); **********
i2c_board_info //设备信息
struct i2c_devinfo devinfo //链表节点结构体类型
__i2c_board_list//设备信息链表 结构体i2c_devinfo作为链表节点
list_add_tail() //尾部插入链表
适配器、设备都是注册在当前总线上
int i2c_register_adapter() //适配器注册
device_register(&adap->dev) //设备注册
i2c_scan_static_board_info() //
list_for_each_entry()//遍历链表
I2c_new_device() //注册设备
i2c_check_functionality()//检查支不支持对应的功能
--------------------------------------i2c核心提供的通信函数
i2c_master_send(从设备结构体,读/写数据操作的位置,多少字节) //对i2c_master_transer的封装
i2c_master_recv(设备, 接收读的缓冲,字节数) //对i2c_master_transer的封装
i2c_master_transer(适配器,&msg, msg个数)
--------------ls /dev/at24_eeprom
===============================================文件IO操作(系统IO与标准IO)
系统IO:
剩余13页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展