历史上的今天
今天是:2025年07月14日(星期一)
2018年07月14日 | 单片机:IIC总线通信
2018-07-14 来源:eefocus
一、IIC总线通信
1、简介:
IIC 即Inter-Integrated Circuit(集成电路总线),I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
2、常用的串行扩展总线有:
(1)、I2C (Inter IC BUS)总线
(2)、单总线(1-WIRE BUS)
(3)、SPI(Serial Peripheral Interface)总线等。
3、IIC总线电路接法
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。
4、IIC总线通信协议
(1)起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
(2)应答和非应答
IIC 总线协议规定,每传送一个字节数据后,都要有一个应答信号以确定数据传送是否被对方收到。应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答。
(3)数据传送
数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
5、IIC通信基本函数
(1)起止信号
i2c_Start()
{
SDA = 1; //SCL为高电平时,SDA 出现一个下跳沿表示I2C总线启动
SCL = 1;
i2c_Delay();
SDA = 0;
i2c_Delay();
SCL = 0; // 启动后将SCL点平拉低
i2c_Delay();
}
(2)终止信号
void i2c_Stop()
{
SDA = 0; //当SC高电平时,SDA出现一个上升沿表示I2C总线停止
SCL = 1;
i2c_Delay();
SDA = 1;
i2c_Delay();
}
(3)发送数据
void i2c_SendByte(unsigned char Byte)
{
unsigned char i = 0;
for (i = 0; i < 8; i++)
{
if(Byte & 0x80) //IIC规定下发送高位数据
{
SDA = 1;
}
else
SDA = 0;
SCL = 1; //在SCL为高电平期间写入数据
i2c_Delay();
SCL = 0;
Byte <<= 1;
if (i == 7)
SDA = 1; //在发送完数据后将SDA拉高
i2c_Delay();
}
}
(4)接收数据
unsigned char i2c_ReadByte()
{
unsigned char i = 0;
unsigned char value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1; //先读取高位
SCL = 1; //SCL 为高电平时读取数据
i2c_Delay();
if(SDA)
{
value++;
}
SCL = 0;
i2c_Delay();
}
return value;
}
(5)发送应答信号
void char i2c_Ack()
{
SDA = 0; //SCL为高电平时间SDA拉低表示应答
i2c_Delay();
SCL = 1;
i2c_Delay();
SCL = 0;
i2c_Delay();
SDA = 1;
i2c_Delay();
}
(6)发送非应答信号
void i2c_NAck()
{
SDA = 1; //SCL高电平期间SDA拉高表示非应答
i2c_Delay();
SCL = 1;
i2c_Delay();
SCL = 0;
i2c_Delay();
}
(7)等待应答
unsigned char i2c_WaitAck()
{
unsigned char ret;
SDA = 1;
i2c_Delay();
SCL = 1; //把SCL拉高读取SDA的点平高低,低电平表示应答
i2c_Delay();
if(SDA == 1)
{
ret = 1;
}
else
ret = 0;
SCL = 0;
i2c_Delay();
return ret;
}
(8)检查IIC设备总线
unsigned char i2c_CheckDevice(unsigned char _Address)
{
unsigned char UcAck;
if (SDA == 1 && SCL == 1)
{
i2c_Start();
i2c_SendByte(_Address|I2C_WR); //发送地址
ucAck = i2c_WaitAck(); //等待接收应答
i2c_Stop(); //停止信号
return ucAck;
}
return 1;
}
上一篇:单片机:矩阵键盘和LCD1602
史海拾趣
|
三维测量技术开发商美国Tyzx日前宣布,接受了来自车用预防冲撞传感器开发商高田的技术开发投资。该投资打算用于将Tyzx拥有的距离测量技术推向汽车领域,应用于汽车与障碍物间的距离检测用途。不过目前尚未公布投资额。 &nbs ...… 查看全部问答> |
|
毕业设计(怎样利用MCS51单片机和PTR8000实现无线传输和发送) 为了共同的毕业设计目的(怎样利用MCS51单片机和PTR8000实现无线传输和发送) 有空我们可以互相交流下 QQ:515979200… 查看全部问答> |
|
replyreload += \',\' + 382176; 采购LED灯带的时候,不要只是关注价格。教你从以下几个方面去综合考核,以便买到性价比最好的LED灯带。Timson,如果您要查看本帖隐藏内容请回复… 查看全部问答> |
|
我使用STC的单片机在使用INT0脚(P3^2)时读取高低电平时,发现比其它P0、P1、P2脚的响应的速度都慢。我试过用P2^5脚位能够完整读取高低电平的波形,但采用INT0口读取时出现波形丢失现象,采用中断读取时也是一样。 我的程序是首先启用T1计数器累加 ...… 查看全部问答> |
|
求助:wince socket 蓝牙编程中怎样用OBEX协议封装数据 我是刚接触蓝牙开发的,最近要做一个蓝牙文件传输的应用,就是实现蓝牙设备之间的文件传输, MSDN上研究过SOCKET实现的API函数,但是不知道连接成功后发送的数据怎样才能让对方识别, 网上有人说\"这些数据必须是经过OBEX协议封装好的数据\" 请做过这 ...… 查看全部问答> |
|
修改JOYSTICKMOUSE发送数据,前4字节正确后4错误 各位大大,我想问一下,我想修改JOYSTICK MOUSE程序,源程序是一次发送4字节,我想改为发送8字节,可是改完后抓包发现发送的前4个字节是正确的,后四个自己却是错误的,请问为什么? 修改的地方:SetEPTxCount(ENDP1, 8); UserToPMABufferC ...… 查看全部问答> |




