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

2019-12-04来源: 51hei关键字:51  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;      
}
-----------------------------------------------------------------------------------------------------------------------

关键字:51  IIC通讯  协议  I2C 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481942.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机与PIC单片机和AVR单片机的性能对比分析
八位单片机由于内部构造简单,体积小,成本低廉,在一些较简单的控制器中应用很广。即便到了本世纪,在单片机应用中,仍占有相当的份额。由于八位单片机种类繁多,本文仅将常用的几种在性能上作一个简单的比较,供读者在使用时作参考。1. 51系列应用最广泛的八位单片机首推Intel的51系列,由于产品硬件结构合理,指令系统规范,加之生产历史“悠久”,有先入为主的优势。世界有许多著名的芯片公司都购买了51芯片的核心专利技术,并在其基础上进行性能上的扩充,使得芯片得到进一步的完善,形成了一个庞大的体系,直到现在仍在不断翻新,把单片机世界炒得沸沸扬扬。有人推测,51芯片可能最终形成事实上的标准MCU芯片。51系列优点之一是它从内部的硬件到软件有一套
发表于 2019-12-02
51单片机与PIC单片机和AVR单片机的性能对比分析
基于51单片机的nrf24l01无线的接收和发射程序
通过灯的闪烁来判断数据的接受和发射有接收端和发射段的程序    如果24L01用reg51那么两个设备都要用reg51,如果用reg52就都得用reg52!    PC通过串口发送给单片机命令[相当于协调器],单片机把命令通过24L01无线发送给另一个单片机,另一个单片机控制灯LED1,LED2,LED3,LED4闪烁。无线发射程序:#include"2401.h"#define uint unsigned int#define uchar unsigned char//1//sbit KEY1=P0^0;        
发表于 2019-12-02
基于51单片机的nrf24l01无线的接收和发射程序
51单片机应用之无线通讯模块NRF24L01+
本教程关于NRF24L01+的内容十分详细,对于大家的学习和调试及其有帮助内含详细教程: 单片机源程序如下:接下来我们写发送程序://**********************************//   NRF24L01+模块发射程序//      用8个LED调试//   Txz001 2012.05.16//**********************************#include <reg52.h>typedef unsigned char uchar; //将无符号字节类型重定义为uchartypedef unsigned int ui
发表于 2019-12-02
51单片机应用之无线通讯模块NRF24L01+
基于AT89c51密码锁设计
;                         钟,防止他人的非法操作*/#include"reg51.h"        #include"intrins.h"#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit bj = P3^0;              
发表于 2019-12-02
基于AT89c51密码锁设计
51单片机音乐盒的仿真课程设计(8首歌)
仿真成功初始化显示P.521061P.显示歌曲编号。8首歌的音乐盒课程设计。一个很简单的程序分享一下仿真原理图如下 单片机源程序如下:////////////////////////////////////////////////51单片机音乐播放器程序                                        ////共三个按键:上一曲、下一曲、播放暂停      
发表于 2019-11-30
51单片机音乐盒的仿真课程设计(8首歌)
基于51单片机的温度采集系统(Labview做上位机)
做该设计的初衷是为自己的毕设打基础,因为我的毕设要做一个探测机器人,需要对某一地区的各种环境参数进行检测,然后通过WIFI返回到上位机。所以为了搞懂温度传感器以及练习上位机的设计,花了几天时间做了一个很简单的采集系统。今天把它拿出来跟各位小伙伴们分享,希望对各位有所帮助,同时也希望大佬们指出不足,起到一个相互学习,相互促进的作用。该系统原理是:51单片机把ds18b20传感器将采集到的温度值(十六进制)通过串口发送到labview,labview对单片机发来的数据做简单的处理然后显示。上位机界面上位机(接受程序)简单的硬件连接数据纪录串口部分:void main()        
发表于 2019-11-30
基于51单片机的温度采集系统(Labview做上位机)
小广播
何立民专栏 单片机及嵌入式宝典

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

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