单片机基础与应用(C语言版)8.2 单片机扩展I2C总线器件 课件(共18张PPT)

资源下载
  1. 二一教育资源

单片机基础与应用(C语言版)8.2 单片机扩展I2C总线器件 课件(共18张PPT)

资源简介

(共18张PPT)
8.2 单片机扩展I2C总线器件
《单片机基础与应用(C语言版)》
高等教育出版社
8.2.1 I2C总线系统结构
I2C总线系统结构(由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定通信协议向从机寻址和信息传输)
8.2.2 I2C总线数据传输时序
数据位的有效性规定
I2C总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化
起始信号和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号
数据传输格式
1)字节传输与应答
每一个字节必须保证是8位长度。传输数据时,先传输最高位(MSB),每一个被传输的字节后面都必须跟随一位应答位(即一帧共有9位)
数据传输格式
2)数据帧率格式
I2C总线上传输的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传输一个从机的地址(7位),第8位是数据的传输方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传输总是由主机产生的终止信号结束。但是,如果主机希望继续占用总线进行新的数据传输,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传输过程中,可以有以下3种组合方式,如图所示。
数据传输组合方式(有阴影部分表示数据由主机向从机传输,无阴影部分则表示数据由从机向主机传输。A表示应答, 表示非应答高电平。S表示起始信号,P表示终止信号。)
总线的寻址
I2C总线有明确规定:采用7bits寻址字节(寻址字节是起始信号后的第1个字节)
D7~D1位组成从机的地址。D0位是数据传输方向位,为0时表示主机向从机写数据,为1时表示主机由从机读数据。
8.2.3 I2C串行总线接口编程控制
I2C接口中,假设I2C总线SDA连接在单片机的P2.0引脚脚,SCL连接在P2.1引脚,且单片机内部没有集成I2C串行总线模块,所以,需要采用单片机来模拟I2C串行总线的数据传输时序。根据以上设定,程序中首先进行如下预定义。
#include //包含头文件REGX51.H,定义了51单片机的所有SFR
#include
sbit SDA=P2^0; //定义P2.0引脚位名称为SDA
sbit SCL=P2^1; //定义P2.1引脚位名称为SCL
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
1. I2C总线初始化
I2C总线在使用前需要出初始化,将总线都拉高以释放总线,模拟总线初始化时序函数如下。
//函数名: iic_init
//函数功能: I2C总线初始化
//形式参数:无
//返回值:无
void iic_init()
{
SDA = 1;
delayNOP();
SCL = 1;
delayNOP();
}
2.开始信号
//函数名: iic_start
//函数功能: 启动I2C总线,即发送I2C起始条件
//形式参数:无
//返回值:无
void iic_start()
{
EA=0; //关中断
SDA = 1; //时钟保持高,数据线从高到低一次跳变,I2C通信开始
SCL = 1;
delayNOP(); // 起始条件建立时间大于4.7μs,延时
SDA = 0;
delayNOP(); //起始条件锁定时间大于4μs
SCL = 0; //钳住I2C总线,准备发送或接收数据
}
3.结束信号
//函数名: iic_stop
//函数功能: 停止I2C总线数据传输
//形式参数:无
//返回值:无
void iic_stop()
{
SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
SCL = 1;
delayNOP();
SDA = 1;
delayNOP();
SCL = 0;
}
4.应答信号
I2C总线应答信号时序
4.应答信号
//函数名: slave_ACK
//函数功能: 从机发送应答位
//形式参数:无
//返回值:无
void slave_ACK()
{
SDA = 0;
SCL = 1;
delayNOP();
SDA = 1;
SCL = 0;
}
//函数名: slave_NOACK
//函数功能: 从机发送非应答位,迫使数据传输过程结束
//形式参数:无
//返回值:无
void slave_NOACK()
{
SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
SCL = 0;
}
从机应答信号实现函数如下。
主机检测应答信号函数如下。
//函数名: check_ACK
//函数功能: 主机应答位检查,迫使数据传输过程结束
//形式参数:无
//返回值:无
void check_ACK()
{
SDA = 1; // 将IO设置成输入,必须先向端口写1
SCL = 1;
F0 = 0;
if(SDA == 1) // 如果SDA=1表明非应答,置1非应答标志F0
F0 = 1;
SCL = 0;
}
5.发送和接收一个字节
//函数名: IICSendByte
//函数功能: 发送一个字节
//形式参数: 要发送的数据
//返回值:无
void IICSendByte(unsigned char ch)
{
unsigned char idata n=8;// 向SDA上发送一数据字节,共8位
while(n--)
{
if((ch&0x80) == 0x80)//如果要发送的数据最高位为1则发送位1
{
SDA = 1; // 传输位1
SCL = 1;
delayNOP();
SDA = 0;
SCL = 0;
}
else
{
SDA = 0; // 否则传输位0
SCL = 1;
delayNOP();
SCL = 0;
}
ch = ch<<1; // 数据左移一位
}
}
//函数名:IICreceiveByte
//函数功能:接收一字节数据
//形式参数:无
//返回值:返回接收的数据
unsigned char IICreceiveByte()
{
unsigned char idata n=8;//从SDA线上读取一数据字节,共8位
unsigned char tdata;
while(n--)
{
SDA = 1;
SCL = 1;
tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
if(SDA == 1)
tdata = tdata|0x01; // 如果接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SCL=0;
}
return(tdata);
}
感谢您的观看
Thanks for your attention.

展开更多......

收起↑

资源预览