解析I2C通信协议

news/2024/5/18 22:36:09 标签: 硬件, 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;
    }
 


http://www.niftyadmin.cn/n/1428618.html

相关文章

Arm linux dma mapping操作

Arm linux dma mapping 文章目录概述基本概念Cache操作写数据到device从device读数据swio技术代码分析arm64_dma_initdma_map_singledma_unmap_single设置nocache概述 由于处理器存在cache&#xff0c;cache和内存中数据可能不一致&#xff0c;所以驱动在使用dma在内存和devic…

晶体二极管 三极管 MOS原理

目 录 1 概念 2 PN结 3 晶体二极管 4 晶体三极管 5 MOS晶体管 概念 • 导体&#xff1a;很容易导电的物体&#xff0c;如金、银、铜、铁等。 • 绝缘体&#xff1a;不容易导电或者完全不导电的物体&#xff0c;如塑料、橡胶、陶瓷、玻璃等。 • 半导体&#xff1a;导电性能介…

GFSK调制

GFSK调制 目 录 1 GMSK 4 2 2FSK 4 3 相位连续的2FSK信号 4 4 3dB带宽 9 4.1 dBm和W 9 4.2 dB 9 4.3 dBm快速转换为W的方法 9 4.4 -3dB带宽定义和理解 10 GMSK 当原始数字信号在经过FSK调变送出前&#xff0c;加上一个高斯低通滤波器来限制调变后的信号频谱宽度&…

CMOS逻辑电路

CMOS逻辑电路 目 录 1 PMOS管和NMOS管 3 2 CMOS管 4 3 非门 5 4 与非门 6 5 或非门 8 6 三态门 8 7 传输门 9 8 组合与时序逻辑电路 10 9 R-S触发器 10 10 同步RS触发器 11 11 JK触发器 13 12 维持阻塞式D触发器 15 13 CMOS边沿D触发器 17 14 编码器 18 15 译码…

CMOS和TTL电路区别

1、CMOS是场效应管构成(单极性电路)&#xff0c;TTL为双极晶体管构成&#xff08;双极性电路&#xff09; 2、COMS的逻辑电平范围比较大&#xff08;5&#xff5e;15V&#xff09;&#xff0c;TTL只能在5V下工作 3、CMOS的高低电平之间相差比较大、抗干扰性强&#xff0c;TTL…

FPGA与CPLD的区别

FPGA FPGA&#xff08;Field&#xff0d;Programmable Gate Array&#xff09;&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。内部基本结构为门阵列构成静态存储器&#xff08;SRAM&#xff09;。该SRAM可构成函数发…

关于CPLD与FPGA的对比分析

1.PLD/FPGA/CPLD PLD&#xff08;Programmable Logic Device&#xff09;:可编程逻辑器件&#xff0c;数字集成电路半成品&#xff0c;芯片上按照一定的排列方式集成了大量的门和触发器等基本逻辑元件&#xff0c;使用者按照设计要求运用开发工具将这些片内的元件连接起来&…

FPGA的工艺与原理

CPLD 是可以等价于 GAL 的阵列&#xff0c;编程的数学模型是基于多项式的乘用与门电路实现&#xff0c;而多项式的加用或门电路实现。那么我们 FPGA 的编程机理是什么呢&#xff1f;它为什么能够实现我们任意的函数表达式呢&#xff1f;我们在上一讲已经知道了 FPGA就实现技术是…