单片机之间数据传输的软硬件设计
单片机之间数据传输的软硬件设计
徐刚 魏琴
(陆军航空兵学院 信息技术教研室,北京 101123)
【摘要】 在单片机应用中,I2C总线是一种简单、双向的二线制同步串行总线,它只需要两根线——串行数据线和串行时钟线就可以在总线与连接器件之间进行数据传送。本文介绍了它的工作原理和特点,阐述了软件模拟I2C总线的程序设计方法,并以AT24C64为例介绍了它与非I2C总线单片机之间接口的软硬件设计。
【关键词】 双向二线制 ?同步串行总线 I2C总线 ?? AT24C64
The hardware and software design of data transmission between MCU
XuGang WeiQin
(Army Aviation Institute Infirmation Technology ,Beijing 101123, China)
Abstract I2C bus is a simple bi-directional two-line synchronization serial bus.The paper introduces the principle and peculiarity of I2C bus, give out a method about how to simulate I2C bus using C language . The example is based on AT24C64 and AT89C2051.
Keywords bi-directional two-line synchronization serial bus I2C bus AT24C64
1 引言
与并行扩展总线相比,串行扩展总线有突出的优点:电路结构简单,程序编写方便,易于实现用户系统软硬件的模块化、标准化等。 I2C BUS (Inter?Integrated?Circuit?BUS?内部集成电路总线)是由Philips公司推出的二线制同步串行扩展总线,它是具备总线仲裁和高低速设备同步等功能的高性能多主机总线。由于其组成系统结构简单,无需专门的母板和插座,直接用导线连接设备,通信时无需片选信号,且具有这种总线器件的价格比较便宜,因此它们拥有广泛的应用前景。然而在诸多工程领域中广泛应用的MCS51系列、68HC05系列、AT89系列的单片机都不具有这种总线接口,这在很大程度上限制了它们的应用范围。本文在介绍了I2C总线通信标准的基础上,给出了在AT89C2051上利用P1口实现I2C总线的方法,及其软件模拟I2C总线的程序设计。
2 I2C总线概述
I2C总线是一种双线、双向的串行数据总线,具有多端控制能力。双线是指总线由串行数据(SDA)线和串行时钟(SCL)线组成,结构虽然简单却可以在CPU与被控IC之间实现数据双向传输,最高传输率为100千比特/秒,传送的数据必须是8位的,首先从高位开始传送。双向是指SDA与SCL均为双向I/O线,数据可读可写,由于双向I/O线是开漏极输出(输出“1”时,为高阻抗状态),因此I2C总线上的所有设备的SDA、SCL引脚都需要外接上拉电阻。
每次访问I2C器件之前,必须给出开始信号启动I2C数据总线操作,总线启动后状态由“空闲”变为“忙”。每次结束访问时,也必须给出停止信号来停止I2C数据总线操作,停止一段时间后,总线状态由“忙”变为“空闲”。在启动和停止信号之间可以进行数据传送,传送的数据必须是8位的,首先从高位开始传送,SDA线上的高低电平状态反应了传送的数据,每传送1 bit的数据,要在SCL上产生1个时钟,当SCL为低时,可以改变SDA上的数据,在SCL为高时,SDA上的数据必须稳定,否则将被认为是控制信号。若启动总线为读操作,则在SCL脉冲的下降沿读出1 bit的数据,若启动写操作,则在SCL脉冲的上升沿写入1 bit 的数据。I2C总线的协议如表1所示:
表1 I2C总线的协议
3 系统硬件设计
3.1 AT24C64芯片简介
AT24C64系列芯片是ATMEL公司生产的采用I2C总线标准常用的串行EEPROM存储芯片。它具有8K×8Bit的存储容量,每个字节可重复擦/写100万次,数据保存期大于100年。AT24C64具有8K的寻址空间,地址范围为0000H~1FFFH,它工作于从器件方式,页写的时候最多可以写入8字节(当开始写入的从器件片内地址为页首地址时)。也就是说,AT24C64每页有8字节的容量,每次写入数据是从主器件发送来的片内选择地址开始写入,如果写到页末尾,主器件还在继续发送的话,不会自动转到下一页,而是从该页的头地址开始继续写入,覆盖该页的原有数据,而造成数据丢失。
3.2 AT24C64与 AT89C2051硬件接口电路
AT89C2051单片机内部没有I2C总线,将2片AT24C64作为上片和下片接到AT89C2051不同的I/O口,从而可以实现从其中任意一片AT24C64读出数据写到另一片AT24C64中的功能,实现数据通过I2C总线在非I2C总线的单片机上任意传输的功能,电路如图1所示。其中每一片AT24C64芯片的三位地址端A2、A1和A0全部接地(当A2、A1、A0接成不同的8种方式时,表示片选不同的I2C器件)。上片的SDA线连到了P3.5,SCL线连到了P3.4,下片的SDA线连到了P1.2,SCL线连到了P1.1(注意,I2C总线的SDA和SCL都是要求加上拉电阻的,在这里的原理图中却没有加上拉电阻,这是因为AT89C2051的I/O口内部已经自带上拉电阻了。但是,读者请注意,在设计中应用别的单片机时应注意区别对待,看是否需要加上拉电阻。)。P1.0和P3.7分别接了一个按键,其中K1用于控制从上片读向下片写;K2用于控制从下片读向上片写。P1.5 、P1.6和P1.7分别接了一个发光二极管,其中LED1是电源指示灯,LED2指示从下片读向上片写,LED3指示从上片读向下片写。
图1 89C2051与AT24C64接口电路图
4 系统软件设计思想
整个程序采用查询方式读取控制键的状态,以便做出相应的传送过程,如果有命令,使对应的指示灯亮或者灭,并进行相应的数据传送 。程序框图如图2所示。
图2 程序流程图
4.1 C语言模拟I2C总线程序
4.1.1 I2C总线启动函数
bit i_start()
{ SDA=1;
SCL=1; _nop_();
SDA=0;_nop_();
SCL=0; _nop_();
}
4.1.2 I2C总线停止函数
void i_stop()
{
SDA=0; _nop_();
SCL=1; _nop_();
SDA=1; _nop_();
SCL=0; _nop_();
}
4.1.3 I2C总线传送一个字节数据
bit i_send(uchar val) //若返回为高则I2C有故障 已包括了给从器件的ACK clock。
{
uchar data i;
for(i=0;i<8;i++){
SDA=(bit)(val&0x80);
val=val<<1;
i_clock();
} /*等待从件ACK*/
SDA=1;
return(~i_clock());
}
4.1.4 通过I2C总线向特定的地址传送数据
void WriteIIC(uchar addr1,uchar addr2,uchar val)
{ i_start();
i_send(0xa0);
i_send(addr1);
i_send(addr2);
i_send(val);
i_stop();
}
其余的总线应答函数i_clock()、读总线函数以及页写和页读函数与以上的函数类似,限于篇幅这里不再一一赘述。
4.2 主程序清单
main()
{ // 初始化串行口和波特率发生器
while(1){ //主循环部分
if(P1^0==0) { //按键KEY1按下
delay50ms(); //去抖
if(P1^0==0) { //要从上片读向下片写
P1^7=0; P1^5=0; //设置LED1和LED3灯亮
for(addrh=0;addrh<0x20;addrh++) {
for(addrl=0;addrl<=0xf8;addrl+=8){
PageReadIIC(addrh,addrl,buf);
_nop_();
PageWriteIIC_l(addrh,addrl,buf);
delay5ms();
if(addrl==0xf8) break;
}
}
}
if(P3^7==0) { // 按键KEY2按下
delay50ms(); //去抖
if(P3^7==0) { //要从下片读向上片写
P1^7=0; P1^6=0; //设置LED1和LED2灯亮
for(addrh=0;addrh<0x20;addrh++) {
for(addrl=0;addrl<=0xf8;addrl+=8) {
PageReadIIC_l(addrh,addrl,buf);
_nop_();
PageWriteIIC(addrh,addrl,buf);
delay5ms();
if(addrl==0xf8) break;
}
}
}
}
}
5 结束语
在单片机应用中,I2C总线电路结构简单,通信时只需要2根线且无需片选信号线,可以占用较少的单片机接口资源,另外,具有这种总线的器件的价格比较便宜,因而得到了更广泛的应用。但目前应用很广的MCS51系列、68HC05系列、AT89系列的单片机都不具有这种总线的接口,很大程度上限制了它们的应用范围。本文介绍了软件模拟I2C总线的程序并给出了在AT89C2051上利用P1口实现I2C总线的方法,很好地解决了这一实际限制问题,在移动通信的系统设计中应用效果良好,具有较高的实际应用价值。
6 参考文献
[1] 尤一鸣等著 单片机总线扩展技术 1993.11(第1版) 北京航空航天大学出版社
[2]何立民 I2C总线应用系统设计 1995.2 (第1版) 北京航空航天大学出版社
[3] 卢有杰 等著 C语言高级程序设计 清华大学出版社
[4][美]Mark Nelson著 串行通信开发指南 中国水利水电出版社
作者简介:
徐刚,男,1974年生,研究生,主要从事单片机开发研究和电子实验室建设。
单片机之间数据传输的软硬件设计.doc