模拟I2C协议学习点滴之程序相关定义
由于主机和从机都会给数据线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周期,全部完成后,发出再执行应答或非应答信号,继而停止。
对于主状态机程序,可总结为下图:
最新文章
- Object方法equals、hashCode
- [Linux] -Docker修改空间大小
- 才知道创建数据表的后面int(M)的m居然和存储大小没有关系
- ADB server didn&#39;t ACK的解决方法
- nyoj CO-PRIME 莫比乌斯反演
- Bootstrap日期和时间表单组件运用兼容ie8
- POJ 2492 (简单并查集) A Bug&#39;s Life
- Error building Player: Win32Exception: ApplicationName=‘xxxxxxxxxxxxxxxxxx//sdk\tools\zipalign.exe&#39; , CommandLine=&#39;4 的解决办法
- Android 响应webview中图片的点击事件
- Fedora 17 修改GRUB启动菜单顺序
- richTextBoxBulletClass
- java.lang.NumberFormatException: empty String 错误
- Java编程思想——类型信息(RTTI)
- 数据结构中的棧在C#中的实现
- 同是办公软件,wps和office有什么区别?
- 全球领先的redis客户端:SFedis
- Java8与传统的日期和时间类详解
- UDP广播 MAC地址
- Linux报错
- 控制反转IOC与依赖注入DI - 理论篇