声明:在翻译本文之前并没有去查找相关的翻译文献,只是认为这样可以让自己对IIC总线有更好的了解。同时也提升一下自己的英语水平,所以如果有什么翻译不对的地方或者不清楚的地方请大家指出,谢谢,同时希望我翻译的文献对大家有用。
IIC总线接口
概述:
S3C2440ARISC微处理器支持多主IIC总线串行接口。一条专用的串行数据线(SDA)和一个串行时钟线(SCL)携带总线主机和通过IIC总线连接外部设备的信息。同时SDA线和SCL线都是双向的。
在多重主机IIC总线模式时,S3C2440A RISC微处理器可以与从机设备收发串行数据。主机设备可以通过IIC总线开始或者终止一个数据的传输。而在S3C2440A中IIC总线使用标准总线仲裁过程。
为了控制多主机IIC总线操作,数据必须写到下面的寄存器中:
— 多重主机IIC总线控制寄存器,IICCON
— 多重主机IIC总线控制/状态寄存器,IICSTAT
— 多重主机IIC总线Tx/Rx数据传输寄存器,IICDS
— 多重主机IIC总线地址寄存器,IICADD
当IIC总线空闲时,SDA线和SCL线都应该处在高电平。而当SCL线一直处在高电平时,SDA线从高电平转到低电平表示一个开始信号。而一个从低电平到高电平的转化表示一个结束信号。
而开始信号和结束信号只有主机设备可以产生。在开始信号发出后,一个7位的地址数据发送由主机发送到总线中。而第8位表示传输的方向(是读还是写)。
每一个发送到SDA线上的数据都应该有8位。而在总线传输操作时,任何一字节的数据都可以没有限制的收发。而数据总是从高字节位开始发送,同时每字节的数据的发送之后应该立马跟随一个应答位(ACK)。
IIC总线框架图
IIC总线接口:
S3C2440A的IIC总线接口有四种操作模式
— 主机传送模式
— 主机接收模式
— 从机传送模式
— 从机接收模式
这些操作模式的功能关系描述在下面。
开始和结束信号:
当IIC总线接口在没有使能时,他通常做从机模式。换句话说,也就是在SDA线检测到开始信号(开始信号,即当SCL线为高电平时SDA线由高电平转化为低电平)之前,这个接口应当处于从机状态。而当这个接口状态改变到主机模式时,SCL信号产生,同时SDA发起数据的传输。
一个开始信号后可以在SDA线上传输一个一字节的数据,而一个结束信号可以终止数据的传输。而一个结束信号就是当SCL在高电平时,SDA有低电平向高电平的转化。而总是主机产生开始和结束信号。当一个开始信号产生后,IIC总线进入忙状态。而一个结束信号可以使IIC总线进入空闲状态。
当主机发起开始信号,他应该发出一个从机地址去识别从机设备。一字节地址数据包含7位的地址位和一位的传输方向位(表示是读或者写)。如果第八位是0,表示一个写操作(传送操作),如果第八位是1,表示需要读数据(接收操作)。
主机将通过传送结束信号来完成传输操作。如果此时主机想继续传输数据到总线,他应该再产生一个开始信号和一个从机地址。这样读写操作可以使用各种方式操作。
数据传输格式:
SDA线上每字节的数据长度都应该是8位。而这字节数可以没有限制的传输。而在开始信号后的一字节数据应该为地址数据。当IIC总线操作在主机模式时,地址数据可以被主机发出。而传输完每一个字节数据后都应该有一位应答位(ACK)。同时高字节在前面,而且总是第一个发地址数据。
应答信号传输:
为了表示一字节传输完成,接收器要向发送器发送一位的应答信号(ACK)。这个应答信号要在SCL线发出第九个时钟时发出。前面的八个时钟用于传输一字节的数据。而主机应该产生时钟脉冲来产生ACK位。
当接收到ACK时钟时,发送器应该释放SDA线以使其为高电平。而接收器应该再ACK时钟周期内将SDA线拉为低电平作为应答。因此SDA线保持在低电平在第九个SCL脉冲周期内。
而ACK为可以通过软件(IICSTAT)设置为使能或者失能。然而在SCL第九个脉冲周期时ACK脉冲需要已经完成一字节的数据传输。
读写操作:
在传送模式,当数据传输时,IIC总线将会处于等待状态知道IIC总线数据转移寄存器(IICDS)接收到一个新的数据。而在新的数据写入寄存器之前,SCL线将会保持低电平。而当数据写完时,SCL将会被释放回到高电平。S3C2440A可以使用中断来识别当前的数据是否传输完成。然后CPU收到中断请求,然后他再次写一个新的数据到IICDS寄存器。
在接收模式,当数据接收时,IIC总线接口将处在等待状态,知道IICDS寄存器完成读操作。而在新的数据读出寄存器之前,SCL线将会保持低电平。而当数据读出后,SCL将会被释放回到高电平。S3C2440A可以使用中断来识别当前的数据是否接收完成。然后CPU收到中断请求,然后他再次写一个新的数据到IICDS寄存器。
总线仲裁过程:
仲裁发生在SDA线上来阻止在总线上两个主机的冲突。如果一个主机他的SDA处在高电平,当他检测到另一个主机的SDA处于低电平。他将不会发起一个数据的传输。因为当前层的总线和他是不一样的。而这时就要仲裁处理了,知道SDA返回高电平为止。
然而,当多个主机同时拉低他们的SDA线时,每一个主机都应该评估是否主权属于他自己。而评估的目的是每一个主机应该检测他的地址位。同时每个主机产生从机地址,同时他也应该探测SDA上的地址位,因为SDA很可能为低电平而不是保持高电平。假设一个主机产生一个低电平在第一个地址位,而其他的主机继续保持高电平。在这种情况下两个主机将在总线上检测到低电平。因为低电平状态相对于高电平在能量上有更高的优先级。当次发送,(地址的第一位)为低电平成为主机获得主权,而(地址的第一位)为高电平将要退出主权。如果第一位都为低电平,那么就应该仲裁第二位地址数据,以此类推直到最后一个地址位。
终止条件:
如果从机接收器不能应答来确认从机地址,那么应该将SDA拉为高电平。在这种情况下,主机应该产生一个结束信号同时终止传输。
如果一个主机接收器要结束传输,他将在从机传输完最后一个数据后取消产生应答信号(ACK)来终止这个传输。从机传输器然后应该释放SDA线给主机来产生停止信号。
配置IIC总线:
4位的预分频系数被编程到IICCON寄存器中来控制串行时钟(SCL)的频率。而IIC总线接口地址储存在IIC总线地址寄存器(IICADD)中。(而默认,IIC总线接口有一个未知值)。
在各种模式操作下的流程图:
在任何传送/接收操作前,下面的步骤一定要实施。
1. 如果需要,写自己从机地址到IICADD寄存器
2. 设置IICCON寄存器
a) 使能中断
b) 定义SCL周期
3. 设置IICSTAT来使能串行输出
IIC总线接口专用寄存器:
多主机IIC总线控制寄存器(IICCON):
寄存器 | 地址 | R/W | 描述 | 设置值 |
IICCON | 0x54000000 | R/W | IIC总线控制寄存器 | 0x0X |
IICCON | Bit | 描述 | 初始值 |
应答(ACK)产生 | 7 | IIC总线应答使能位。 0:不使能 1:使能 在传送模式,IICSDA为空闲在应答时 在接收模式,IICSDA为低电平在应答时 | 0 |
传输时钟源选择 | 6 | IIC总线传输时钟源预分频选择位。 0:IICCLK =fPCLK/16 1:IICCLK =fPCLK/512 | 0 |
收发中断 | 5 | IIC总线收发中断使能位。 0:不使能 1:使能 | 0 |
中断悬挂标志 | 4 | IIC总线收发中断悬挂标志。这位不能被写为1。当该位被读为1,IICSCL在低电平同时IIC被终止,而要恢复操作将该位设为0. 0: 1)(当读时)没有中断悬挂 2)(当写时)清中断悬挂并恢复操作 1: 1)(当读时)中断悬挂 2)(当写时)没有该操作 | 0 |
传输时钟值 | 3:0 | IIC总线传输时钟预分频。 IIC总线传输时钟频率由这4位预分频值决定,根据下面公式: Tx clock = IICCLK/(IICCON[3:0]+1). | 没有定义 |
注意:
1. 接口到EEPROM,在读最后一个数据之前应答信号应该失能,以为传送模式产生结束信号。
2. IIC中断在下面条件可产生 1)当1字节传输或者接收完成时 2)当一个常规的调用或者从机地址匹配时 3)如果总线仲裁失败。
3. 为了调整SDA的时间在SLC的上升沿,IICDS寄存器必须在清中断悬挂位之前写入。
4. IICCLK由IICCON的第6位决定。传输时钟改变传输时间。而当IICCON[6]=0,而IICCON[3:0]=0x0或者0x1是不可取的。
5. 如果IICCON[5]=0,而对IICCON[4]的操作就不是正确的。所以建议你即使你不用IIC中断,也应该将IICCON[5]设置为1。
多主机IIC总线控制/状态寄存器(IICSTAT):
寄存器 | 地址 | R/W | 描述 | 设置值 |
IICSTAT | 0x54000004 | R/W | IIC总线控制/状态寄存器 | 0x0 |
IICSTAT | Bit | 描述 | 初始值 |
模式选择 | 7:6 | IIC总线主/从 收/发模式选择 00: 从机收模式 01: 从机发模式 10: 主机收模式 11: 主机发模式 | 00 |
忙状态 开始终止信号 | 5 | IIC总线忙状态位。 0: 读) 不忙 写) 结束信号产生 1: 读)忙 写) 开始信号产生 开始信号后IICDS中的数据自动传送。 | 0 |
串行输出 | 4 | IIC总线串行输出使能位。 0: 失能收发 1: 使能收发 | 0 |
仲裁状态标志 | 3 | IIC总线仲裁状态标志位。 0: 总线仲裁成功 1: 总线仲裁失败 | 0 |
从机地址状态 | 2 | IIC总线从机地址状态位。 0: 当检测到开始结束信号,清除该位 1: 接收从地址值并将其与IICADD中的地址比较 | 0 |
地址0状态标志 | 1 | IIC总线地址0状态标志位。 0: 当检测到开始结束信号,清除该位 1: 接收到的从地址值为00000000b | 0 |
最后收取位状态标志 | 0 | IIC总线最后收取位状态标志位。 0: 最后收取位为0(收到ACK应答) 1: 最后收取位为1(没有收到ACK应答) | 0 |
多主机IIC总线地址寄存器(IICADD):
寄存器 | 地址 | R/W | 描述 | 设置值 |
IICADD | 0x54000008 | R/W | IIC总线地址寄存器 | 0xXX |
IICADD | Bit | 描述 | 初始值 |
从机地址 | 7:0 | IIC总线发出的7位从机地址。 当在IICSTAT寄存器中串行输出使能位被设为0,而IICADD的写被使能。IICADD中的值随时可以被读取而不用去管当前串行输出使能位(IICSTAT)是否被设置。 从机地址:[7:1] 没有映射:[0] | XXXXXXXX |
多主机IIC总线传输/接收数据转移寄存器(IICDS):
寄存器 | 地址 | R/W | 描述 | 设置值 |
IICDS | 0x5400000C | R/W | IIC总线传输/接收数据转移寄存器 | 0xXX |
IICADD | Bit | 描述 | 初始值 |
数据转移 | 7:0 | IIC总线收发操作的8位数据转移寄存器。 当IICSTAT的串行输出使能位设为1,而IICDS的写使能。IICDS的值随时可以被读取而不用去管当前串行输出使能位(IICSTAT)是否被设置。 | XXXXXXXX |
多主机IIC总线线控制寄存器(IICLC):
寄存器 | 地址 | R/W | 描述 | 设置值 |
IICLC | 0x54000010 | R/W | IIC总线线控制寄存器 | 0x00 |
IICLC | Bit | 描述 | 初始值 |
过滤器使能 | 2 | IIC总线过滤器使能位。 当SDA端被设置为输入时,该位应该为高电平。这个过滤器可以通过阻止双PCLK时间时的小故障来阻止错误的发送 0: 失能过滤器 1: 使能过滤器 | 0 |
SDA输出延时 | 1:0 | IIC总线延时长度选择位。 随时钟时间(PCLK)SDA线的延时 00: 0个时钟 01: 5个时钟 10: 10个时钟 11: 15个时钟 | 00 |