I 2C
IIC 总线接口特性
1.单片机串行接口的发送和接收一般都各用一条线,如的TXD
2.当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。
3.主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。I2C
4.总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。
5.I2C
6.在I2C
7.当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL
8.在I2C
9.当时钟线SCL
10.当SCL
11.开始和结束信号都是由主器件产生。
12.在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。
IIC 总线数据传送格式
1.在I2C
(1)
(2)
2.
为了完成一个字节的传输,接收方应该向发送方发送一个ACK位。ACK应该发生在SCL线的第九个脉冲期间。当接受到ACK信号时,发送方应该释放SDA线使SDA线电平为高。接收方应该驱动SDA线为低在ACK脉冲过程中。因此,在第九个SCL脉冲的高电平期间SDA保持为低(因为信号是“与”的)。ACK的传输可以由软件通过IICSTAT寄存器控制是否禁止,但它仍然是需要产生的。
IIC 总线数据传送过程
1.每次都是先传最高位,通常从器件在接收到每个字节后都会做出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。
2.如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C
读写操作
在发送模式下,当一个数据传输时,IIC总线接口将等待直到IICDS寄存器收到一个新数据。在一个新数据写入IICDS寄存器前,SCL信号将保持为低。在数据被写入之后,信号线被释放(为高)。ARM需要保持中断信号来辨别当前数据发送完成。在ARM接到一个中断请求后,它将写一个新的数据到IICDS。
在接收模式下,当一个数据接收时,IIC总线接口将等待直到IICDS寄存器数据被读出。在新数据被读出之前,SCL信号保持为低。在数据被读出后,信号线被释放(为高)。ARM应保持中断信号以辨别接收数据操作完成。在ARM收到一个中断请求时,它将从IICDS读出数据。
IIC 总线竞争和仲裁机制
1.
况。
2.
3.
而另一个主器件发送低电平,则发送电平与此时SDA
自动关闭其输出级。
IIC 总线工作流程
开始:信号表明传输开始。
地址:主设备发送地址信息,包含7
数据:根据指示位,数据在主设备和从设备之间传输。数据一般以8
停止:信号结束传输。
S3C2410 的IIC 总线控制器
S3C2410
钟线。它的操作模式有四种:
1.主设备发送模式
2.主设备接收模式
3.从设备发送模式
4.从设备接收模式
下图为S3C2410
发送和接收步骤
在任何IIC Tx/Rx
1.
2.
a)
b)
3.
IIC 总线控制相关寄存器
IIC
Register | Address | R/W | Description | Reset Value |
IICCON | 0x54000000 | R/W | 总线控制寄存器 | 0x0X |
IICCON | Bit | Description | Initial |
Acknowledge generation (note 1) | [7] | IIC总线确认位使能 0 = 在Tx模式,IICSDA在确认时间内是任意的,在Rx | 0 |
Tx clock source selection | [6] | IIC总线传输时间对于资源时间的分频位 0 = IICCLK = fPCLK /16 1 = IICCLK = fPCLK /512 | 0 |
Tx/Rx Interrupt (note 5) | [5] | IIC总线 0 = Disable, 1 = Enable | 0 |
Interrupt pending flag (note 2), (note 3) | [4] | IIC总线Tx/Rx中断未决标志位. 该位不能被写为1,当该位读为1的时候,IICSCL信号为低并且IIC停止,要恢复操作,只需将该位清零 0 = 1) 1 = 1) | 0 |
Transmit clock value (note 4) | [3:0] | IIC总线传输时钟预分频 Tx clock =IICCLK/(IICCON[3:0]+1). | 未定义 |
注意:
1.下面的几种情况将产生一个IIC
1) 当一个字节传输或接受操作完成的时
2) 一个普通调用或一个从地址匹配产生时;
3) 总线仲裁失败时;
2.
3.IICLK
IIC
Register | Address | R/W | Description | Reset Value |
IICSTAT | 0x54000004 | R/W | IIC总线状态寄存器 | 0x0 |
IICSTAT | Bit | Description | Initial |
Mode selection | [7:6] | IIC总线主/从 00: 10: | 00 |
Busy signal status / START STOP condition | [5] | IIC总线忙信号状态位 0 = 1 = IICDS中的数据在START信号后自动传输 | |
Serial output | [4] | IIC总线数据输出使能/禁止位 0 =禁止 | 0 |
Arbitration status flag | [3] | IIC总线过程仲裁状态位 0 =总线仲裁成功 1 = | 0 |
Address-as-slave status flag | [2] | IIC总线从地址状态标志位. 0 = 1 =接收到的slave地址匹配IICADD的值 | 0 |
Address zero status flag | [1] | IIC总线地址零状态标志位 0 =当START/STOP信号探测到时清零. 1 =接收到的从地址为 | 0 |
Last-received bit status flag | [0] | IIC总线IIC-bus上一次接收到的状态标志位. 0 =上一次接收到的位是0 (ACK was received). 1 =上一次接收到的位是1 (ACK was not received). | 0 |
地址寄存器(IICADD)
Register | Address | R/W | Description | Reset Value |
IICADD | 0x54000008 | R/W | IIC总线地址寄存器 | 0xXX |
IICADD | Bit | Description | Initial |
Slave address | [7:0] | 7位从地址,从IIC总线中锁存 | XXXXXXXX |
| | 当IICSTAT | |
| | IICADD的值可以在任何时候被读取, | |
| | 输出允许位(IICSTAT)的设置 | |
| | 从地址 | |
| | Not mapped = [0] | |
移位数据寄存器(IICDS)
Register | Address | R/W | Description | Reset Value |
IICDS | 0x5400000C | R/W | IIC总线移位数据寄存器 | 0xXX |
IICDS | Bit | Description | Initial |
Data shift | [7:0] | IIC总线Tx/Rx | XXXXXXXX |
| | 当IICSTAT | |
| | IICDS的值可以在任何时候被读取, | |
| | 出允许位(IICSTAT)的设置. | |
源代码:
#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
#define WRDATA
#define POLLACK
#define RDDATA
#define SETRDADDR
#define IICBUFSIZE 0x20
static U8 iicData[IICBUFSIZE];
static volatile int iicDataCount;
static volatile int iicStatus;
static volatile int iicMode;
static int iicPt;
void Wr24C02(U32 slvAddr,U32 addr,U8 data);
void Rd24C02(U32 slvAddr,U32 addr,U8 *data);
void IicPoll(void);
void Run_IicPoll(void);
void Main(void)
{
}
void Wr24C02(U32 slvAddr,U32 addr,U8 data) // slvAddr 为从地址
{
}
//************************[ _Rd24C02 ]********************************
void Rd24C02(U32 slvAddr,U32 addr,U8 *data)
{
}
void Run_IicPoll(void)
{
}
void IicPoll(void)
{
}