I2C总线器件应用设计.docx
《I2C总线器件应用设计.docx》由会员分享,可在线阅读,更多相关《I2C总线器件应用设计.docx(25页珍藏版)》请在冰豆网上搜索。
I2C总线器件应用设计
2012~2013学年第2学期
《单片机原理及应用》
课程设计报告
题目:
I2C总线器件应用设计
专业:
10自动化
班级:
指导教师:
电气工程系
2013年5月5日
1、任务书
课题名称
I2C总线器件应用设计
指导教师(职称)
林开司
执行时间
2012~2013学年第2学期第10周
学生姓名
学号
承担任务
设计目的
(1)掌握I2C总线器件的读写原理并设计一个器件写入0~4这5个数字,从地址0开始存入,然后把它读出来送到LCD1602液晶显示。
(2)通过设计巩固所学的知识
(3)提高我们的综合实践能力
设计要求
(1)挂接两个I2C总线器件(24C02),分别命名为A和B,向其中一个器件A写入0~4这5个数字,从地址0开始存入。
(2)将A中已经有的5个数倒叙存入B中,从地址0开始存放。
(3)从地址0开始到地址4结束,将B中每个地址的内容显示于数码管中。
(4)扩展:
在掌握了前三个操作原理的基础上,尝试使用I2C器件存储单片机要用到的有用信息,并在需要的时候调用。
摘要
在一些应用系统设计中,有时需要对工作数据进行掉电保护,如电子式电能表等智能化产品。
若采用普通存储器,在掉电时需要备用电池供电,并需要在硬件上增加掉电检测电路,但存在电池不可靠及扩展存储芯片占用单片机过多口线的缺点。
本文采用具有I2C总线接口的串行EEPROM器件AT24C02芯片可很好地解决掉电数据保持问题,且硬件电路简单。
关键字:
I2C总线;时钟信号;LCD液晶;存储芯片
I2C总线器件应用设计
第一章I2C总线的概念
I2C(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
也可以简单地理解为I2C是微控制器与外围芯片的一种通讯协议。
在不同的书籍中,可能会称为I2C,IIC,或者I平方C,但是概念也是一样的,只是叫法不同。
I2C总线特点
I2C总线的优点非常多,其中最主要体现在1:
硬件结构上具有相同的接口界面;2:
电路接口的简单性;3:
软件操作的一致性。
I2C总线占用芯片的引脚非常的少,只需要两组信号作为通信的协议,一条为数据线(SDA),另一条为时钟线(SCL)。
因此减少了电路板的空间和芯片管脚的数量,所以降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线还具备了另一个优点,就是任何能够进行发送和接收数据的设备都可以成为主控机。
当然,在任何时间点上只能允许有一个主控机。
图1总线连接图
I2C总线的构成及信号类型:
构成:
数据线SDA
时钟线SCL
数据传输的有效规则:
1.SCL高电平期间,SDA保持不变,数据有效。
2.SCL低电平期间,SDA改变,数据变化有效。
应用方式:
1.标准硬件i2C端口(硬核)。
2.软件模拟i2C端口(可编程器件用软件实现)
第二章I2C总线工作原理
图1为I2C总线的连接图。
I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。
在单片机与被控IC之间,最高传送速率100kbps。
各种I2C器件均并联在这条总线上,就像电话线网络一样不会互相冲突,要互相通信就必须拨通其电话号码,每一个I2C模块都有唯一地址。
并接在I2C总线上的模块,既可以是主控器(或被控器),也可以是发送器(或接收器),这取决于它所要完成的功能。
I2C总线在传送数据过程中共有四种类型信号,它们分别是:
起始信号、停止信号﹑应答信号与非应答信号。
[起始信号]SCL高电平时,SDA产生高到低的下降沿跳变
[停止信号]SCL高电平时,SDA产生低到高的上升沿跳变
[应答信号]接收数据的器件在接收到8bit数据后,向发送数据的器件发出低电平信号,表示已收到数据。
这个信号由接收数据的器件发出。
发送端收到应答信号后,作出分析判断。
若未收到应答信号,则判断为受控单元出现故障。
2.1I2C总线数据的传送规则
起始信号:
在I2C总线工作过程中,当SCL为高电平时,SDA由高电平向低电平跳变,定义为起始信号,起始信号由主控机产生。
如图2所示
图2开始信号
停止信号:
当SCL为高电平时,SDA由低电平向高电平跳变,定义为停止信号,此信号也只能由主控机产生。
如图3所示。
图3停止信号
应答信号:
I2C总线传送的每个字节为8位,受控的器件在接收到8位数据后,在第9个脉冲必须输出低电平作为应答信号,同时,要求主控器在第9个时钟脉冲位上释放SDA线,以便受控器发出应答信号,将SDA拉低,表示接收数据的应答(如图4所示)。
若果在第9个脉冲收到受控器的非应答信号(如图5所示),则表示停止数据的发送或接收。
图4应答信号图5非应答信号
其次,每启动一次总线,传输的字节数没有限制。
主控件和受控器件都可以工作于接收和发送状态。
总线必须由主器件控制,也就是说必须由主控器产生时钟信号﹑起始信号﹑停止信号。
在时钟信号为高电平期间,数据线上的数据必须保特稳定,数据线上的数据状态仅在时钟为低电平的期间才能改变(如图6),而当时钟线为高电平的期间,数据线状态的改变被用来表示起始和停止条件(如图2与3所示)。
图6数据的有效性
2.2总线数据传送的时序要求
为了保证数据传送的可靠性,标准的总线数据传送有着严格的时序要求,如总线上时钟信号的最小低电平周期为4.7us,最小的高电平周期为4us等。
用单片机的普通I/O口模拟总线的数据传送时,单片机的时钟信号都能满足SDA、SCL上升沿、下降沿的时间要求,因此,在时序模拟时,最重要的是保证典型信号。
图7为总线的完整时序,在这里有一点要加以说明的,当主控器接收数据时,在最后一个数据字节,必须发送一个非应答信号,使受控器释放数据线,以便主控器产生一个停止信号来终止总线的数据传送。
图7总线的完整时序
2.3I2C总线的控制程序实现
/*I2C的启动程序*/(时钟线高时,数据线上升沿)
VoidI2CStart(void)
{
SDA=1;//释放数据线
SomeNOP();//延时
SCL=1;//时钟线拉高
SomeNOP();//延时
SDA=0;//数据线拉低
SomeNOP();//延时
SCL=0;//时钟线拉低
SomeNOP();//延时
/*I2C的停止程序*/(时钟线高时,数据线上升沿)
voidI2CStop(void)
{
SDA=0;
SomeNOP();
SCL=1;
SomeNOP();
SDA=1;
SomeNOP();
}
/*I2C的应答程序*/
voidACK(void)//Acknowledge信号
{
SDA=0;//发送0,应答
SomeNOP();
SCL=1;
SomeNOP();//产生时钟高电平
SCL=0;
SomeNOP();
}
voidNACK(void)//没有Acknowledge信号
{
SDA=1;//发送1,非应答
SomeNOP();
SCL=1;
SomeNOP();//产生时钟高电平
SCL=0;
SomeNOP();
}
下面我们来看一下关于I2C总线的读操作与写操作:
图8总线写格式
写操作就是主控器件向受控器件发送数据,如图8所示。
首先,主控器会对总线发送起始信号,紧跟应该是第一个字节的8位数据,但是从地址只有7位,所谓从地址就是受控器的地址,而第8位是受控器约定的数据方向位,“0”为写,从图7中我们可以清楚地看到发送完一个8位数之后应该是一个受控器的应答信号。
应答信号过后就是第二个字节的8位数据,这个数多般是受控器件的寄存器地址,寄存器地址过后就是要发送的数据,当数据发送完后就是一个应答信号,每启动一次总线,传输的字节数没有限制,一个字节地址或数据过后的第9个脉冲是受控器件应答信号,当数据传送完之后由主控器发出停止信号来停止总线。
写8位数据
bitWrite8Bit(unsignedcharinput){
unsignedchartemp;
for(temp=8;temp!
=0;temp--){
SDA=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}
图9总线读格式
读操作指受控器件向主控器件发送数,其总线的操作格式如图5-28。
首先,由主控器发出起始信号,前两个传送的字节与写操作相同,但是到了第二个字节之后,就要从新启动总线,改变传送数据的方向,前面两个字节数据方向为写,即“0”;第二次启动总线后数据方向为读,即“1”;之后就是要接收的数据。
从图9的写格式中我们可以看到有两种的应答信号。
一种是受控器的,另一种是主控器的。
前面三个字节的数据方向均指向受控器件,所以应答信号就由受控器发后出。
但是后面要接收的N个数据则是指向主控器件,所以应答信号应由主控器件发出,当N个数据接收完成之后,主控器件应发出一个非应答信号,告知受控器件数据接收完成,不用再发送。
最后的停止信号同样也是由主控器发出。
读8位数据
unsignedcharRead8Bit(){
unsignedchartemp,rbyte=0;
for(temp=8;temp!
=0;temp--){
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsignedchar)(SDA));
SCL=0;
}
return(rbyte);
}
2.4I2C器件24C02
24C02是一个2K串行CMOSE2PROM,内部含有256个8位字节,该器件通过I2C总线接功能列表。
图1024C02引脚排列
管脚名称
功能
A0﹑A1﹑A2
这三个引脚用于多个器件同时使用时设置区分器件地址,当这些引脚悬空时默
认为0。
在同一总线中最多可同时使用8个24C02器件。
如果总线只有一个24C02器件被寻址,这三个地址可悬或接地。
SDA
双向串行数据/地址管脚,用于器件所有数据的发送或接收,SDA是一个开漏输出管脚。
SCL
串行时钟。
串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚
WP
写保护引脚。
当WP引脚连接到VCC时芯片里面的内容为只读内容而不能进行写操作。
而当WP引脚连接到VSS时芯片里面的内容可进行正常的读/写操作。
VCC
+1.8V~6.0V工作电压
VSS
地
图1124C02引脚功能
图12是DIP封装的24C02与80C51的接口方案。
其中A0、A1、A2是芯片地址线,单片使用时接地;SCL是串行移位时钟端;SDA是串行数据或地址端,CPU通过SDA访问芯片;WP是写保护端,接高电平时芯片只能读。
图1224C02执行写操作时与80C51的接口
第三章I2C总线器件应用设计图
3.1复位电路及时钟电路
复位电路和时钟电路是维持单片机最小系统运行的基本模块。
复位/时钟电路
3.2系统显示电路
第四章仿真分析
由单片机向24C02—A号芯片写入“01234”,然后单片机再从该芯片相应的存储单元中读出刚才写入的信息,然后送LCD1602显示,显示如下图所示:
将24C02—A中读出”01234”信息,反过来送24C02—B存储,然后在LCD1602上显示如下图:
第五章心得与体会
这次我们做的是单片机课程设计,有很多的收获与体会,有关于电力电子方面的,更多的是关于人与人之间关系方面的。
我在自己的努力下,在老师同学们的帮助下,终于把整个课程设计完成了,实现了预定的目标。
在几天几夜的努力,终于有了头绪,然后又在同学的帮助下,找到了一些参考书,又在这写书的帮助下了解了电力电子设计的各种方法,在设计过程中常常出现一些棘手的问题,不过在团队的合作下,我们最终找到了解决的方法。
一个多星期后我们的课程设计终于完成了,虽然还有很多不完善的地方,但我们的基本目标已经实现。
我们回顾了很多以前的东西,也发现了很多的问题,以前都没遇见过的,收获很大,而且我还学会了使用一些新的软件。
看着我们大家做的课程设计,自己就会又欣慰又难过,欣慰的是我们终于把它做出来了,而且,做的还好,难过的是自己知道还有很多的不足,但是,由于认识的有限,无法去完善,才知道“书到用时方恨少”!
此次单片机课程设计让我们对软开关技术游乐更深入的了解,可以把它同实际相结合,同时,又让我们学会了一个新的应用软件。
在整个设计过程中,通过怎样对把实际问题和所学的知识联系起来分析,锻炼了我们对事情的分析能力,通过怎样解决过程中出现的问题,提高了我们查找文献的能力、对网络资源的利用能力和和其他同学的交流沟通能力。
而且,经历这次的课程设计,我们也学会了自学和分工协作。
我们觉得每一次的课程设计,都是让我们对原有的知识从了解表面到深入本质,从个体学习到整体把握的跳跃,对新知识的汲取,更是让我们把课本的知识应用到实际中,让我们了解了我们的学习有什么用,能够解决什么样的问题,增加我们的自信和学习的动力。
总之,通过这次的课程设计,我们收获匪浅。
参考文献
[1]李广弟等单片机基础北京航空航天出版社,2001.7
[2]楼然苗等51系列单片机设计实例北京航空航天出版社,2003.3
[3]唐俊翟等单片机原理与应用冶金工业出版社,2003.9
[4]刘瑞新等单片机原理及应用教程机械工业出版社,2003.7
[5]吴国经等单片机应用技术中国电力出版社,2004.1
[6]李全利,迟荣强编著单片机原理及接口技术高等教育出版社,2004.1
[7]侯媛彬等,凌阳单片机原理及其毕业设计精选2006年,科学出版社
[8]罗亚非,凌阳十六位单片机应用基础2003年北京航空航天大学出版社
[9]北京北阳电子有限公司,061A凌阳单片机及其附带光盘2003年
[10]张毅刚等,MCS-51单片机应用设计,哈工大出版社,2004年第2版
附录
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodedis_code1[]={"24C02_A"};
unsignedcharcodedis_code2[]={"24C02_B"};
bitwrite=0;//写24C02的标志;
sbitsda=P2^4;
sbitscl=P2^3;
sbitlcden=P3^4;//液晶使能端
sbitlcdrs=P3^5;//液晶数据命令选择端
ucharsec,tcnt;
voiddelay()
{;;}
voiddelay1ms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)//i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
voidinitlcd()
{
lcden=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
voidstart()//开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
voidstop()//停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
voidrespons()//应答
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
voidno_ack()
{
sda=1;
scl=1;
delayNOP();
sda=0;
scl=0;
}
voidinitIIC()
{
sda=1;
delay();
scl=1;
delay();
}
voidwrite_byte(uchardate)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
ucharread_byte()
{
uchari,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
returnk;
}
voidwrite_add(ucharadrIC,ucharaddress,uchardate)
{
start();
write_byte(adrIC);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
ucharread_add(ucharadrIC,ucharaddress)
{
uchardate;
start();
write_byte(adrIC);
respons();
write_byte(address);
respons();
start();
write_byte(adrIC|1);
respons();
date=read_byte();
//no_ack();
stop();
returndate;
}
voidwr_string(unsignedcharstr[])
{
unsignedcharnum=0;
for(num=0;num<16;num++)
{
write_data(str[num]);
delay1ms(100);
}
}
voidlcd_display(unsignedcharadd,unsigneddat)
{
}
voidmain()
{
unsignedchari,date,data_b;
unsignedcharj=0;
initIIC();
initlcd();
write_com(0x80);
wr_string(dis_code1);
delay1ms(1000);
for(i=0;i<5;i++)//向1602中连续写入01234;
{
write_add(0xa0,i,i);
delay1ms(5);
}
for(i=0;i<5;i++)//读出A中的值送LCD1602显示
{
date=read_add(0xa0,i);
write_com(0xc0+2+i);
write_data(0x30+date);
}
delay1ms(200);
write_com(0x01);
write_com(0x80);
wr_string(dis_code2);
while
(1);
}
7、答辩记录及评分表
课题名称
I2C总线器件应用设计
答辩教师(职称)
答辩时间
答
辩
记
录
评分表