第二十九节、i2c总线
本节用于介绍i2c总线
一、I2C简介
I2C是很常见的一种总线协议,I2C是NXP公司设计的,I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),因为I2C这两条数据线是开漏输出的,所以需要接上拉电阻,总线空闲的时候SCL和SDA处于高电平。I2C总线标准模式下速度可以达到100Kb/S,快速模式下可以达到400Kb/S。
如果大家之前玩过51单片机,肯定对模拟I2C时序这个操作并不陌生,但是在Linux上,还需要我们继续来模拟I2C的时序吗,答案是不需要的,cpu会自带I2C控制器,有了这个I2C控制器之后,我们就不用在来取模拟时序了,我们只需要关系怎么把数据写到寄存器和怎么从寄存器读数据即可,具体的时序都是由I2C控制器来帮我们自动完成。
Linux把I2C控制器抽象成了一个i2c_adapter,我们只要来分配这个i2c_adapter,就可以得到一个l2C控制器。
我们可以先来体验一下,在Linux上操作l2C是多么的容易,我们可以先来看一下我们的系统里面都有哪些l2C的节点,这里以终结者的开发板为例。如下所示:
1 | root@localhost:~# ls /dev/i2c-* |
Linux有一个非常重要的概念叫一切皆文件,那么我们能不能在应用层通过open这些节点来操作l2C来跟外设I2C通信的芯片进行一个数据交流呢?当然是可以的,我们来一起看一下,这里我们以操作时钟芯片RX8010为例。
那我们怎么在应用层操作l2C呢?应用层操作l2C是以数据包进行交流的,所有我们在应用层就要进行封包的操作。
数据包对应的结构体是i2c_rdwr_ioctl_data
文件位置路径:include/uapi/linux/i2c-dev.h
1 | /* This is the structure as used in the I2C_RDWR ioctl call */ |
然后是i2c_msg结构体的定义
文件位置路径:include/uapi/linux/i2c.h
1 | struct i2c_msg { |