朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记

S5PV210中I2C通讯

    • 12.1、什么是I2C通信
      • 12.1.1、物理接口:SCL+SDA
      • 12.1.2、通信特征(I2C):串行,同步,非差分,低速率。
      • 12.1.3、突出特征:主设备+从设备
      • 12.1.4、突出特征2:多个设备挂载同一总线上。
    • 12.2、I2C时序
      • 12.2.1、总线空闲状态,起始位,结束位
      • 12.2.1数据响应
    • 12.3、S5PV210的i2c控制器
    • 12.4、主要寄存器 I2CCON I2CSTAT I2CADD,I2CDS
    • 12.5、gsensor介绍
      • 12.5.1、传感器简介
      • 12.5.2、I2C从设备地址
      • 12.5.3、I2C从设备的通信速率
      • 12.5.4、I2C总线通信流程
      • 12.5.5、KXTE9 内部流程图
      • 12.5.6、代码分析:
      • 12.5.7、初始化步骤:
      • 12.6.8、I2C 传输协议层

12.1、什么是I2C通信

12.1.1、物理接口:SCL+SDA

(1)SCL(serial clock):时钟线,一般是主设备向从设备提供时钟的通道。
(2)SDA 数据线

12.1.2、通信特征(I2C):串行,同步,非差分,低速率。

(1)I2C属于串行通信,所以数据都在一个数据线上SDA传输。
(2)同步通信就是通信双方工作在同一个时钟下。通信A放通过一个clk信号线传输A自己的时钟给B,B按照A给的时钟下进行通信。
(3)非差分,因为我们的通信速率不高,所以使用电平信号通信。通信双方距离比较近,所以抗干扰性比较强,所以没有必要使用差分。
(4)低速率。(一般几百KHz,不同的i2c芯片的通信速率可能不同,具体在编程的时候要看自己所使用的设备允许i2c的最高速率,不能超过这个速率)

12.1.3、突出特征:主设备+从设备

(1)不对等通信,主设备发起通信,从设备被动接受主设备的通信,并及时响应。
(2)通信双方确定主从设备,一个芯片可以只能做主设备,也可以只能做从设备;也可以既能当主设备也能当从设备(软件配置主或从设备之一)。这个也是芯片厂家规定的。

12.1.4、突出特征2:多个设备挂载同一总线上。

(1)一对一, 一对多(通过从地址区分不同的I2C设备)
(2)主设备来负责调动我们的总线,决定某一时间和哪个从设备通信。同一时间内,i2c的总线只能传输一对设备的通信信息。
(3)每一个i2c从设备在通信中都有一个I2C从设备地址。设备本身固有的属性。(本通信系统中唯一的)

12.1.4、主要用途:soc外围设备之间通信----EEPROM,电容触摸IC,各个传感器。

12.2、I2C时序

按照时间顺序,事先规定好的规则在同步时钟的作用下,依次拉低或拉高电平的过程。

12.2.1、总线空闲状态,起始位,结束位

(1)空闲状态:在主从设备没有通信数据产生时,就会转换成空闲状态,一般SDA总线会拉高。
(2)起始位:当SCL在高电平之间,SDA由高电平跳转为低电平过程,这就产生了一个起始位。
(3)结束位:当scl在高电平时,SDA产生一个从低电平跳转到高电平的过程,就产生了一个结束位。
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第1张图片

12.2.1数据响应

(1)主设备拉低总线产生一个起始位S,后发送一个字节的设备(地址+命令)(就是读或者写),从设备收到属于自己的地址的请求时,回复有一个响应A,然后从设备接收或发送一个字节的数据,后由从设备回复响应A,主设备发送结束标志P,结束本轮通信。如果主设备发送地址码后没有收到ACK回应(即第九时钟周期如有回应主设备回收到一个被拉低的电平。接收数据响应也是一个过程),主设备就认为通信失败(从设备不存在,或者损坏)
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第2张图片
(2)数据传输过程:
主设备发起通信(发起始位),随后发生8bit数据(地址+1位读或写命令)。所有从设备都收到主设备发送过来的数据,都会拿自己设备的地址做比对,如果地址相同说明是发给自己的(每个从设备的地址是唯一的)然后该设备回应ACK(也就是把SDA数据线拉低),主设备检测到ACK后,开始发送有效数据,或在读命令下开始接收数据(1字节),完成后同样收到来自从设备回应的ACK,主设备收到回应后,发送结束位,结束本轮通信,在这两个阶段其中一个阶段主机没有收到ACK,主机就会认为通信失败(主机发送的数据不对,从设备损坏)。
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第3张图片

12.3、S5PV210的i2c控制器

12.3.1、产生I2C时序,实现S5PV210与i2c设备之间的通信
结构框图
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第4张图片
(1)I2CCON I2CSTAT 产生i2c通信时序。
(2)移位寄存器 shift register 通过移位把数据一位一位掉给SDA
(3)地址寄存器+比较器 本i2c控制器做从设备的时候用。

(4)I2C控制器的时钟配置时钟源PCLK
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第5张图片

12.4、主要寄存器 I2CCON I2CSTAT I2CADD,I2CDS

I2CCON 设置I2C工作时钟,使能中断等
I2CSTAT 设置传输模式(读或者写)、使能Serial output等
I2CADD 写自己的地址的,在从设备模式中才用到
I2CDS 发送数据和接收数据寄存器

12.5、gsensor介绍

  • 重力加速传感器
  • 开发板原理图
    朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第6张图片

12.5.1、传感器简介

(1)描述物体移动的加速度,用在手机,平板,智能手表等设备上,用来感受人的手的移动,获取一些运动的方向性信息来给系统作为输入参量。
(2)智能手表的计步器。
(3)重力加速度传感器,地磁传感器,陀螺仪等三个传感器结合起来,都是来感受运动的速度、方位等信息,所以现在最新的9轴传感器,就是三者结合起来。并且用一定的算法进行综合得出结论,更准确。
(4)传感器的接口:模拟接口(如:电平的变化量0~5v的变化,soc不能够直接使用需要经过AD转换位数字信号才进一步处理校正的到正确的信息)和数字接口(如:I2C接口可以直接通过soc中的i2c控制器进行读写操作)

12.5.2、I2C从设备地址

(1)KXTE9固定I2C地址为:0b0001111(0x0f)
(2)地址本身7位,但是在I2C通信中发送i2c从设备地址时实际发送的是8位,这8位中高7位对应i2c低7位,最低位1位命令(读、写)
(3)主设备读从设备信息时 发送的地址加命令为:0b00011111(0x1F),主设备写入从设备信息时,发送地址7位+命令1位:0b00011110(0x1E)
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第7张图片

12.5.3、I2C从设备的通信速率

(1)作为低速率设备,通信速率不能太高。
(2)KXTE9 最高400KHz。
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第8张图片

12.5.4、I2C总线通信流程

S5PV210推荐的流程图

(1)主发送流程图
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第9张图片
(2)主设备读模式流程图
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第10张图片

12.5.5、KXTE9 内部流程图

s5pv210的流程只是给出读写数据的流程,而没有具体读、写KXTE9寄存器的步骤,KXTE9文档描述了具体的业务流程,读内部寄存器。 基本思路是:先写入要读、或写的寄存器地址告诉KXTE9,然后在读、写数据的时候,就是在这个寄存器中读数据,或者写入信息。
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第11张图片

12.5.6、代码分析:

I2C控制器初始化(linux驱动移植)
主要以下分析函数
(1)s3c24xx_i2c_init
(2)s3c24xx_i2c_message_start
(3)s3c24xx_i2c_stop
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第12张图片

12.5.7、初始化步骤:

初始化:设置GPIO、IRQEN、ACKEN、I2C时钟
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第13张图片
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第14张图片
START:
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第15张图片
STOP:

static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret)
{
	unsigned long iicstat = readl(i2c->regs + S3C2410_IICSTAT);

	dev_dbg(i2c->dev, "STOP\n");

	/* stop the transfer */
	iicstat &= ~S3C2410_IICSTAT_START;
	writel(iicstat, i2c->regs + S3C2410_IICSTAT);

	i2c->state = STATE_STOP;

	s3c24xx_i2c_master_complete(i2c, ret);
	s3c24xx_i2c_disable_irq(i2c);
}

12.6.8、I2C 传输协议层

(就是时序层的上一层,时序是soc内部I2C控制器实现的)

框架分析:我们最终的目的是通过读写gsensor芯片的内部寄存器来得到一些信息。为了完成这个目的,我们需要能够读写gsensor的寄存器,根据gsensor的规定我们需要按照一定的操作流程来读写gsensor的内部寄存器,这是一个层次(所谓的传输层、协议层);我们按照操作流程去读写寄存器,就需要考虑I2C接口协议(所谓的物理层,本质就是时序)。

协议层的代码主要取决于gsensor芯片;物理层代码主要取决于主机soc。
gsensor 协议层相关代码
朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记_第16张图片

你可能感兴趣的:(朱有鹏老师嵌入式linux核心课程--裸机第十二部分--I2C通信学习笔记)