ARM9嵌入式Linux开发-I2C接口

目录

 

1 I2C协议

1.1 简介

1.2.信号类型

①开始信号(S)

②结束信号(P)

③响应信号(ACK)

1.3 数据传输格式

2.1 I2C总线控制器介绍

2.2寄存器设置

简介

IICCON寄存器

IICSTAT寄存器

IICADD寄存器

IICDS寄存器

2.3 S3C2440 I2C总线操作方法

2.3.1.启动或者恢复I2C传输

2.3.2.通过中断服务程序来驱动I2C传输

2.3.3主机发送器的工作流程。

3、编程实例


1 I2C协议

1.1 简介

I2C总线是一种串行总线,用于连接微控制器及其外围设备,具有以下特点:

  1. 两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)
  2. 每个连接到总线的器件都可以使用软件更具它的唯一的地址来识别
  3. 传输数据的设备间是简单的主从关系
  4. 主机可以用作主机发送器或主机接收器
  5. 它是一个多主机总线,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来方式数据被破坏
  6. 串行的8位双向数据传输,位速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s
  7. 片上的滤波器可以增加干扰功能,保证数据的完整
  8. 连接到同一总线上的IC数量受到总线最大电容的限制

ARM9嵌入式Linux开发-I2C接口_第1张图片

 

一些术语:

发送器:发送数据到总线的器件

接收器:从总线接收数据的器件

主机:发起/停止数据传输、提供时钟信号的器件

从机:被主机寻址的器件

多主机:可以有多个主机试图去控制总线,但是不会破坏数据

仲裁:当多个主机试图去控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不会被破坏

同步:多个器件同步时钟信号的过程

1.2.信号类型

I2C总线在传送数据过程中共有3种类型信号:开始信号、结束信号和响应信号

开始信号(S)

SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据;

结束信号(P)

SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据;

ARM9嵌入式Linux开发-I2C接口_第2张图片

 

③响应信号(ACK)

接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平。

ARM9嵌入式Linux开发-I2C接口_第3张图片

 

1.3 数据传输格式

发送到SDA线上的每个字节必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据最高位。

如果从机要完成一些其他功能后才能继续接收或发送,从机可以拉低SCL迫使主机进入等待状态。当从机准备好接收并释放SCL后,数据继续传输。如果主机在传输数据期间也需要完成一些其他功能也可以拉低SCL以占住总线。

启动一个传输时,主机先发出S信号,然后发出8位数据。前7位为从机地址,第8位表示传输方向(0表示写操作,1表示读操作)。被选中的从机发出响应信号。跟着传输一系列字节及响应位。最后,主机发出P信号结束。

ARM9嵌入式Linux开发-I2C接口_第4张图片

下列三种情况不会有ACK信号:

①当从机不能响应从机地址时(从机忙于其他事无法响应IIC总线操作或这个地址没有对应从机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号。这时,主机发送一个P信号终止传输或者重新发送一个S信号开始新的传输。

②从机接收器在传输过程中不能接收更多的数据时,也不会发出ACK信号。主机意识到这点,从而发出一个P信号终止传输或者从新发送一个S信号开始新的传输。

③主机接收器在接收到最后一个字节时,也不会发出ACK信号,于是,从机发送器释放SDA线,允许主机发送P信号结束传输。

  1. S3C2440 I2C总线控制器

2.1 I2C总线控制器介绍

S3C2440的IIC接口有4种工作方式:主机发送器、主机接收器、从机发送器、从机接收器。

ARM9嵌入式Linux开发-I2C接口_第5张图片

 

2.2寄存器设置

简介

从上图可知,S3C2440使用四个寄存器来完成所有的I2C操作。SAD线上的数据从IICDS寄存器发出,或传入IICDS寄存器;IICADD寄存器中保存S3C2440当做从机时的地址;IICCON、IICSTAT两个寄存器用来控制盒标识各种状态,例如:选择工作模式,发出S信号,发出P信号,决定是否发出ACK信号,检测是否收到ACK信号。

各寄存器的设置如下:

IICCON寄存器

        IICCON寄存器用于控制是否发出ACK信号、设置发送器的时钟、开启IIC中断,并标识中断是否发生。

使用IICCON寄存器时,应注意

  1. ①发送模式的时钟频率由位[6]、位[3:0]联合决定。另外,当IICCON[6]=0时,IICCON[3:0]不能取0或1
  2. ②IIC中断在以下三种情况下发生:当发出地址信息或接收到一个从机地址并且吻合时,当总线仲裁失败时,当发送/接收完一个字节的数据(包括相应位)时
  3. ③基于SDA、SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清除中断,即向IICCON[4]写入0清除中断
  4. ④如果IICCON[5]=0,IICCON[4]将不能正常工作。所以,即使不使用IIC中断,也要讲IICCON[5]设为1

IICSTAT寄存器

IICSTAT寄存器用于选择IIC接口的工作模式,发出S信号、P信号,使能接收/发送功能,并标识各种状态,比如总线仲裁是否成功、作为从机时是否被寻址、是否接收到0地址、是否接收到ACK信号。

IICADD寄存器

      IICADD寄存器[7:1]表示从机地址,IICADD寄存器在串行输出使能位IICSTAT[4]为0时,才可以写入,在任何时候都可以读取

IICDS寄存器

      IICDS寄存器[7:0],保存要发送或已经接收到的数据,IICDS寄存器在串行输出使能位IICSTAT[4]为1时,才可以写入,在任何时候都可以读取

2.3 S3C2440 I2C总线操作方法

2.3.1.启动或者恢复I2C传输

有以下两种方法:

(1)当IICCON[4]即中断状态标志位为0时,通过写IICSTAT寄存器启动I2C操作,有两种情况:

  1. 在主机模式,令IICSTAT[5:4]等于0b11,将发出S信号和IICDS寄存器的数据(寻址),令IICSTAT[5:4]等于0b01将发出P信号。
  2. 在从机模式,令IICSTAT[4]等于1将等待其它主机发出S信号及地址信息。

(2)当IICCON[4]即中断状态标志位为1时,表示I2C被暂停,在这期间,设置好其它寄存器后,向IICCON[4]写入0即可恢复I2C操作。所谓“设置其它寄存器”有以下几种情况:

  1. 对于主机模式,可以按照上面的方法写IICSTAT寄存器,恢复I2C操作后即可发出S信号和IICDS寄存器的值,或者发出P信号。
  2. 对于发送器,可以将下一个要发送的数据写入到IICDS寄存器中,恢复I2C操作后即可发出这个数据 。
  3. 对于接收器,可以从IICDS寄存器中读取接收到的数据,最后响IICCON[4]写入0(清中断)的同时,设置IICCON[7]以决定在接收下一个数据后是否发出ACK信号。

2.3.2.通过中断服务程序来驱动I2C传输

(1)当仲裁失败时发生中断,即是本次传输没有抢到总线 ,则需要稍候继续。

(2)对于主机模式,当发出S信号,地址信息并经过一个SCL周期(对应ACK信号)后,发生中断,主机可在此时判断是否成功寻址到从机。

(3)对于从机模式,当接收到的址与IICADD寄存器相吻合时,发生出ACK信号,然后发生中断,从机可在此时准备后面的传输。

(4)对于发送器,当发送完一个数据并经过珍上SCL周期(对应ACK信号)后,发生中断,这时可以准备下一个将要发送的数据,或者发出P信号以停止传输。

(5)对于接收器,当接收到一个数据时,先根据IICCON[7]以决定是否发出ACK信号,然后发生中断。这里可以读取IICDS寄存器得到数据,并设置IICCON[7]以决定接收到下一个数据后是否发出ACK。

2.3.3主机发送器的工作流程。

对于以上的几中工作模式,数据手册中都有操作流程图,现以主机发送器为例说明一下它的工作流程。

ARM9嵌入式Linux开发-I2C接口_第6张图片

 

(1)配置主机发送器各类参数,设置GPE14,GPE15引脚用于SCL,SDA,设置IICCON寄存器选择I2C发送时钟,最后,设置IICSTAT[4]为1,这样,后面才能写IICDS寄存器。

Note:初始化时,IICCON[4]为0,不能将IICSTAT设置为主机模式,否则就会立刻发送S信号,发送IICDS寄存器的值 。

(2)将要寻址的从机地址写入到IICDS寄存器。

(3)将0XF0(11110000)写入到IICSTAT寄存器,即设为主机发送器,全能串行输出功能,发出S信号。

(4)发出S信号后,步骤2中设置的IICDS寄存器的值也将会被发出去,它用来寻址从机。

(5)在响应周期后,发生中断,此时IICCON[4]为1,I2C传输暂停。

(6)如果没有数据要发送,则跳到步骤10准备结束传输,否则就执行步骤7继续传输。

(7)将下一个要发送的数据写入到IICDS寄存器中。

(8)往IICCON[4]中写入0,恢复I2C传输。

(9)这时IICDS寄存器中的值将被一位一位的发送出去,当8位数据发送完毕,再经过另一个SCL周期(对应ACK信号)后,中断再次发生,跳到步骤5.

(10)将0xD0写入IISTAT寄存器,即:设为主机发送器,全能串行输出功能,发出P信号。

(11)清除IICCON[4],P信号得以发出。

(12)等待一段时间,使得P信号完全发出。

3、编程实例

https://download.csdn.net/download/ce123/12305412

你可能感兴趣的:(ARM9嵌入式Linux开发)