第09章串行总线技术-01祥解.ppt
文本预览下载声明
* * 谢谢大家! * * * * 控制寄存器S1CON:ENS1—串行总线接口SIO1使能位。 STA—启动起始标志。STO—停止标志。SI—SIO1串行中断标志。AA—接收应答响应标志位。CR2、CR1、CR0—确定主控操作模式下串行时钟速率。 状态寄存器S1SAT:S1STA是一个只读寄存器,高5位有效,存放了26个I2C总线的状态码,其中在主发送方式下,可产生7个总线状态码;在主接收方式下,可产生5个总线状态码;在从接收方式下,可产生9个总线状态码;在从发送方式下,可产生5个总线状态码。SIO1的中断入口地址为002BH,中断服务程序根据这些状态码进行相应的处理。 0DAH 0D8H 0DBH D7 D6 D5 D4 D3 D2 D1 D0 S1ADR × × × × × × × GC S1DAT D7 D6 D5 D4 D3 D2 D1 D0 S1CON CR2 ENS1 STA STO SI AA CR1 CR0 S1SAT SD4 SD3 SD2 SD1 SD0 0 0 0 0D9H * * #include REG552.h / * P89C668的硬件I2C定义与8XC552的一样 */ #define uchar unsigned char /* 申请占用总线,进行I2C时钟速率、使能、发送起始信号等初始化*/ void GetBus() { S1CON=0xc5; /* 设置时钟为100k, MCU主频为12M, ENS1和AA置位 */ STA=1; /* 申请成为主机,起动总线 */ while(SI==0); /* 等待起始位的发送 */ } /* 发送数据函数,用于向总线发送数据 */ void SendByte(uchar c) { S1DAT=c; S1CON=0xc5; /* 清除SI位等 */ while(SI==0); /* 等待数据发送完成 */ } 2. P89C66x单片机I2C通信主方式C51语言程序 * * /* 向无子地址器件发送字节数据函数,从器件地址sla(最低位为0),待发送的数据为c;如果返回1,表示操作成功,否则操作有误 */ bit ISendByte(uchar sla,uchar c) { GetBus(); /* 启动总线 */ SendByte(sla); /* 发送器件地址,若无应答则返回 */ if (S1STA!=0x18) {S1CON=0xd5; return(0);} SendByte(c); /* 发送数据 */ if (S1STA!=0x28) {S1CON=0xd5; return(0);} S1CON=0xd5; /* 结束总线 */ return(1); } * * /* 向无子地址器件读字节数据函数,从器件地址sla(最低位为0),返回字节值在c;如果返回1,表示操作成功,否则操作有误 */ bit IRcvByte(uchar sla,uchar*c) { GetBus(); / * 启动总线 */ SendByte(sla+1); /* 发送器件地址 */ if (S1STA!=0x40) {S1CON=0xd5; return(0);} S1CON=0xc1; /* 接收一字节数据即发送非应答位 */ while(SI==0); /* 等待接收数据 */ if (S1STA!=0x58) {S1CON=0xd5; return(0);} *c=S1DAT; /* 读取数据 */ S1CON=0xd5; /* 结束总线 */ return(1); } * * 9.4.3 I2C接口DAC转换器MAX517的应用 8位电压输出型数模转换器DAC,它带有总线接口,采用单5V电源工作。 AT89S51本身不含I2C接口,将其作为主机使用时,可采用普通I/O口线模拟I2C总线条件,发送/接收数据。 * * 2. MAX517的工作时序 控制字节: R2、R1、R0是保留位,已预先设定为0;RST为复位位,该位为1时复位DAC器件的所有寄存器;PD为电源工作状态位,为1时,MAX517工作在4μA的休眠模式,为0时,返回正常的操作状态;A0为MAX518/519的通道地址位,对于MAX517,该位应设置为0。 D7 D6 D5 D4 D3 D2 D1 D0 地址字节 0 1 0 1 1 AD1 AD0 0 控制字节 R2 R1 R0 RST PD × × A0 地址字节中前4位是类型识别符,后3位则由器件地址输入端的状态来决定。MAX517出厂时已设定前5位为01011。地址字节的最后一位为读写控制,“0”时
显示全部