通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

2023-05-16

文章目录

  • 一、IIC(Inter-Integrated Circuit)介绍
  • 二、传输协议
    • 1.时序
        • 传输时序
        • 写操作时序
        • 数据有效性
        • 开始&结束信号
        • 从机应答信号
    • 2.数据格式
  • 三、设计实现
    • 1、时钟
    • 2、传输过程
    • 3、 三态门


一、IIC(Inter-Integrated Circuit)介绍

    IIC(Inter-Integrated Circuit)是一种具有两线传输的串行通信总线,使用多主从架构,由飞利浦公司在1980年为了让主板、嵌入式系统或手机连接低速周边设备而提出,适用于数据量不大且传输距离短的场合。
    IIC串行总线由两根信号线组成,一根是双向的数据线SDA,另一根是单向的时钟线SCL,在空闲状态时,SDA和SCL线都置’1‘,为高电平。

IIC为同步半双工通信方式

常见的传输速率有:100kb/s、300kb/s、3.4Mkb/s

二、传输协议

1.时序

    IIC由两根通信信号线组成,SCL是由主模块输入的时钟信号,是单向的信号,而SDA是由主机或从机控制的数据信号,是双向信号。

传输时序

    在空闲状态下,SCL及SDA都是置高的状态,当需要进行一次IIC传输时,由START信号指示当前数据传输开始,由STOP信号指示当前的数据传输结束,START信号的标识是在SCL高电平情况下,SDA信号由高变低 ,即视为START开始,STOP信号标识是在SCL高电平情况下,SDA信号由低变高,即视为STOP结束,START信号与STOP信号之间的信号流即为所传输信号。
    IIC传输格式每一次传输都是以8bit为一个基本传输单位,所含数据流一般包含地址、片选、读写、数据信号。其基本时序如图1所示,SCL为输入的时钟信号,SDA既可作为数据的输入信号,也可作为数据的输出信号

tHIGH tLOW分别为高电平和低电平持续时间;
tsu,sta thd,sta分别为开始信号start的建立和保持时间;
tsu,dat thd,dat分别为数据信号data的建立和保持时间;
tsu,sto thd,sto分别为结束信号stop的建立和保持时间;
图1、IIC传输时序图

图1、IIC传输时序图

写操作时序

    在进行写操作时,SCL一直保持时钟的信号,SDA线的传输以8位为一个单位,在进行第一个8bit的传输后,若从设备接收到传输信号,则会返回一个应答信号ack,然后拉低SDA线,进行下一步的数据写入,写周期时序图如下图所示 ,twr 为进行数据写入的时钟周期
在这里插入图片描述

图2、IIC写操作时序图

数据有效性

    IIC进行传输时,数据data的改变必须在SCL信号为低电平时进行,在SCL为高电平时保持稳定,此时认为在SCL为高电平时的数据有效,其时序如下图所示

在这里插入图片描述

图3、信号变换时序图

开始&结束信号

    IIC传输的开始及结束如下图4所示,在SCL为高电平期间,SDA由高变低,即为start信号;在SCL为高电平期间,SDA信号由低变高,即为stop信号.
[description]

图4、start & stop 信号时序图

从机应答信号

    传输过程中的应答信号时序如下图5所示,当检测到start信号后,在随后的8个时钟周期,SDA线进行一次8bit的数据传输,若接收到相应的8bit信号,则在第9个时钟周期拉低SDA信号,并视为一次ack应答信号
在这里插入图片描述

图5、ack应答信号时序图

2.数据格式

    进行一次IIC传输时,由START信号指示当前数据传输开始,由STOP信号指示当前的数据传输结束,IIC传输格式每一次传输都是以8bit为一个基本传输单位,一次完整的IIC传输包含

Trans_data = Start + n * Bytes+ n * ack + Stop

基本数据格式如下图所示:

   在这里插入图片描述
    当检测到Start信号时,主机输出8bit的信号,其中前7bit表示从机的地址,为选中的从机信息,第8bit表示当前进行的读写操作,为’1’表示读操作,为’0’表示写操作,然后第9位为从机的应答ack信号,表示指定从机已接收到地址信号,以进行后续的传输;后续的传输以 8 bit + ack 的重复,即 n * Bytes + n * ack 信号来进行数据的传输,最后主机发出Stop信号,即当前的一次IIC传输结束。

三、设计实现

1、时钟

    前面提到IIC一般适用于吞吐量较低的场景,其常见的传输速率(SCL线上时钟)有:100kb/s、300kb/s、3.4Mkb/s,而数字处理逻辑动辄几十百兆速率的系统时钟,因而对于IIC必须要做一个低频的时钟。一个完整的IIC传输过程中会用到三个时钟:1、系统频率时钟;2、IIC传输驱动时钟;3、SCL线上时钟(伪时钟)

时钟信号定义
System_clk系统时钟
IIC_dri_clkIIC驱动时钟
SCL_clkSCL线上时钟(伪时钟)

    SDA信号数据的改变必须是在SCL为低电平时改变,在SCL为高电平时保持稳定,因而可以得出IIC_dri_clk和SCL_clk的关系,IIC_dri_clk频率应至少为SCL_clk的两倍以上(通常选用四倍频,若选用两倍频则只能在下降沿或在当前数据获取的clk上升沿进行改变,易出现毛刺),SDA才能实现在SCL低电平改变数据。时钟频率关系如下,其中 Freq_div 为 分频系数
                FIIC_dri_clk=4 * FSCL_clk

               Freq_div=FSystem_clk /FIIC_dri_clk

时钟分频具体实现如下:

assign  Freq_div= (System_clk/SCL_clk) >> 2'd2;

always @(posedge System_clk or negedge rst_n) begin
    if(!rst_n) begin
        IIC_clk <=  1'b0;
        clk_cnt <= 10'd0;
    end
    else if(clk_cnt == Freq_div/2 - 1'd1) begin
        clk_cnt <= 10'd0;
        IIC_dri_clk <= ~IIC_dri_clk;
    end
    else
        clk_cnt <= clk_cnt + 1'b1;
end

2、传输过程

   整个IIC传输过程中,先传器件地址,再传读/写地址,然后再传读/写数据,因而整个传输过程可以用状态机来控制,状态定义及跳转如下图

状态定义
IDLE起始状态
SLAVE_ADDR发送器件地址
WR_ADDR_16发送16位字地址
WR_DATA写数据
RD_ADDR读地址
RD_DATA读数据
DONE传输结束

在这里插入图片描述
整个状态机具体实现如下:

always @(posedge IIC_dri_clk or negedge rst_n) begin
    if(!rst_n)
        state_c <= IDLE;
    else
        state_c <= state_n;
end

 
always @(*) begin
    state_n = IDLE;
    case(state_c)
        IDLE: begin                        
           if(iic_flag) begin
               state_n = Slave_ADDR;
           end
           else
               state_n = IDLE;
        end
        Slave_ADDR: begin
            if(iic_done) begin
                if(bit_ctrl)                   
                   state_n = WR_ADDR_16;
                else
                   state_n = WR_ADDR_8 ;
            end
            else
                state_n = Slave_ADDR;
        end
        WR_ADDR_16: begin                        
            if(iic_done) begin
                state_n = WR_ADDR_8;
            end
            else begin
                state_n = WR_ADDR_16;
            end
        end
        WR_ADDR_8: begin                         
            if(iic_done) begin
                if(wr_flag==1'b0)               
                    state_n = WR_DATA;
                else
                    state_n = RD_ADDR;
            end
            else begin
                state_n = WR_ADDR_8;
            end
        end
        WR_DATA: begin                       
            if(iic_done)
                state_n = DONE;
            else
                state_n = WR_DATA;
        end
        RD_ADDR: begin                       
            if(iic_done) begin
                state_n = RD_DATA;
            end
            else begin
                state_n = RD_ADDR;
            end
        end
        RD_DATA: begin                       
            if(iic_done)
                state_n = DONE;
            else
                state_n = RD_DATA;
        end
        DONE: begin                          
            if(iic_done)
                state_n = IDLE;
            else
                state_n = DONE ;
        end
        default: state_n= IDLE;
    endcase
end

3、 三态门

   在整个IIC传输过程中,SCL信号是由主模块传输给从模块的时钟信号,SDA既可以主机发送从机接收,也可以是主机接收从机发送的信号,因而SDA线是双向的信号,在RTL中用inout接口类型来表示该双向信号,在这里即涉及到一个三态门的实现
   即当IIC进行主机发送从机接收传输时,IIC_flag信号置高,sda线上信号即为主机发送信号,当从机发送主机接收时,IIC_flag信号拉低,此时sda与sda_out信号间为高阻状态,视为断开,此时通过sda_in信号来获取sda信号线上的输入数据
三态门具体实现如下:

assign  sda     = IIC_flag ?  sda_out : 1'bz;     
assign  sda_in  = sda ;  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现) 的相关文章

  • [Ajax] JSON数据格式

    JSON是什么 JSON是什么 JSON中文官网地址 是一种轻量级的数据交换格式 JSON是独立于任何语言的文本格式 易于程序员阅读和编写 xff0c 同时也易于计算机解析和生成 JSON语法规则 名称 值 对的集合 xff08 Acoll
  • LPC1768 IIC通信示——PCF8563

    PCF8563与AT24C02一样 xff0c 是典型的IIC通信器件 xff0c 这里就以它为例 xff0c 编写基于LPC1768硬件IIC的通信代码 xff1a 上图是PCF8563各个寄存器地址 xff0c PCF8563的IIC地
  • AHB总线协议(一)

    1 简介 AHB Advanced High Performance Bus 总线规范是AMBA Advanced Microcontroller Bus Architecture V2 0总线规范的一部分 xff0c AMBA总线规范是A
  • STM32基于IIC协议的OLED模块的使用

    前言 一 项目涉及的内容 项目简介 二 模块实操 1 IIC模块 1 1 IIC协议格式 1 2 开始信号与停止信号 1 3 写数据 1 3 1 硬件IIC代码编写 1 3 2 软件模拟IIC代码编写 2 OLED板块 前言 本篇文章对使用
  • PX4-5-SPI-IIC设备驱动

    在之前的分享中 xff0c 我们聊了PX4的通信框架和任务调度框架 xff0c 现在我们讲一下PX4的设备驱动 PX4支持很多种设备 xff0c 根据通信方式的不同大致分为 xff1a SPI IIC设备 串口设备 IO设备 CAN设备 这
  • 0.96OLED 4针IIC STM32-标准库版本(附源码)

    0 96OLED 4针IIC STM32标准库版本 在前面已经介绍过 xff0c 这里就不多说了 xff0c 详情请见 xff1a 0 96OLED 4针IIC STM32HAL库版本 另外 xff0c 本人在代码中封装了一个OLED显示的
  • 普通数组如何转换成json数据格式

    我们都知道json有很多种格式 xff0c 而开发过程中经常遇到格式转换的问题 xff0c 特别是接口调用的时候 xff0c 如何将普通数组转成我们需要的json格式呢 xff0c 下面我提供了一种方法 xff0c 也是一种思路 xff0c
  • 通信协议详解(一):UART串口(协议+数据格式+设计实现)

    uart串口通信协议及verilog实现 文章目录 一 uart串口通信简介二 串口传输1 数据协议2 整体架构 三 串口传输实现1 发送模块2 接收模块 四 串口收发仿真总结 一 uart串口通信简介 通用异步收发器 UART xff08
  • IIC通讯总结

    1 IIC简介 IIC全称Inter Integrated Circuit 是由PHILIPS公司在80年代开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 IIC属于半双工同步通信方式 2 IIC特点 xff08 1 xff
  • IIC通信协议总结(详细说明完整过程)

    IIC协议简介 IIC xff08 inter integrated Circuit集成电路总线 总线支持设备之间的短距离通信 xff0c 用于处理器和一些外围设备之间的接口 xff0c 它需要两根信号线来完成信息交换 IIC的一个特殊工艺
  • iic片选PCA9548A芯片

    PCA9548A数据表 产品信息和支持 TI com iic片选深入 从上图中我们可以看到通过iic的iic 例如 iic0 扩展出8路iic来访问slave 例如8个口的光模块 那么里面的原理是什么呢 我们先来看PCA9548A 文档 需
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • DHT12温湿度传感器IIC,I2C接口调试心得和代码说明

    来源 xff1a http www fuhome net bbs forum php mod 61 viewthread amp tid 61 2141 DHT11那个单总线的温湿度传感器用的很多了 xff0c aosong推出了DHT12
  • IIC 驱动OLED

    IIC总线可以驱动很多器件 xff0c 比较常见的有OLED EEPROM存储器 xff08 AT24C02 xff09 温度传感器 xff08 LM75A xff09 温湿度传感器 xff08 DHT11 xff09 等 有关IIC总线协
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • NEMA 协议:GPRMC数据格式

    NEMA协议的由来 NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The
  • 音频处理——详解PCM数据格式

    目录 知识储备什么是PCM采样采样率重采样 量化编码PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation xff0c 翻译一下是
  • I2C总线时序以及ACK和NACK(NAK),SCL被从机拉低?

    1 I2C协议详解及裸机程序分析 简书 通俗易懂 根据上图 我们首先设置IICCON 来设置时钟 时钟源是PCLK 是50MHZ 太快了我们需要设置这个分频系数 把时钟降低 降低到我们想要的SCL 然后我们要发出start信号 我们需要设置
  • I2C走线技巧、及上拉电阻、电源电压、总线电容三者间的函数关系

    目录 I2C总线PCB布线注意事项 博客其他文档可以学习 https www cnblogs com zhiqiang zhang I2C总线线路的走线方式 I2C器件与I2C总线的接线方式 I2C总线连接规范 I2C总线中上拉电阻 电源电
  • 基于STM32 的IIC 模拟主机编写

    最近在学习STM32 的IIC IO 模拟主机方式 好像失败了 include myiic h include delay h MCU VERSION DATA 作者 other Function IIC

随机推荐

  • CUDA性能优化----warp深度解析

    CUDA性能优化 warp深度解析 2017 01 12 16 41 07 分类 xff1a HPC amp CUDA优化 标签 xff1a gpu cuda hpc 举报 字号 订阅 下载LOFTER 我的照片书 1 引言 CUDA性能优
  • 螺旋桨转矩

    xfeff xfeff 在螺旋桨气动力分析时 xff0c 首先应用翼型理论进行螺旋桨叶素分析 利用翼型升阻特性数据 xff0c 回避了有限机翼的展弦比问题 xff0c 诱导流动由涡流模型确定 xff0c 取决于桨叶数目 间距以及作用于每片桨
  • 给初学者们讲解人工神经网络(ANN)

    1 介绍 这份教学包是针对那些对人工神经网络 xff08 ANN xff09 没有接触过 基本上完全不懂的一批人做的一个简短入门级的介绍 我们首先简要的引入网络模型 xff0c 然后才开始讲解ANN的相关术语 作为一个应用的案例 xff0c
  • OpenMP基本概念

    OpenMP是一种用于共享内存并行系统的多线程程序设计方案 xff0c 支持的编程语言包括C C 43 43 和Fortran OpenMP提供了对并行算法的高层抽象描述 xff0c 特别适合在多核CPU机器上的并行程序设计 编译器根据程序
  • 散度和旋度的物理意义是什么?

    高等数学学的时间有点久远了 xff0c 最近需要推倒一些公式 xff0c 以前高数学的时候这公式那定理的都没说什么物理意义 xff0c 现在接触的问题都是具有一定物理意义的 xff0c 感觉对不上 xff0c 回来找找资料好好理解一下 xf
  • 格林公式、高斯公式及斯托克斯公式的理解及相互关系

    最近要推倒波动方程积分解 xff0c 要对散度 旋度以及他们之间的相互关系有一个理解 看了两天 xff0c 自己认为理解的差不多了 xff0c 现在写在这个地方 xff0c 作为笔记 xff0c 以后忘记了拿过来看一下 xff0c 加深一下
  • Radon变换理论介绍

    本人最近在研究Radon变换 xff0c 在查阅了各种资料之后在此写下个人的理解 xff0c 希望与各位牛牛进行交流共同进步 xff0c 也使得理解更加深刻些 Radon变换的本质是将原来的函数做了一个空间转换 xff0c 即 xff0c
  • test

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 utf 8 34 gt lt meta http equiv 61 34 X U
  • BIT内存顺序

    机器的最小寻址单位是字节 xff0c bit无法寻址 xff0c 也就没有高低地址和起始地址的概念 xff0c 我们需要定义一下bit的 地址 以一个字节为例 xff0c 我们把从左到右的8个bit的位置 position 命名按顺序命名如
  • 无人驾驶感知篇之融合(五)

    今天早上看到上海新增一万七千左右 xff0c 看的真的很揪心 xff01 希望白衣战士能早点战胜这场疫情 xff0c 期待明天能有好消息 xff01 今天具体讲讲多贝叶斯估计算法的原理 xff0c 多贝叶斯估计法的主要思想是将传感器信息依据
  • MAC地址的介绍(单播、广播、组播、数据收发)

    MAC地址组成 网络设备的MAC地址是全球唯一的 MAC地址长度为48比特 xff0c 通常用十六进制表示 MAC地址包含两部分 xff1a 前24比特是组织唯一标识符 xff08 OUI xff0c OrganizationallyUni
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • Linux内核Socket CAN中文文档

    自己在年假中空闲之余翻译的内核中Socket CAN的文档 xff0c 原文地址在 xff1a http lxr linux no linux 43 v2 6 34 Documentation networking can txt 但是这篇
  • c/c++自定义通讯协议(TCP/UDP)

    前言 xff1a TCP与UDP是大家耳熟能详的两种传输层通信协议 xff0c 本质区别在于传输控制策略不相同 xff1a 使用TCP协议 xff0c 可以保证传输层数据包能够有序地被接受方接收到 xff0c 依赖其内部一系列复杂的机制 x
  • ubuntu 使用虚拟can 与 socketCAN使用

    原文链接 xff1a https blog csdn net xiandang8023 article details 127990159 创建虚拟CAN接口 在Linux上能使用虚拟CAN接口之前 xff0c 需要在终端执行以下三个步骤
  • cmake引入第三方库

    cmake引入第三方库 第三方库包含 lib文件和 h hpp文件动态库还包含 dll文件 小例程 3rdparty bin test dll include test hpp lib Debug test lib Release test
  • AHB-APB总线协议

    AHB APB总线协议 文章目录 AHB APB总线协议一 AHB APB总线介绍二 AHB总线设备1 AHB主设备 xff08 master xff09 2 AHB从设备 xff08 slave xff09 3 AHB仲裁器 xff08
  • Modelsim缺失库快速添加

    Modelsim缺失库快速添加 文章目录 Modelsim缺失库快速添加前言一 ini文件二 器件库配置1 将器件库放在modelsim文件夹下2 ini配置文件修改 前言 在单独使用modelsim时 xff0c 假如要编译复杂的工程文件
  • AHB-APB_Lite总线协议及Verilog实现

    AHB APB Lite总线协议及Verilog实现 文章目录 AHB APB Lite总线协议及Verilog实现一 AHB Lite协议介绍二 系统框架介绍三 代码设计四 仿真测试 一 AHB Lite协议介绍 AHB xff08 Ad
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门