基于51的IIC通讯原理及协议详解(I2C)

发布者:Qingliu2022最新更新时间:2019-12-04 来源: 51hei关键字:IIC通讯  协议  I2C 手机看文章 扫描二维码
随时随地手机看文章

IIC 的一些特征:
两条总线:串行数据总线(SDA)和串行时钟总线(SCL)
真正的多主机总线
连接到相同总线的ic数量只受到总线的最大电容400pF限制。
串行8位双向数据在标准模式下可达100K bit/s
快速模式400K bit/s,高速模式下3.4Mbit/s.

数据有效性规定:
IIC总线在进行数据传输时,SCL在高电平区间,SDA上的电平必须保持稳定
SDA的数据的高或者低电平状态只有在SCL线的时钟信号是低电平时才能改变。

起始和停止条件:
起始:SCL高电平时,SDA由高电平向低电平切换。
停止:SCL高电平时,SDA由低电平向高电平切换。

模拟时序如下:
起始与终止:

应答与非应答:

总线上进行一次数据传输的通信格式:


相关模拟时序的驱动函数:包括(start,stop,respons,write_byte,read_byte)
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL高电平区间,SDA一个下降沿启动信号
void Start()
{
    SDA=1;
   delay();
    SCL=1;
   delay();
    SDA=0;
   delay();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL在高电平区间,SDA一个上升沿停止信号
void Stop()
{
    SDA=0;
   delay();
    SCL=1;
   delay();
    SDA=1;
   delay();
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//SCL在高电平区间,SDA被从设备拉低表示应答,
//(SDA==1)&&(i<255)表示如果一段时间未收到从期间
//的应答则默认从期间已经收到而不再等待应答信号
void Respons()
{
    uchari=0;
    SCL=1;
   delay();
   while((SDA==1)&&(i<255))
       i++;
    SCL=0;
   delay();   
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//CY 为PSW寄存器中的CY位
//先移位,然互使用SCL控制发出去
void Write_Byte(uchar date)
{
    uchari,temp;
   temp=tada;
   for(i=0;i<8;i++)
    {
      temp=temp<<1;
       SCL=0;
      delay();
      SDA=CY;
      delay();
       SCL=1;
      delay();
    }
    SCL=0;
   delay();
    SDA=1;
   delay();
}

-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//定义临时变量K,K左移一位后与SDA进行或运算,
//依次把8个独立地位放入一个字节中来接受完成
void Read_Byte()
{
    uchari,k;
    SCL=0;
   delay();
    SDA=1;
   for(i=0;i<8;i++)
    {
       SCL=1;
      delay();
      k=(k<<1)|SDA;
       SCL=0;
      delay();
    }
   delay();
    returnk;
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
底层驱动完成以后,我们需要对实际的芯片使用通讯协议来进行操作。
目前大多的情况下一般比较受欢迎的是AT24cxx 系列。
AT24Cxx系列主要有:    以下系列:

以下仅以AT24C02为例来进行说明:
AT24C02芯片地址为:1010,其控制字格式如下:

其中A2,A1,A0为可编程选择地址,此处A2,A1,A0均接地,即000,
因此发送写信号的寻址字节为:10100000,即0XA0,
因此发送读信号的寻址字节为:10100001,即0XA1,

下图为写一个字节的数据格式,有图可知道:向AT24C02中写入一个字节的时候,需要:
先发一个起始信号,再发一个字节的控制字,
在发送一个字节的控制字地址,都得到应答信号后,
再发送要存入的数据,最后发一个停止信号!
So,一个字节的数据已经写入AT24C02中,OK!下面是数据格式,如图:

程序如下:
-----------------------------------------------------------------------------------------------------------------------
//任意地址,写入数据
void Write_Add(uchar address,uchar date)
{
   Start();

   Write_Byte(0xA0);
   Respons();
   Write_Byte(address);
   Respons();
   Write_Byte(date);
   Respons();

    Stop
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
下图为读一个字节的数据格式,其读取一个字节的数据和写入时候差不多,此处不再累赘,读一字节数据格式如图:

程序如下:
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//任意地址,读出数据
void Read_Add(uchar address)
{
    uchardate;

   Start();
   Write_Byte(0XA0);
   Respons();
   Write_Byte(address);
   Respons();

   Start();
   Write_Byte(0XA1);
   Respons();
   date=Read_Byte();
   Stop();

    returnbyte;      
}
-----------------------------------------------------------------------------------------------------------------------

关键字:IIC通讯  协议  I2C 引用地址:基于51的IIC通讯原理及协议详解(I2C)

上一篇:基于89c52的简易计算器设计
下一篇:基于NRF24L01的DS18B20温度无线传输单片机源码

推荐阅读最新更新时间:2024-10-30 19:58

基于AT89C2051单片机制作的厨房定时器
该制作以5分钟为一个计时单位,最多计时1小时,3V电池做电源,有蜂鸣器报警,工作时功耗为6mA左右(使用AT89C2051),可以使用3V钮扣电池,具有自动关机功能,不运行时耗电量可以忽略不计,单键操作,简单方便。   电路图   VT1为PNP的9012,当电路不工作时VT1的B极由R4得到高电平,VT1截止,AT89C2051无法从VT1的E极得到电源。当SW1按下时,VT1的B极通过VD2和SB1接地,由高电平转为低电平,VT1导通。此时AT89C2051得电,同时通过C1,R4复位。复位成功后P3.7升为高电平,使得VT2导通,从而使VT1的B极保持低电平状态,这时就算松开SB1,VT1也不会截止而导致MCU失
[单片机]
基于AT89C20<font color='red'>51</font>单片机制作的厨房定时器
51单片机之232串口实现
任务要求 Fosc为6MHz,定时器T1为工作模式2,串口工作模式1,波特率为4800。 1、通过波特率计算定时器T1时间常数初值。 2、编写甲机发送程序,工作于查询或者中断方式,传送30H——3FH中的十六个字节。 3、编写乙机接收程序,接受十六字节数据放在40H——4FH中。 发送机(甲机) /***************************************************** *任务要求 *Fosc为6MHz,定时器T1为工作模式2,串口工作模式1,波特率为4800。 *1、通过波特率计算定时器T1时间常数初值。 *2、编写甲机发送程序,工作于查询或者中断方式,传送30H——3FH中的十六个字节。
[单片机]
MLD协议测试—网络测试仪实操
一、简介 1.MLD简介 MLD · Multicast Listener Discovery Protocol · 组播侦听者发现协议 功能 · 在终端主机和与其直接相邻的组播路由器之间建立/维护组播组成员关系 标准 · RFC2710: MLD, 1999.10 · RFC3810: MLDv2, 2004.06 其定义是:组播侦听者发现协议MLD(Multicast Listener Discovery)是负责IPv6组播成员管理的协议,用来在IPv6成员主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。MLD通过在成员主机和组播路由器之间交互MLD报文实现组成员管理功能,MLD报文封装在IPv6报文中。 在功能上
[测试测量]
现场总线CANopen学习总结笔记二---物理层和CAN协议
第二章,  物理层 主要有位定时和位填充、高速收发器、网络拓扑结构、连接器。 CANopen  的物理层相当于CAN控制器中采用的子层PLS(物理信号)、MAU(介质访问单元)和MDI(介质专用接口),这些子层均位于驱动模块中并通过连接器和电缆实现。 位定时  其实就是针对各种不同的数据传输速率设定的采样点。分为4个部分:同步段、传播段、相位段1和相位段2。而位定时的采样点恰好介于相位段1和2之间。 位填充可以表示为5个相同极性的位后面插入一个不同极性的填充位,而根据第3章里报文格式中得知,位填充只适合对帧起始SOF  到CRC场之间的范围内的数据进行处理。填充位可以由接收CAN控制器自动去除填充,因此CAN报文物理层上
[嵌入式]
I2C总线协议学习笔记
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。 1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲) 数据改变:SCL为低电平时,SDA线才能改变传输的bit 1
[嵌入式]
MCS-51 指令系统中所用符号说明——单片机原理学习笔记 4
涉及操作数的指令 Rn:工作寄存器,R0~R7中的一个。(定位在RAM空间上) #data:8位立即数,实际使用时data是00H~FFH中的一个。 direct:8位直接地址,实际使用时direct是00H~FFH中的一个,也可以是特殊寄存器SFR中的一个。(定位在片内RAM的00H~FFH中) @Ri:表示寄存器间接寻址,Ri中存放的是真实操作数的地址,并非操作数。Ri只能是R0和R1。(定位在PSW中的R0、R1) #data16:16位立即数。 @DPTR:表示以DPTR为数据指针的间接寻址,存放16位寄存器的地址,用于对片外64K RAM/ROM寻址。 bit:位地址,可以是00H~FFH中的
[单片机]
数字有线电视(DVB-C)机顶盒单芯片QAMi5516
  1 概述   QAMi5516是STMicro(意法半导体)公司最新推出的一款专门针对中低端市场的高性价比数字有线电视(DVB-C)机顶盒单芯片,同时也是ST推出的第一个将前端QAM(正交幅度调制)数字有线信号解调器与后端MPEG视频解码集成在一起的芯片,因而能够很好的使模拟电视用户收看数字有线电视节目。   除了传统的音频、视频解码功能以外,QA-Mi5516还具有很强的扩展能力、增强型图形处理功能和提高音视频质量的后处理功能。同时,由于将QAM解调器和MPEG解码器集成在了一起,因而降低了硬件芯片组的成本,简化了电路设计,提高了产品的可靠性和性价比,也有助于降低生产成本,这对有着近一亿个有线电视家庭用户的中国机顶盒
[单片机]
Keil C51中对双数据指针的支持情况分析
在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。 1 Keil C51对双数据指针的支持情况 作
[单片机]
Keil C<font color='red'>51</font>中对双数据指针的支持情况分析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved