由于主机和从机都会给数据线SDA发信号,比如主机先给SDA发送数据后,从机收到数据后发送应答信号将SDA拉低,故SDA类型设定为inout。而DATA设定为inout类型,是起到校验通信的作用(后续的程序将EEPROM_WR读取到的数据发送给signal,与signal当初发送的数据相比较),这时DATA为out类型,而在数据传输过程中,DATA一直扮演in类型。Inout类型是由三态门实现的。link_sda和out_flag分别为EEPROM_WR和EEPROM控制三态门输出的开关。当link_sda打开,out_flag关闭时,EEPROM_WR向SDA传输数据,而EEPROM从SDA接收数据。反之out_flag关闭时,EEPROM_WR通过SDA从EEPROM中读取数据。当均关闭时,SDA就被置为高阻状态。

  1. assign sda1   = (link_head)   ?   head_buf[1]    :  1'b0;
  2. assign sda2   = (link_write)   ?   sh8out_buf[7]   :  1'b0; assign sda3   = (link_stop)   ?   stop_buf[1]    :  1'b0; assign sda4   = (sda1 | sda2 | sda3);
  3. assign SDA   = (link_sda)   ?   sda4       :  1'bz;
  4. assign DATA   = (link_read)   ?   data_from_rm   :  8'hzz;

当link_sda打开(link_sda=1)时,将sda4输出,SDA=sda4。当link_sda=0时,将SDA置高阻态。sda4由三个开关控制,为sda1,sda2,sda3相或的结果,这里将EEPROM_WR的状态分为了三个基本的状态,分别是启动状态,写入状态以及停止状态。在启动时候给SDA一个下降沿,停止时给SDA一个上升沿,传输时,给SDA一个有效数据。其实只需要引入link_sda和link_read,在link_sda打开时,我们都给sda4赋新值即可。

串行时钟的程序,SDK和SCL差半个CLK周期。

  1. always @(negedge CLK)       if(RESET)//同步复位          SCL <= 0;      else             SCL <= ~SCL;//时钟下降沿触发,CLK频率为SCL的两倍

比如传输数据1010,时序图如下:CLK上升沿触发SDK,下降沿触发SCL。1-2为启动时期,SCL为高电平,SDA由高电平下降为低电平;在SCL为高电平时,进行数据的传输;在SCL为低电平时,SDA传输数据改变;命令字节的每一位均要占用一个SCL周期,全部完成后,发出再执行应答或非应答信号,继而停止。

对于主状态机程序,可总结为下图:

模拟I2C协议学习点滴之程序相关定义的更多相关文章

  1. 模拟I2C协议学习点滴之原理框架

    I2C是一种串行总线协议. 目前几种常用的串行总线有UART.SPI和I2C协议.UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数 ...

  2. 模拟I2C协议学习点滴之复习三极管、场效应管

    晶体三极管分为NPN和PNP型两种结构形式,除了电源极性的不同工作原理是大致相同的.对于NPN管,它是由2块N型半导体夹着一块P型半导体所组成的,发射区与基区之间形成的PN结称为发射结,而集电区与基区 ...

  3. MQTT 协议学习: 总结 与 各种定义的速查表

    背景 经过几天的学习与实操,对于MQTT(主要针对 v3.1.1版本)的学习告一段落,为了方便日后的查阅 本文链接:<MQTT 协议学习: 总结 与 各种定义的速查表> 章节整理 MQTT ...

  4. I2C协议学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wzt_007/article/detai ...

  5. 学习笔记一:I2C协议学习和Verilog实现

    ////////////////////////////////////////////////// //clk = 20 MHz ,一个周期50ns //sck = 100 kHz (scl) ,一 ...

  6. 模拟telnet协议C语言客户端程序

    首先要了解telnet协议,一下两篇blog给了我初步的思路 https://www.cnblogs.com/liang-ling/p/5833489.html 这篇有比较基础的介绍 以及IAC命令含 ...

  7. GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议,如果是在Linux下面比较简单,但在Windows下面,是否有没Linux那么简单了. 索性自己对I2C协议还有一些了解,翻了SPEC并结合示波器量出的实际信号分析, ...

  8. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  9. STM8S 模拟I2C程序

    STM8S的硬件I2C还是存在问题,不敢贸然使用. 于是决定用模拟I2C. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM P ...

随机推荐

  1. maven配置阿里镜像

    在conf\settings.xml 在<mirrors>里面添加   <mirror>    <id>nexus-aliyun</id>    < ...

  2. VK Cup 2017 - Round 1 (CDE)

    771C Bear and Tree Jumps 大意: 给定树,每步能走到距离不超过$k$的任意点,记$f(s,t)$为$s$到$t$的最少步数,求$\sum\limits_{s<t}f(s, ...

  3. Python 操作MySQL 数据库

    Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的 ...

  4. ASP.NET MVC 5 伪静态之支持*.html路由

    参考了例子 到自己实践还是有不少坑要踩,这种文章,你说它好还是不好呢 注意这里的版本是ASP.NET MVC 5 首页的URL为  http://localhost:58321/index.html  ...

  5. R_数据操作_初级_03

    数据的输入:详见(http://cran.r-project.org/doc/manuals/R-data.pdf下载的R Data Import/Export手册②) 1.键盘输入:使用edit() ...

  6. Scrapy 安装与使用

    Scrapy的安装: 当前环境win10,python_3.6.4,64bit.在命令提示符窗口运行pip install Scrapy,出现以下结果: building 'twisted.test. ...

  7. 1+X证书学习日志——盒模型

    ##   padding的作用:                 控制子元素和父元素之间的位置关系                              padding设置方法:          ...

  8. Ipython 和 python 的区别

    IPython是一个python交互shell,它比默认的python shell更易于使用.它支持自动变量完成.自动缩进.bash shell命令,并且内置了许多有用的函数和函数. IPython是 ...

  9. day01-02

  10. iOS UIView视图的图层控制

    1.添加视图 insertSubview:atIndex:   //放在子视图数组的具体索引位置 insertSubview:aboveSubview:   //某个子视图前面 insertSubvi ...