文章目录
前言
- 了解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中例外。
- 当从机不能响应主机地址时(例如它正忙于其他事而无法响应I^2C总线的操作,或者这个地址没有对应的从机),在第九个SCL周期内SDA线没有被拉低,即没有ACK信号。这时,主机发出一个P信号终止传输或则重新发出一个S信号开始新的传输。
- 如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
- 主机接收器在接收到最后一个字节后,不会发出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的要求都很多。