-
项目
4.3
IIC
串口通信
一、
任务目标。
?
理解单片机的
IIC
通信原理。
?
实现两个单片机之间利用
IIC
进行通信。
二、任务要求。
任务主要实现一个单片机通过
p>
IIC
通信方式访问
24C02
。
三、相关知识点。
1
、
IIC
总线概述:
IIC
总线是
PHLIPS
< br>公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决
和高低速器件同
步功能的高性能串行总线。
IIC
总线只有两根双向信号线。一
根是数据线
SDA
,另一根是时钟线
S
CL
。如下图:
图
4.20
IIC
总线
IIC
< br>总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任
一器件输出的低电平,都将使总线的信号变低,即各器件的
SDA
及
SCL
都是线“与”关系。
如下图
:
图
4.21
IIC
总线线与图
每个接到
IIC
总线上的器件都有唯一的地址。
主机与其
它器件间的数据传送可以是由主
机发送数据到其它器件,
这时主
机即为发送器。
由总线上接收数据的器件则为接收器。
在多
p>
主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,
< br> IIC
总线要通
过总线仲裁,以决定由哪一台主机控制
总线。
2
、
IIC
总线数据传送:
1
)数据位的有效性规定
IIC
总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须
保持稳定,只
有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许
变化。如下图:
图
4.22
IIC
总线通信数据发送
2
)起始信号和终止信号
SCL
线为高电平期间,
SDA
< br>线由高电平向低电平的变化表示起始信号;
SCL
线为高
电平
期间,
SDA
线由低电平向高电平
的变化表示终止信号。如下图:
图
4.23
起始信号和终止信号
起始和终止信号都是由主机发出的,
在起始信号产生后,
总线就处于被占用的状态;
在
终止信号产生后,
p>
总线就处于空闲状态。
连接到
IIC
总线上的器件,
若具有
IIC
总线的硬件
接口,
则很容易检测到起始和终止信号。<
/p>
接收器件收到一个完整的数据字节后,
有可能需要
完成一些其它工作,
如处理内部中断服务等,
可能无法
立刻接收下一个字节,
这时接收器件
可以将
SCL
线拉成低电平,
从而使主机处于等待状态。
直到接收器件准备好接收下一个字节
时,再释放
SCL
线使之为高电平,从而使数据传送可以继续进行。
3
、数据传送格式
1)
字节传送与应答
每一个字节必须保证是
8
位长度。数据传送时,先传送
最高位
(
MSB
)
,
每一个被传送的
字节后面都必须跟随一位应答位(即一帧
共有
9
位)
。如下图:
图
4.24
字节传送与应答
由于某种原因从机不对主机寻址信
号应答时
(如从机正在进行实时性的处理工作而无法
接收总线上
的数据)
,它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线
的数据传送;
如果从机对主机进行了应答,<
/p>
但在数据传送一段时间后无法继续接收更多的数据时,
从
机可以通过对无法接收的第一个数据字节的“非应答”通知主机,
主机则
应发出终止信号以
结束数据的继续传送;
当主机接收数据时,
它收到最后一个数据字节后,
必须向从
机发出一个结束传送的信号。
这个信号是由对从机的“非应答”来实现的。
然后,
从机释放
SDA
线,
以允许主机产生终止
信号。
2)
数据帧率格式
< br>IIC
总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号
。在起
始信号后必须传送一个从机的地址(
7
< br>位)
,第
8
位是数据的传送方向
位(
R/T
)
,用“
< br>0
”表
示主机发送数据(
T
p>
)
,“
1
”表示主
机接收数据(
R
)
。每次数据传送总是
由主机产生的终止
信号结束。
但是,若主机希望继续占用总线进
行新的数据传送,则可以不产生终止信号,马
上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传送过程中,可以有以下几种组合方式:
<
/p>
(
1
)主机向从机发送数据,数据的传送
方向在整个传送过程中不变:
【<
/p>
注
】有阴影部分表示数据由主机向从机传送,无阴影部分则表示数
据由从机向主机传送。
A
表示应答,
A
非表示非应答(高电
平)
。
S
表示起始信号,
P
表示终止信号。
p>
(
2
)主机在第一个字节后,立即从从机读
数据:
(
3
)
在传送过程中,
当需要改变传送方向时,
起始信号和从机地址都被重复产生一次,
但两次读
/
写方向位正好反相。
4
、总线的寻址
IIC
总线有明确规定:采用
7bit
寻址字节(寻址字节是起始信号后的第一个字节)
。
【
注
】
p>
D7
~
D1
位组成
从机的地址。
D0
位是数据传送方向位,为
“
0
”
时表示主机向从机
写数据,为
“
1
”
p>
时表示主机由从机读数据。
主机发送地址
时,总线上的每个从机都将这
7
位地址码和自己的地址比较,如
果相同,
则认为自己被主机寻址,根据
R/T
< br>位将自己确认为发送器或者接收器。
从机的地址由固定
部分和可编程部分组成。
在一个系统中,
可能希望接入多个相同
的从
机,从机地址中可以编程的部分决定了可接入总线该类器件的最大数目。如一个从机
的
7
位寻址位有
4
位是固定位,
3
位是可编程位,这时仅能寻址
8
个同样的器件,即可以有
8
个
同样的器件接入到该
IIC
总线系
统中。
附:单片机
IIC
串行总线数据传送模拟
图
4.25
总线数据传送信号
四、项目分析
本项目主要实现单片机
通过
IIC
通信方式访问
24C02<
/p>
。项目实现采用
Proteus
8 <
/p>
Professional
进行仿真实验,单片机采用
51
单片机。
1
、硬件电路设计
在
Proteus 8 Professional
仿真软件按下图设计出仿真原理图,
硬件电路包括一个
51
单片
机和一个
LED
灯带,一个
24C02C
和一个
IIC
通信协议分调试。
U
1
19
XTAL1
P0.0/AD0<
/p>
P0.1/AD1
P0.2/AD2
P0
.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2
.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
P3.0/RX
D
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
39
38
37
36
35
34
33
32
21<
/p>
22
23
24
2
5
26
27
28
10
11
12
13
< br>14
15
16
17
18
RP1
RESPACK-8
9
XTAL2
RST
U2
SDA
SCK
7
5
p>
6
WP
SDA
SC
K
24C02C
A2
A1
A0
3
2
1
9
8
7
6
5
4
3
2
1
U3
20
19
18
17
16
15
< br>14
13
12
11
1
2
3
4
< br>5
6
7
8
9
10
LED-BARGRAPH-GRN
< br>29
30
31
PSEN
ALE
EA
1
2
3
4
5
6
7
8
P1.0/T2
P1
.1/T2EX
P1.2
P1.3
P1
.4
P1.5
P1.6
P1.7
AT89C52
SDA
SCL
TRIG
I2C
图
4.26
IIC
通信硬件原理电路图
2
、程序设计
IIC
通信模块的程序设计主要包括系统启动后向立即向
24
C02
中写入从
0
到
< br>100
的数据,
然后每个约
1S
从
24C02
中依次读取写入的数据,
读完后系统等待。
/*
实验
名称
:
IIC
通信实验
功
能
: <
/p>
单片机用
IIC
通信方式向
24C02
写入
晶
振:
11.0592MHz
MCU
类
型:
A
T89C51
作
者:胡云冰
创建
日期:
14-02-08
*/
#include
#define
W_cmd 0xa0
//
p>
写指令,以
A
开头,后有地址
,参见手册
#define R_cmd 0xa1
//
读指令,以
A
开头,后有地址
sbit SCL=P2^5;
sbit
SDA=P2^4;
sbit WP=P2^3;
/***
**************************************************
********************
**
函数名称
: void delay(int x)
**
功能描述
:
软件延时
**
输
入
: int x
**
输
出
:
无
**
全局变量
:
无
**
调用模块
:
无
**
说
明:无
**
注
意:无
***************************************
***********************************/
void delay(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/********************************************
*****************************
**
函数名称
: void Dely24(void)
**
功能描述
:
用于通信中的软件延时
**
输
入
:
无
**
输
出
:
无
**
全局变量
:
无
**
调用模块
:
无
**
说
明:这个时间与器件、上拉电阻有很大关系,一般宜大不宜小
**
注
意:无
***************************************
***********************************/
void Dely24(void)
{
unsigned char
i;
for(i=0;i<20;i++);
}
/*************************
************************************************
**
函数名称
: unsigned
char ReadByte(void)
**
功能描述
:
时钟下降沿读取一位数据
**
输
入
:
无
**
输
出
: j
**
全局变量
:
无
**
调用模块
:
无
**
说
明:无
**
注
意:无
***************************************
***********************************/
unsigned char ReadByte(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
//
循环读
8
位
{
SDA=1;
p>
//
置高,不影响后续读取,而且是必须的
SCL=1;
j<<=1;
j|=(bit)SDA;
//
读<
/p>
1
位
SCL=0;
-
-
-
-
-
-
-
-
-
上一篇:CCD图像传感器详解
下一篇:王尔德经典语录英文