I2C总线和S5PV210的I2C总线控制器

发布者:变形金刚最新更新时间:2020-02-03 来源: eefocus关键字:I2C总线  S5PV210  I2C总线控制器 手机看文章 扫描二维码
随时随地手机看文章

一、什么是I2C通信协议?

1、物理接口:SCL + SDA

(1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

(2)SDA(serial data): 数据线,通信数据都通过SDA线传输

 

2、通信特征:串行、同步、非差分、低速率、半双工

(1)I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输

(2)同步通信就是通信双方工作在同一个时钟下,一般是通信的A方通过一根CLK信号线传输A自己的时钟给B,B工作在A传输的时钟下。所以同步通信的显著特征就是:通信线中

有CLK。

(3)非差分。因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信,其实还有一根GND线,用来构成电平信号,而不是差分信号。

(4)低速率。I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(一般几百KHz,不同的I2C芯片的通信速率可能不同,具体

在编程的时候要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率)。

(5)半双工。因为I2C通信只有一个SDA数据线用来传输通信数据,所以一个通信周期只能是由一方发送给另一方,而不能双方同时发送,所以是半双工通信模式。

 

3、突出特征1:主设备+从设备

(1)I2C通信的时候,通信双方地位是不对等的,而是分主设备和从设备。通信由主设备发起,由主设备主导,从设备只是按照I2C协议被动的接受主设备的通信,并及时响应。

(2)谁是主设备、谁是从设备是由通信双方来定的(I2C协议并无规定),一般来说一个芯片可以只能做主设备、也可以只能做从设备、也可以既能当主设备又能当从设备(软

件配置)。

 

4、突出特征2:可以多个设备挂在一条总线上(从设备地址)

(1)I2C通信可以一对一(1个主设备对1个从设备),也可以一对多(1个主设备对多个从设备)。

(2)主设备来负责调度总线,决定某一时间和哪个从设备通信。注意:同一时间内,I2C的总线上只能传输一对设备的通信信息,所以同一时间只能有一个从设备和主设备通信

,其他从设备处于“冬眠”状态,不能出来捣乱,否则通信就乱套了。

(3)每一个I2C从设备在通信中都有一个I2C从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要知道自己将要通信的那个从设备的地址,然后在通信中

通过地址来甄别是不是自己要找的那个从设备。(这个地址是一个电路板上唯一的,不是全球唯一的)。

 

5、主要用途

SoC和周边外设之间的通信(典型的如EEPROM、电容触摸IC、各种sensor等)。

 

二、I2C通信协议时序

1、I2C的总线空闲状态、起始位、结束位

(1)I2C总线上有1个主设备,n(n>=1)个从设备。I2C总线上有2种状态;空闲态(所有从设备都未和主设备通信,此时总线空闲)和忙态(其中一个从设备在和主设备通信,

此时总线被这一对占用,其他从设备必须歇着)。

(2)整个通信分为一个周期一个周期的,两个相邻的通信周期是空闲态。每一个通信周期由一个起始位开始,一个结束位结束,中间是本周期的通信数据。

(3)起始位并不是一个时间点,起始位是一个时间段,在这段时间内总线状态变化情况是:SCL线维持高电平,同时SDA线发生一个从高到低的下降沿。

(4)与起始位相似,结束位也是一个时间段。在这段时间内总线状态变化情况是:SCL线维持高电平,同时SDA线发生一个从低到高的上升沿。

 

2、I2C数据传输格式(数据位&ACK)

(1)每一个通信周期的发起和结束都是由主设备来做的,从设备只有被动的响应主设备,没法自己自发的去做任何事情。

(2)主设备在每个通信周期会先发8位的从设备地址(其实8位中只有7位是从设备地址,还有1位表示主设备下面要写入还是读出)到总线(主设备是以广播的形式发送的,只要

是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否相等。如果相等说明主设备本次

通信就是给我说话,如果不想等说明这次通信与我无关,不用听了不管了。

(3)发送方发送一段数据后,接收方需要回应一个ACK。这个响应本身只有1个bit位,不能携带有效信息,只能表示2个意思(要么表示收到数据,即有效响应;要么表示未收到

数据,无效响应)。

(4)在某一个通信时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。如果在某个时间主设备和从设备都试图向总线写那就完蛋

了,通信就乱套了。

         

主设备向从设备发送数据:

(有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答, A非表示非应答(高电平)。S表示起始信号,P表示终止信号。)

主设备向从设备获取数据:

 (从图中可以知道,当主设备需要停止通信的时候,在最后一次从设备发送给主设备数据之后,主设备是不需要发送ACK信号的,可以直接发送停止信号结束本次通信)

在通信过程中改变通信方向(以主设备发送数据转为主设备获取数据为例)

(在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。)

 

3、数据在总线上的传输协议

(1)I2C通信时的基本数据单位也是以字节为单位的,每次传输的有效数据都是1个字节(8位)。

(2)起始位及其后的8个clk中都是主设备在发送(这设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;然后到了第9周期,按照协议规定

从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动,其实就类似于总线空闲状态),同时从设备试图拉低总线发出ACK。如果从

设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没收到ACK,主设备就认为刚才给

从设备发送的8字节不对(接收失败)。

(3)数据位是在时钟信号的一个上升沿发送出去的,也就是说我们必须在时钟信号的上升沿之前将数据位准备好。

 

三、S5PV210的I2C控制器

通信双方本质上是通过时序在工作,但是时序会比较复杂不利于SoC软件完成,于是乎解决方案是SoC内部内置了硬件的控制器来产生通信时序。这样我们写软件时只需要向控制

器的寄存器中写入配置值即可,控制器会产生适当的时序在通信线上和对方通信。

1、结构框图

(1)时钟部分,时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。

(2)I2C总线控制逻辑(前台代表是I2CCON、I2CSTAT这两个寄存器),主要负责产生I2C通信时序。实际编程中要发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后

所代表的电路模块)实现的。

(3)移位寄存器(shift register),将代码中要发送的字节数据,通过移位寄存器变成1个位一个位的丢给SDA线上去发送/接收。

(4)地址寄存器+比较器。本I2C控制器做从设备的时候用。(我没用过,理论分析),这个是用于作为从设备时,配置自己的设备地址以及将主机发送过来的设备地址与自己的地

址进行比较时用到的。

 

2、I2C时钟系统分析

(1)I2C时钟源头来源于PCLK(PCLK_PSYS,等于65MHz),经过了2级分频后得到的。

(2)第一级分频是I2CCON的bit6,可以得到一个中间时钟I2CCLK(等于PCLK/16或者PCLK/512)。

(3)第二级分频是得到最终I2C控制器工作的时钟,以I2CCLK这个中间时钟为来源,分频系数为[1,16]。

(4)最终要得到时钟是2级分频后的时钟,譬如一个可用的设置是:65000KHz/512/4=31KHz

 

3、主要寄存器:I2CCON、I2CSTAT、I2CADD、I2CDS

I2CCON + I2CSTAT:主要用来产生通信时序和I2C接口配置。

I2CADD:用来写自己的slave address(作为从设备时的设备地址)

I2CDS:发送/接收的数据都放在这里(发送/接收的数据寄存器

 

I2CCON寄存器:
bit[7]: I2C的ACK使能控制位,我们的使能这个位之后,当需要我们的Soc发送 ACK信号的时候控制器就会自动的发送的ACK。
bit[6]: 原始时钟选择位,也就是一级时钟
bit[5]: I2C中断使能控制位
bit[4]: 中断挂起标志位,可读可写;读:0表示没有中断挂起,1表示有中断挂起;
写:写0清除中断挂起标志,不可写1
bit[3:0]: 二级时钟配置

I2CSTAT寄存器:
bit[7:6]: 工作模式选择位,一共有4中模式:从机接收模式、从机发送模式、主机接 收模式、主机发送模式。
bit[5]: 可读可写;读:0表示总线不忙,也就是可以进行操作,1表示忙; 写:写0产 生停止信号,写1产生起始信号。 
bit[4]: 使能总线的发送/接收功能
bit[3]: 总线仲裁状态位,0表示总线仲裁成功,1表示总此案仲裁失败,也就是发生了 总线错误。
bit[2]: 作为从设备时状态位,当收到了主设备发过了的起始信号/停止信号时该位清0 ;当作为从机时接收到的地址与自己设备地址相同时,该位置1。
bit[1]: 状态位,I2C地址0状态标志;当检测到起始/停止信号条件时该位为0;受到的 从机的地址为0000000b时该位为1.
bit[0]: 发送数据时是否接收到ACK状态标志位,0表示接收到了ACK,1表示没有接收到 ACK。

 

 

4、I2C通信中断请求来源有以下3种:

(1)一个字节的数据发送/接收完毕

(2)如果SoC作为从设备时,主设备发过来的地址跟自己的地址相对应时

(3)总线控制错误,无法识别总线的控制权归谁所有(总线仲裁错误)

 

5、I2C控制器通信流程

(1)S5PV210的主发送模式流程图

(2)S5PV210的主接收模式流程图 

 

所以我们在内置了I2C控制器的SoC中编程,只需要按照上图中的流程图的顺序即可完成通信,I2C控制器内部电路模块已经帮我们实现了通信时序,我们不需要去关心这些。

 

四、I2C传感器

现在有很多的传感器的硬件接口都是设计为I2C接口,他们与SoC主机的通信就是基于I2C通信协议来完成的,但是大部分的传感器内部都有寄存器,所以SoC主机需要去读写传感器的寄存器,至于读写这些寄存器是什么意思,是由传感器内部自己定义的了。例如如下:

IIC协议本身只是做了最基本的数据的发送和接收的方法,但是其实我们的IIC设备往往会对数据在做进一步的封装,例如:在我们的传感器中,因为我们的主机要写或者是读传感器的寄存器,那么就得知道是读或者写那个寄存器,所以传感器内部电路会对传过来的数据再做进一步的解析,例如,当我们发送了写信号之后,我们还要在发送一个地址,然后再发送有效数据,其实传感器是这样去理解的,但是本身我们的协议就认为我们写了2次数据,写了一次传感器地址,写了一次有效数据,只不过在传感器的电路模块不会吧第一次写的数据当作有效数据,而把他标记为寄存器地址。所以说具体的IIC传感器他会对数据有不一样的解析,具体看不同的情况。


其实说到这里,其实不管是什么通信协议,我觉得这些协议都只是规定了数据的发送和接收的方法,对于具体的发送或者接收的信息,需要我们具体的设备做进一步的解释。

关键字:I2C总线  S5PV210  I2C总线控制器 引用地址:I2C总线和S5PV210的I2C总线控制器

上一篇:s5pv210中断体系
下一篇:S5PV210的电阻触摸屏&ADC控制器

推荐阅读最新更新时间:2024-11-10 13:58

S5PV210的NandFlash应用(一)
准备分析 标题挂了一个(一),代表这个是涉及到NandFlash并不深入,只实现读操作。还是16k的代码,这次从NandFlash中读取,读到iRAM中地址为0xD0024000的地方。并调用main运行。如下图所示:(CPU会自动把B区代码拷贝到A区,我用A区代码从将B区代码拷贝到C区,并调用main运行) 资源工具 同《 S5PV210的LED应用(一)》 NandFlash: K9GAG08U0F (2G) 着手写程序 start.S中的代码拷贝很重要,Makefile中的链接地址很重要。 /* * $Id: nand_cp.c,v 1.1 2008/11/20 01:08:36 boyko Exp $
[单片机]
<font color='red'>S5PV210</font>的NandFlash应用(一)
S5PV210开发 -- UART 详解
上一篇文章系统的讲了一下通信的分类,包括并行通信,串行通信。串行通信的分类,包括同步通信,异步通信。 这篇文章我们主要讲一下 UART 串口编程,我们并不陌生。之前讲过RS485通信,参看:UNIX再学习 -- RS485 串口编程 再者,参看:日常生活小技巧 -- UART 回环测试 一、基本概念 参看:UART -- 维基百科 UART 是 Universal Asynchronous Receiver/Transmitter,通用异步收发器(异步串行通信口)的英文缩写,它包括了RS232、RS449、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。
[单片机]
<font color='red'>S5PV210</font>开发 -- UART 详解
I2C总线协议的一些理解
1、无论读与写,都是在时钟线为低时把数据送到数据总线上,在高时采样数据,把数据锁存到内部,所以读之前先把时钟线拉低,做好准备(数据线为高表示释放数据线),为接下来读数据做好准备。也就是时钟信号为低时,数据线上的高低电平才允许变化,时钟信号为高时,数据总线上的数据必须保持稳定。 2、起始信号产生后,总线为被占用状态(SDA拉低);终止信号产生后,总线为空闲状态(SCL被释放了)。 3、接收器件收到一个完整的数据字节后有可能需要完成一些其它工作,如处理中断,可能无法立刻接收下一字节,这时从机将SCL拉成低电平,从而使主机处于等待状态。直到从机准备好接收下一字节,再释放SCL线使之为高,从而数据传送可继续进行。数据线上的数据是在
[单片机]
STM32CubeMX系列 | I2C总线
1. 简介 1.1 I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般可达400kbps以上。下面从物理层和协议层两方面来了解I2C I2C物理层:可连接多个I2C通讯设备,支持多个通讯主机和从机;每个连接到总线的设备都有一个独立的地址,主机利用这个地址进行不同设备之间的访问;总线通过上拉电阻接到电源,当I2C设备空闲时会输出高阻态;多主机同时使用总线时,利用仲裁方式觉得由哪个设备占用总线;有三种
[单片机]
I2C总线注意要点
1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL。   2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器。 3、在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL  线的时钟信号是低电平时才能改变。   4、SCL  线是高电平时,SDA  线从高电平向低电平切换,这个情况表示起始条件。 5、SCL  线是高电平时,SDA  线由低电平向高电平切换,这个情况表示停止条件。   6、数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放
[嵌入式]
基于ATtiny841通过I2C总线连接GPS模块
本篇文章主要描述了如何通过I2C总线连接一个简单的GPS模块。使用的控制器是ATtiny841: 简介 将GPS纳入到项目中是一项非常艰巨的任务。首先,您必须正确解析您使用的GPS模块返回的NMEA语句,然后如果您使用接收到的经度和纬度进行任何计算,则需要将浮点GPS库结合到例程中来执行计算。 如果您需要处理一些任何其他重要的事情,GPS处理任务可能会干扰您的其他任务。将GPS处理作为单独的I2C模块解决了这个问题。 我最初设计这个是为运行我的Lisp解释器uLisp的电路板提供GPS支持,但它对于您希望通过简单的I2C接口访问GPS数据的任何其他应用程序都很有用。 GPS变量 I2C数据中的18个字节包含从
[单片机]
基于ATtiny841通过<font color='red'>I2C总线</font>连接GPS模块
S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局
最近又重新调试了下8位的HWECC,最后发现S5PV210的8位HWECC的确是可以用的,但是,使用yaffs2文件系统的时候的时候仍然会出问题,这是由于yaffs2文件系统与mtd层的oob布局冲突导致的。 当我们使用8位HWECC时,会生成52字节的ECC校验数据并写入oob,而yaffs2自身也有28字节的数据写日oob,也就是说,至少需要28+52=80字节的oob空间,而对于我们的nand flash,页大小为2048字节,oob空间为64字节,明显空间不足,进而导致了我们前面看到的问题,所以,采用8位HWECC时应该选用不使用oob空间的文件系统,如jffs2,但是jffs2文件系统在挂载时比较慢,感觉上不如yaffs2
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved