Linux应用开发(十一)——I^2C接口

本文详细介绍了I^2C总线协议,包括其特点、信号类型和数据传输格式,并重点解析了S3C2410微处理器中的I^2C控制器及寄存器操作,提供了两种操作方法。还讨论了通过中断服务程序驱动IIC传输的过程。最后,以RTC芯片M41t11为例展示了I^2C总线的实际应用。
摘要由CSDN通过智能技术生成


前言

  • 了解I^2C总线协议
  • 掌握S3C2410中I^2C接口的使用方法

一、I^2C总线协议及硬件介绍

I^2C总线

I^2C总线概念

I^2C(又称IIC)总线是一种由PHILIPS公司开发的串行总线,用于连接微控制器及外围设备,具有如下特点

  • 只有两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)。
  • 每个连接到总线的器件都可以使用软件根据它的唯一地址来识别
  • 传输数据的设备间是简单的主/从关系。
  • 主机可以用作主机发送器或主机接收器。
  • 它是一个真正的多主机总线,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破环
  • 串行的8位双向数据传输,位速率在标准模式下可达到100kbit/s,在快速模式下可达到3.4Mbit/s。
  • 片上的滤波器可以增加抗干扰功能,保证数据的完整性
  • 连接到同一总线上的IC数量只受到总线的最大电容400pF的限制
    在这里插入图片描述I^2C总线术语的定义
    发送器:发送数据到总线的器件
    接收器:从总线接收数据的器件
    主机:发起停止数据传输,提供时钟信号的器件
    从机:被主机寻址的器件
    多主机:可以有多个主机试图去控制总线,但是不会破环数据
    仲裁:当多个主机试图去控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不被破坏
    同步:多个器件同步时钟信号的过程

I^2C总线的信号类型

I^2C总线在传送数据过程中共有3种类型信号:开始信号、结束信号和响应信号。
开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
响应信号(ACK):接收器在接收到8位数据后,在第九个时钟周期,拉低SDA电平。
如图所示:
在这里插入图片描述SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化。
在这里插入图片描述

I^2C总线的数据传输格式

发送到SDA线上的每个字节必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能继续接收或发送下一个字节,从机可以拉低SCL迫使主机进入等待状态。当从机准备好接收下一个数据并释放SCL后,数据传输继续。如果主机在传输数据期间也需要完成一些其他功能(例如还是一个内部中断服务程序)也可以拉低SCL以占住总线。
启动一个传输时,主机先发出S信号,然后发出8位数据。这8位数据中前7位为从机的地址,第8位表示传输的方向(0表示写操作,1表示读操作)。被选中的从机发出响应信号。紧接着传输一系列字节及其响应位。最后,主机发出P信号结束本次传输。
在这里插入图片描述

  • 主机发出开始信号,传输一个8位数据(前7位表示从机地址的第一个7位数据进行标识,后面一位表示操作(R/W)决定了数据传输的方向,写就是主机-从机,读从机-主机)。同时被选中的从机发出响应信号表示收到。
  • 注意区分不同模式下的格式和步骤

并非所传输8位数据之后都会有ACK信号,有一下3中例外。

  1. 当从机不能响应主机地址时(例如它正忙于其他事而无法响应I^2C总线的操作,或者这个地址没有对应的从机),在第九个SCL周期内SDA线没有被拉低,即没有ACK信号。这时,主机发出一个P信号终止传输或则重新发出一个S信号开始新的传输。
  2. 如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
  3. 主机接收器在接收到最后一个字节后,不会发出ACK信号。于是从机发送器释放SDA线,以允许主机发出P信号结束传输。

S3C2410总线控制器

S3C2410总线控制寄存器介绍

S3C2410的I^2C接口有4种工作模式:主机发送器,主机接收器,从机发送器,从机接收器。内部结构如下:
在这里插入图片描述从图中可以知道S3C2410提供4个寄存器来完成所有的I^2C操作。SDA线上的数据从IICDS寄存器发出,或传入IICDS寄存器中;IICADD寄存器中保存S3C2410当作从机时的地址;IICCON、IICSTAT两个寄存器用来控制或标识各种状态,比如选择工作模式,发出S信号,P信号,决定是否发出ACK信号,检测是否接收到ACK信号。各寄存器的用法如下:

IICCON寄存器

IICCON寄存器用于控制是否发出ACK信号、设置发送器时钟、开启I^2C中断,并标识中断是否发生。各位的含义如下:
在这里插入图片描述使用IICCON寄存器时,使用注意事项

  • I^2C中断在一下3中情况下发生:当发出地址信息或接收到一个从机地址并且吻合时,当仲裁线失败时,当发送/接收完一个字节的数据时。
  • 基于SDA,SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清楚中断。

IICSTAT寄存器

IICSTAT寄存器用于选择I^2C接口的工作模式、发出S信号、P信号,使能接收/发送功能,并标识各种状态,比如总线仲裁是否成功、作为从机时是否被寻址、是否接收到0地址、是否接收到ACK信号等。
功能如下:
在这里插入图片描述

ICCADD寄存器

表示从机地址。IICADD寄存器在串行输出使能位IICSTAT[4]为0时(禁止接收/发送功能),才可以写入;在任何时间都可以读出.

IICDS寄存器

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

S3C2410 IIC总线操作方法

方法一

当IICCCON[4]即中断状态为为0时,通过写IICSTAT寄存器启动IIC操作

方法二

当IICCON[4]写入0即中断状态位为1时,表示IIC操作被暂停。在这期间设置好其他寄存器之后,向IICCON[4]写入0即可恢复IIC操作。所谓"设置其他寄存器"有以下3种情况。

  • 对于主机模式可以按照方法一
  • 对于发送器,可以将下一个要发送的数据写入IICDS寄存器中,恢复IIC操作后即可发出
  • 对于接收器,可以从IICDS寄存器中读出收到的数据。最后向IICON[4]写入0的同时,设置IICCON[7]决定接收到下一个数据是否发出ACK信号。

通过中断服务程序来驱动IIC传输

  • 当仲裁失败时发生中断——本次传输没有抢到总线,可以稍后继续
  • 当主机模式,发出S信号、地址信息并经过一个SCL周期(对应ACK信号)后,发送中断——主机可以在此时判断是否成功寻址到从机。
  • 对于从机模式,当接收到地址与IICADD寄存器吻合时,先发出ACK信号,然后发生中断——从机可在此时准备后续的传输。
  • 对于发送器,当发送完一个数据并经过一个SCL周期后,发生中断。这时候可以准备发下一个,也可以发P信号结束传输’
  • 对于接收器,当接收到一个数据时,先根据IICCON7决定是否发出ACK信号后,然后发出中断。

IIC寄存器操作流程

在这里插入图片描述

IIC总线操作实例

对应着上面的开发流程进行编写程序就行

IIC接口RTC芯片M41t11的操作方法

在这里插入图片描述
在这里插入图片描述
源码部分,大家参考一下教材,后面有机会一起分析。

总结

今天有点赶时间,但是IIC很重要,在做汽车方面与CAN总线都有着一样的重要性,基本上工作上面对IIC的要求都很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值