首页 > 其他分享 >嵌入式开发入门-51单片机基础知识(8)- IIC

嵌入式开发入门-51单片机基础知识(8)- IIC

时间:2023-04-28 14:56:18浏览次数:40  
标签:SCL 高电平 Delayus 51 低电平 单片机 SDA IIC I2C

一、IIC发送时序图

  

从上图可以看出:

  起始条件:SCL线是高电平时,SDA线从高电平向低电平切换;

  停止条件:SCL线是高电平时,SDA线从低电平向高电平切换;

首先SDA和SCL都处于空闲状态(SDA和SCL都为高电平时),

然后,SDA跳变为低电平(可以理解为,SDA向SCL发出通知,我现在要准备发送数据了)

最后,SCL跳变为低电平(因为只有SCL为低电平时,SDA才能跳变进行数据准备)。

这时,启动信号完成,接下来就可以开始发送数据了。

1 void I2C_Start()
2 {
3     I2C_SCL=1;
4     I2C_SDA=1;
5     I2C_SDA=0;
6   delayus(1); 7 I2C_SCL=0;
8   delayus(1);
8 }

  首先停止标志是SCL和SDA都处于空闲状态,也就是都处于高电平。

  其次,只有当SCL为高电平时,SDA发生跳变才有效。

  可以理解为,SCL在高电平期间,SDA从低电平发生跳变到高电平,表示SDA发送一个通知,我发送完成了。

  所以停止前,要先确保SDA为低电平,然后SCL在从低电平跳变到高电平。

  SCL发生低电平向高电平转换后,SDA在从低电平向高电平切换,这时停止信号完成。

 

void I2C_Stop(void)
{
    I2C_SCL = 0;
    I2C_SDA=0;
    Delayus(1);
    I2C_SCL=1;
    Delayus(1);
    I2C_SDA=1;
}

  综合来看: 

  当SCL为高电平:

    SDA从高电平跳变到低电平,通知SCL要发送数据了

    SDA从低电平跳变到高电平,通知SCL数据发送完成了

二、IIC发送和接收过程

  以传输一个字节为例:1010 1010,时序图如下

   从上图看出如何发送一个字节:SCL在低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA的数据不允许发生变化,依次循环上述过程8次,既可发送一个字节。

  发送过程:

  1、准备好数据,放到SDA线

  2、SCL拉为高电平,即为发数据(从机这个时候读数据)???这里是否要先保证SCL为低电平,然后再准备好数据放到SDA线。是否应该在for循环外部,先给定SCL为低电平。或者说把SCL清零放在for循环内部的第一行

  3、SCL拉为低电平,

 

 void I2C_SendByte(unsigned char Byte)
{
    unsigned char i;

    for(i=0;i<8;i++)
    {
        I2C_SDA=Byte&(0x80>>i);//数据先把最高位右移i位,然后与要传输的数据与运算,相当于把数据放到SDA线上
        Delayus(1)
        I2C_SCL=1;  //SCL为高电平,这时从机从SDA线读取数据  
        Delayus(1)
        I2C_SCL=0; //传输后,再拉为低电平,在低电平期间,SDA在循环的第一句,在放一个数据,依次循环八次,完成数据发送 
        Delayus(1)  
        } 
}    

  接收信号时,首先要确保SDA线处于空闲状态,然后在SCL为高电平的时候,SDA接收1位数据,然后SCL拉低,再一个新的循环时,SCL再被拉为高电平,如此循环。

unsigned char I2C_Receive()
{
    unsigned char i,Byte=0x00;
    
    for(i=0;i<8;i++)
    {
        I2C_SCL=1;
     Delayus(1); if (I2C_SDA) { Byte|= (0X80>>i); }
     Delayus(1); I2C_SCL=0; } return Byte; }

 三、应答环节

 1 void I2C_SendAck(unsigned char AckBit)
 2 {
 3     I2C_SDA = AckBit;//应答位准备好数据,
    Delayus(1); 4 I2C_SCL = 1; //SCL为高电平,发送数据  
    Delayus(1); 5 I2C_SCL = 0; //传输后,再拉为低电平,在低电平期间,
    Delayus(1); 6 } 7 unsigned char I2C_ReceiveAck() 8 { 9 unsigned char AckBit; 10 I2C_SCL = 0;//给SDA跳变准备时序 11 I2C_SDA = 1;//释放SDA总线,由从机占用SDA
    Delayus(1); 12 AckBit = I2C_SDA; //SCL为高电平,这时从机从SDA线读取数据  
    Delayus(1);
13 I2C_SCL = 1; //当SCL为高电平时,从SDA读取应答信号
    Delayus(1);
14 I2C_SCL = 0; //传输后,再拉为低电平,在低电平期间, 15 Delayus(1); 16 return AckBit; 17 }
               

标签:SCL,高电平,Delayus,51,低电平,单片机,SDA,IIC,I2C
From: https://www.cnblogs.com/wanggengwu/p/17350509.html

相关文章

  • 调度器51—进程优先级 prio、static_prio、normal_prio、rt_priority
    一、概述structtask_struct{intprio;intstatic_prio;intnormal_prio;unsignedintrt_priority;...} 二、动态优先级——prioprio表示进程的当前优先级,是一个动态值,会在进程运行时不断变......
  • iic-2023-04-27
    1、时序构成可参见《12-IIC协议介绍2》的12:12往后的地方。 2、读写过程可参见《4分钟看懂!I2C通讯协议最简单的总线通讯!》,图片内容来自上述视频,首先需要指出的是,读数据时,发出第二次起始位+设备地址+读控制位后面没有应答信号,这个可以从立创商城英锐芯下载的AT24C02手册的“随机......
  • 新品首发丨计讯物联5G水利遥测终端机TY511-B3,推动5G+智慧水利再进化
    当前,水利在全面感知、全面互联、智慧应用等方面较其他行业存在明显差距。基于物联网行业通信技术的不断突破和水利行业对高速移动通信的强烈需求,5G移动通信以高速率、大带宽、低时延、广连接等特点让水利数据快速高效地传输成为可能,逐渐成为水利行业高质量发展的重要驱动力量。计......
  • ASEMI代理ADI亚德诺ADM3051CRZ-REEL7车规级芯片
    编辑-ZADM3051CRZ-REEL7芯片参数:型号:ADM3051CRZ-REEL7显性状态:78mA隐性状态:10mA待命状态:275μACANH输出电压:4.5VCANL输出电压:2V差动输出电压:3V输入电压滞后:150mV差分输入电阻:100kΩ参考输出电压:3.025V最大数据速率:1MbpsVCC:−0.3Vto+7V工作温度范围:−40°C......
  • NC51100 A Simple Problem with Integers
    题目链接题目题目描述YouhaveNintegers,\(A_1,A_2,...,A_N\).Youneedtodealwithtwokindsofoperations.Onetypeofoperationistoaddsomegivennumbertoeachnumberinagiveninterval.Theotheristoaskforthesumofnumbersinagivenint......
  • 单片机学习-Writing
    Date:2023-04-0111:17:44ps:写作中前言我的专业是物联网工程,虽然几乎没怎么听过课,但毕业设计把我硬生生逼入门了,以下为我的学习感受,知识不应该被遗忘,应该被记录,储存,对我自己有意义就可以了实现阿里云温湿度监测完成毕业设计目标,随便选的一个课题,学校要求要使用超过3个传......
  • 1351. 统计有序矩阵中的负数(leetcode)
    https://leetcode.cn/problems/count-negative-numbers-in-a-sorted-matrix/1351.统计有序矩阵中的负数1.二分法:把每一行进行一遍二分,找到正数与负数的边界,且此时grid[i][mid]也为负数,即边界下标的对应值是负数的左半边界那么一行中的个数即为size()-lclassSolution{pu......
  • Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程
    移植QT5教程(此教程基于docker版V851S开发环境)dockerpullregistry.cn-hangzhou.aliyuncs.com/gloomyghost/yuzukilizard编译依赖apt-getinstallrepogitgcc-arm-linux-gnueabihfu-boot-toolsdevice-tree-compilermtools\partedlibudev-devlibusb-1.0-0-devpython......
  • 51单片机(普中板)红外遥控
    1,下降沿触发现象:按下k3键,Lcd值会增加。#include<REGX52.H>#include"Delay.h"#include"LCD1602.h"unsignedcharnumber;voidmain(){LCD_Init();LCD_ShowString(1,1,"A");IT0=1;//1:下降沿触发(按下触发),0:低电平触发(按着持续触发......
  • 51单片机(普中板)蜂鸣器控制
    蜂鸣器通过震荡脉冲控制1,尝试发声#include<REGX52.H>#include"Delay.h"sbitbuzzer=P2^5;//蜂鸣器端口unsignedinti;//演奏时长voidmain(){while(1){for(i=0;i<500;i++){buzzer=!buzzer;Delay......