打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
解析I2C通信协议

一、I2C的概念

1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL


2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。


每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。

二、常用的串行扩展总线

  I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。

三、I2C的六个信号

1. 起始信号

定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。


void iic_start(void){ SDA = 1; SCL = 1; delay_us(1); SDA = 0; delay_us(1); SCL = 0;}
2. 终止信号
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。


void iic_stop(void){    SDA = 0;    SCL = 1;    delay_us(1);    SDA = 1;    delay_us(1);    SCL = 0;}
3. 写数据信号

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。


bit iic_send_byte(unsigned char byte){ unsigned char i; for(i = 0; i < 8; i++) { SDA = byte & 0x80; SCL = 1; delay_us(1); SCL = 0; byte <<= 1; } SCL = 1; SDA = 1; delay_us(1); if(0 == SDA) { ack = 1; } else { ack = 0; } SCL = 0; return ack;}
4. 读数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。


unsigned char iic_rcv_byte(void){    unsigned char i;    unsigned char temp = 0;    unsigned char a;        SDA = 1;    for(i = 0; i < 8; i++)    {        SCL = 0;        delay_us(1);        SCL = 1;        if(SDA)        {            a = 0x01;        }        else        {            a = 0;        }                temp |= (a << (7 - i));        delay_us(1);    }        SCL = 0;        return temp;}
5. 应答信号
I2C总线协议规定,每传送一个字节数据,都要有一个应答信号以确定数据传送是否被对方接收。应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉低为低电平,表示数据传输正确。


void iic_ack(void){ SDA = 0; SCL = 1; delay_us(1); SCL = 0;}
6. 非应答信号

void iic_noack(void){    SDA = 1;    SCL = 1;    delay_us(1);    SCL = 0;}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
IIC总线
在PC上用并行口模拟I2C总线的C源代码实例
用89C2051组装个收音机
I2C总线(主)C51源程序
I2C 串行总线的组成及工作原理
51入门系列教程| 协议协议(IIC篇)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服