12 串行总线扩展技术
...
I 2C 器件n
3
(一) I2C总线的信号线
(二) I2C总线的驱动能力
I2C为开漏或开集电极输出,需加上拉电阻Rp ,输出 能实现线“与”的逻辑功能。 时钟线SCL和数据线SDA都是双向传输线,总线备用 时SDA和SCL都保持高电平,只有关闭I2C总线时才使 SCL钳位在低电平。 在标准模式下数据传送速率100kbit/s。总线的驱动 能力受总线电容限制,不加驱动扩展时驱动能力为 400pF。
/*1-启动I2C总线*/ /*2-停止I2C总线数据传送*/ /*3-发送应答位*/ /*4-发送非应答位*/
12
extern void cack( ); /*5-应答位检查*/ extern void wrbyt(uchar shu); /*6-发送一个字节*/ extern void wrbyt0( ); extern void wrbyt1( ); extern uchar rdbyt( ); /*7-读取一个字节*/ extern void wrnbyt(uchar slaw,uchar number,uchar ff[]); /*8-发送n 个字节*/ extern void rdnbyt(uchar number,uchar slar,uchar qq[]); /*9-接收n 个字节*/
地址(4位),数字引脚地址(3位),读/写地 址(1位)。 以8574为例:SLAW=0X40;SLAR=0X41。
芯片类型地址 0 1 0 0 数字引脚地址 0 0 0 读/写 0(写),1(读)
(五) I2C总线的数据传送与时序 主从机之间的一次数据传送由启动信号、若干数 据字节和应答位、停止信号组成。 1)一位数据的传输 SCL的一个周期对应一位数据传送,低电平时允 许数据线上的电平变化,高电平期间数据线上的 电平稳定。(启动停止除外)
5
种类
型号
器件地址及 寻址字节
备注
256×8静态RAM
256B E2PROM 512B E2PROM 1024B E2PROM 2048B E2PROM 8位I/O口 4位LED驱动控制器 160段LCD驱动控制器 4路A/D、1路D04 AT24C08 AT24C16 PCF8574 PCF8574A SAA1064 PCF8576 PCF8591 PCF8583
16
/********4-发送非应答位*******************/ void mnack( ) { SDA=1; SCL=1; _nop_( ); _nop_( ); SCL=0; SDA=0; }
17
/*************5-应答位检查********************/ void cack( ) { SDA=1; SCL=1; F0=0; if(SDA==0) {SCL=0; _nop_( );_nop_( ); } else {F0=1; SCL=0; _nop_( );_nop_( );} }
2
I2C
BUS(Inter IC BUS)是Philips推出的芯片间串 行传输总线,以两根线实现了完善的同步数据传 送,不需要片选线,可以方便地构成多机系统和 外围器件扩展系统。
+5 V
RP
P1.7 P1.6
RP
SDA SCL
具有I2C总线 的单片机
I2 C 器件1
I 2C 器件2
...
I 2C 器件i
26
for(l=0;l<number;l++) { data0=rdbyt( ); qq[l]=data0; if(l<(number-1)) mack(); } mnack( ); stop( );
三位数字引脚地址A2A1A0
三位数字引脚地址A2A1A0 二位数字引脚地址A2A1 一位数字引脚地址A2 无引脚地址,A2A1 A0悬空 三位数字引脚地址A2A1A0 三位数字引脚地址A2A1A0 二位模拟引脚地址A1A0 一位数字引脚地址A0 三位数字引脚地址A2A1A0 一位数字引脚地址A0
6
I2C接口器件的寻址字节由3部分组成,芯片类型
S SLAW/R A Data1
Data1 A
A …
…
Datan
Datan
A/ A A/ A
Sr
P
SLAR/W
A
6)模拟I2C的程序设计 可以软件模拟I2C协议,完成主控器件功能。 选用P1.6、P1.7作为时钟线SCL和数据线SDA,晶振 采用6MHz。 包括启动(STA)、停止(STOP)、发送应答位 (MACK)、发送非应答位(MNACK)、应答位检 查(CACK)、发送一个字节数据(WRBYT)、接收 一个字节数据(RDBYT)、发送n个字节数据 (WRNBYT)、接收n个字节数据(RDNBYT)九个 子程序。
4.1 串行总线扩展技术
4.2 人机通道接口技术 4.3 A/D转换器的选取和使用
4.4 D/A转换器的选取和使用
串行扩展:模块化、标准化、省去大量连线、提高 可靠性、降低成本 ——大趋势,大方向 几种总线:
◦ ◦ ◦ ◦ ◦ 1. 2. 3. 4. 5. UART方式 I2C总线 单总线( 1-wire ) 串行外设接口(SPI) Microwire串行扩展接口
9
S:起始信号; Sr:重复起始信号; P:停止信号; A:应答信号; A :非应答信号; SLAW:写寻址字节; SLAR:读寻址字节; Datal~Datan:被写入/读出的n个数据字节。 读操作:
S SLAR A Data1 A Data2 A … Datan-1 A Datan
A
P
10
读写操作:(注:未注明数据方向)
11
C51中,软件包分为两个文件:IIC.H和IIC.C。应用时, 两个文件加入同一工程,统一编译、连接。 WRNBYT子程序针对的是肯定应答。
IIC.H: sbit SDA=P1^7; sbit SCL=P1^6; #define uchar unsigned char #define uint unsigned int extern void sta( ); extern void stop( ); extern void mack( ); extern void mnack( );
14
/*******2-停止I2C总线数据传送**********/ void stop( ) { SDA=0; SCL=1; while(SCL==0){;} SDA _nop_( ); SDA=1; SCL _nop_( ); _nop_( ); 终止信号 SCL=0; }
15
/*********3-发送应答位********************/ void mack( ) { SDA=0; SCL=1; _nop_( ); _nop_( ); SCL=0; SDA=1; }
1010A2A1A0R/W
1010 A2A1A0R/W 1010 A2A1P0R/W 1010 A2P1P0R/W 1010 P2P1P0R/W 0100 A2A1A0R/W 0111 A2A1A0R/W 0111 0 A1A0R/W 0111 00 A0R/W 1001 A2A1A0R/W 1010 00 A0R/W
19
/********6-发送一个数据字节**************/ void wrbyt(uchar shu) { void wrbyt0( ); void wrbyt1( ); uchar i; if((shu&0x80)>0) { SDA=1;} else { SDA=0;} SCL=1; while(SCL==0){;} _nop_( );
4
(三) I2C总线的工作方式 I2C总线上支持多主和主从两种工作方式。在多主方 式中,通过硬件和软件的仲裁,主控制器取得总线 控制权。而在多数情况下,系统中只有一个主器件, 只需要了解主从工作方式。 很多CPU芯片都具有I2C总线主接口,能够按照状态 码自动进行总线管理,用户只要在程序中装入这些 标准处理模块对总线操作即可。 (四)I2C总线上的器件地址 在主从方式中,从器件的地址包括器件编号地址和 引脚地址,器件地址由I2C总线委员会分配,引脚地 址决定于引脚外接电平的高低。
7
2)总线数据传送的启动与停止 启动信号与停止信号都由主控制器产生。 启动信号:在时钟线保持高电平期间,数据线出现 由高电平向低电平变化时启动I2C总线 停止信号:在时钟线保持高电平期间,数据线上出 现由低到高的电平变化时将停止I2C总线 3)数据字节和应答 每次传送的字节数没有限制,每个字节传送高位在 先,后必跟一个应答位或非应答位 ,数据传送和应 答位的时钟脉冲均由主机产生。发送应答位时,发 送端在应答时钟脉冲高电平期间释放SDA(高), 转由接收器控制,发出应答位或非应答位。
24
for(k=0;k<number;k++) { wrbyt(ff[k]); cack( ); if(F0==1) break; } if(F0==0) break; } stop( );
}
25
/**********9-接收n个字节数据****************/ void rdnbyt(number,slar,qq) uchar number,slar,qq[]; { uchar idata data0,l; do{ sta( ); wrbyt(slar); cack( ); }while(F0==1);
13
IIC.C: #include <intrins.h> #include <reg51.h> #include <iic.h> /***********1-启动I2C总线*****************/ void sta( ) { SDA=1; SCL=1; SDA while(SCL==0){;} _nop_( ); SDA=0; SCL _nop_( ); _nop_( ); 起始信号 SCL=0; }