由于主机和从机都会给数据线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就被置为高阻状态。

assign sda1   = (link_head)   ?   head_buf[1]    :  1'b0;
assign sda2   = (link_write)   ?   sh8out_buf[7]   :  1'b0; assign sda3   = (link_stop)   ?   stop_buf[1]    :  1'b0; assign sda4   = (sda1 | sda2 | sda3);
assign SDA   = (link_sda)   ?   sda4       :  1'bz;
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周期。

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. PB笔记之数据窗口可编辑的条件

    1.列的tab order为0,列不能获得焦点2.dw_control.object.datawindow.readonly="yes"3.DW.Object.<Column ...

  2. IDEA好用插件推荐

    Maven Helper:排查maven依赖冲突神器,强力推荐! Alibaba Java Coding Guidelines:阿里巴巴编程规范 CamelCase:驼峰命名工具,SHIFT + AL ...

  3. hdu 2181.。。。

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. RabbitMQ消息队列入门(一)——RabbitMQ消息队列的安装(Windows环境下)

    一.RabbitMQ介绍1.RabbitMQ简介RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收 ...

  5. 攻防世界(Ctf-Web 新手练习区 Writeup)

    平台地址:adworld.xctf.org.cn 在打着暑假工赚零花钱之余,我将这些题利用空余时间刷了一遍,感觉内心还是比较满足的! 题目:view_source 这道题没啥好说的,在url的前面加上 ...

  6. Microsoft Word (2016) Deceptive File Reference ZDI-CAN-7949

    [+] Credits: John Page (aka hyp3rlinx) [+] Website: hyp3rlinx.altervista.org[+] Source:  http://hyp3 ...

  7. SDcms1.8代码审计

    由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...

  8. 如何使用点击超链接的方式打开Android手机上的应用

    在Android应用的AndroidManifest.xml里加入如下的配置片段: <action android:name="my_action"/> <cat ...

  9. java的输入流中的两个坑

    1.输入流的所有实例中的read()方法皆是阻塞的. 输入流只会在发生错误或者异常关闭的时候回返回-1,如果流中没有数据,不会返回-1而是一直阻塞. 2.BufferedReader的readLine ...

  10. 修改Linux命令:ls为例

    Linux命令可以被修改,用于启动一些不起眼的程序. 操作方法如下: whereis ls cd /usr/bin mv ls ls_bak vim ls 新建的ls文件中 chmod +x ls c ...