I2C连续读写实现

news2024/11/26 7:48:58

IIC系列文章:
(1)I2C 接口控制器理论讲解
(2)I2C接口控制设计与实现
(3)I2C连续读写实现

文章目录

  • 前言
  • 一、 i2c_bit_shift 模块分析
  • 二、 i2c_control 模块实现
  • 三、 i2c_control 模块仿真测试


前言

上文的 i2c_bit_shift 模块说完了,我们发现实现一个字节的写操作还是可以实现的,实际的应用中我们不可能只写一个字节的数据,那么此时这个 i2c_bit_shift 模块用来连续写就有些不方便了,从上面的仿真代码就能看出来,这时就需要一个上层模块来控制这个i2c_bit_shift 模块去连续写,这样就方便一些。

提示:以下是本篇文章正文内容,下面案例可供参考

一、 i2c_bit_shift 模块分析

还是用一个实际的例子来说明。例如往 1 字节器件地址的 EEPROM 中的 0C 地址写数据 0A 呢?我们来看一下上面说的单字节写时序图。
在这里插入图片描述
首先我们按照 i2c_bit_shift 模块的操作来拆分一下,这里面可以分成三次操作:
第一次,起始位+写数据(7 位器件 ID + 1 位读写控制位(这里是 0,表示写)),等待从机应答。
第二次,写数据(8 位 EEPROM 的寄存器地址),等待从机应答。
第三次,写数据(写 8 位数据到 EEPROM 中),等待从机应答,然后给出停止位信号。

我们要从一个 1 字节器件地址的 EEPROM 中的 0C地址读取数据。我们来看一下上面说的单字节读时序图。
1
首先我们按照 i2c_bit_shift 模块的操作来拆分一下,这里面可以分成四次操作:
第一次,起始位+写数据(7 位器件 ID + 1 位读写控制位(这里是 0,表示写)),等待从机应答。
第二次,写数据(8 位 EEPROM 的寄存器地址),等待从机应答。
第三次,起始位+写数据(7 位器件 ID + 1 位读写控制位(这里是 1,表示读)),等待从机应答。
第四次,读数据(从 EEPROM 中读出 8 位数据)+ 应答位(根据需要给出应答(0)或者无应答(1))+ 停止位。
总的来说就是写了三次 1 字节的数据,读了一次 1 字节的数据。

二、 i2c_control 模块实现

原理图展示:
在这里插入图片描述
模块接口功能描述:

在这里插入图片描述
状态转移图,如下图所示:
在这里插入图片描述

为了让代码更简洁这里就用到了两个 task 一个是用来写字节(write_byte),另一个是读字节(read_byte)。写字节的 task 里面就将要写的字节数据准备好(赋值给 i2c_bit_shift 模块的 Tx_DATA 端口),同时涉及到的传给 i2c_bit_shift 模块的 Cmd 命令也准备好,同时触发 Go 信号,这样就可以通过i2c_bit_shift 模块将要写的数据发送到总线上了。同理,读字节的 task 里面将涉及到的传给i2c_bit_shift 模块的 Cmd 命令也准备好,同时触发 Go 信号,这样就可以通过 i2c_bit_shift 模块将总线上的数据读取出来了。代码如下:

task read_byte;
		input [5:0]Ctrl_Cmd;
		begin
			Cmd <= Ctrl_Cmd;
			Go <= 1'b1; 
		end
	endtask
	
	task write_byte;
		input [5:0]Ctrl_Cmd;
		input [7:0]Wr_Byte_Data;
		begin
			Cmd <= Ctrl_Cmd;
			Tx_DATA <= Wr_Byte_Data;
			Go <= 1'b1; 
		end
	endtask

这样的话读代码就可以简化成下面这样了,

write_byte(WR | STA, device_id);
write_byte(WR, reg_addr[15:8]);
write_byte(WR, reg_addr[7:0]);
write_byte(WR | STO, wrdata);

写代码简化为

write_byte(WR | STA, device_id);
write_byte(WR | STO,8'h0C);
write_byte(WR | STA, device_id |8'd1);
read_byte(RD | ACK | STO);

第三行的 device_id | 8’d1 是因为后面要进行读操作,所以用这个小技巧就可以把原本的写改成读了。

那么上面的代码还是有问题,怎么就判断第一行的这个 write_byte 的 task 把数据写成功了呢,这个就需要判断 i2c_bit_shift 模块返回的 Trans_Done 的握手信号,这样就可以接着发送第二行的 write_byte 的 task,以此类推的执行完这四行的 task 就可以实现从 EEPROM 中的 0C 地址读取数据。可以分成 3 个状态来控制这个过程,第一个是写寄存器状态(WR_REG),这里面有这个写数据操作的四个 task(第

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么CAN要采取双绞线布局?

摘要&#xff1a; 在CAN总线应用中&#xff0c;一般建议使用屏蔽双绞线进行组网、布线&#xff0c;本文将详细讲解为什么CAN总线要采取双绞线的布局。 CAN&#xff08;Controller Area Network&#xff09;是一种用于实时应用的串行通讯协议总线&#xff0c;它可以使用双绞线来…

【解决】Kafka Exception thrown when sending a message with key=‘null‘ 异常

问题原因&#xff1a; 如下图&#xff0c;kafka 中配置的是监听域名的方式&#xff0c;但程序里使用的是 ip:port 的连接方式。 解决办法&#xff1a; kafka 中配置的是域名的方式&#xff0c;程序里也相应配置成 域名:port 的方式&#xff08;注意&#xff1a;本地h…

Medical Isolated Power Supply System in Angola

安科瑞 华楠 Abstract: Diagnosis and treatment in modern hospitals are inseparable from advanced medical equipment, which are inseparable from safe and reliable power supply. Many operations often last for several hours, and the consequences of a sudden pow…

js 构造函数

js 构造函数 new Pig() ---- 创建新的空对象 this 指向新对象 this.name name --------修改this&#xff0c;添加新的属性。 最后返回新的对象

C++遍历std::tuple(C++14 ~ C++20)

本文展示了遍历std::tuple的方式&#xff1a; 首先比较容易想到的是利用C14的std::make_index_sequence与std::get结合取值&#xff0c;然后配合std::initializer_list进行包展开&#xff1a; // since C14 class Func0 {template<typename T, typename F, size_t... I>…

bert,transformer架构图及面试题

Transformer详解 - mathor atten之后经过一个全连接层残差层归一化 class BertSelfOutput(nn.Module):def __init__(self, config):super().__init__()self.dense nn.Linear(config.hidden_size, config.hidden_size)self.LayerNorm nn.LayerNorm(config.hidden_size, epscon…

疫情打卡 vue+springboot疾病防控管理系统java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 疫情打卡 vuespringboot 系统有1权限&#xff1a;管理…

vue3+ts-tsconfig.json报错Option ‘importsNotUsedAsValues’

vue3ts-tsconfig.json报错Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption ‘“ignoreDeprecations”: “5.0”’ to silence this error. Use ‘verbatimModuleSyntax’ instead 自我记录 翻译 选项…

网工软考 | 软考到底考哪个证比较好?

最近来咨询软考的同学比较多&#xff0c;对软考有哪些证书&#xff0c;怎么来选择比较困扰&#xff0c;目前刚好是学习的最佳阶段。 本期就统一来解答一下。 01 软考分为五个专业 计算机软件、计算机网络、计算机应用技术、信息系统和信息服务共五个专业&#xff0c;并在各专…

股市杠杆操作是什么意思?从三方面分析

股市杠杆操作是指投资者通过借用资金进行证券交易&#xff0c;以放大投资回报的一种金融工具。这种操作可以使投资者借用额外的资金进行交易&#xff0c;增加投资收益的潜力&#xff0c;但也伴随着更高的风险。下面从三个方面对股市杠杆操作进行分析。 1. 操作原理和优势&#…

Nginx的块、变量以及重定向

目录 绪论 1、location匹配 1.1 常见的Nginx正则表达式 1.2 正则表达式&#xff1a;匹配的是文件内容 1.3 location匹配uri 1.4 location常用的匹配规则 1.5 location优先级 1.6 匹配小结 1.7 生产环境中的匹配规则 2、nginx的内置变量 3、rewrite 3.1 rewrite作用 …

Spring中bean生命周期的PostProcessor的每个方法的作用

可结合这个博客看 https://blog.csdn.net/riemann_/article/details/118500805、https://cloud.tencent.com/developer/article/1409315、https://blog.csdn.net/qq_43631716/article/details/120239438 本篇内容借鉴于chatgtp,应该有错误&#xff0c;仅作方法应用的参考&#…

python爬虫——爬取天气预报信息

在本文中&#xff0c;我们将学习如何使用代理IP爬取天气预报信息。我们将使用 Python 编写程序&#xff0c;并使用 requests 和 BeautifulSoup 库来获取和解析 HTML。此外&#xff0c;我们还将使用代理服务器来隐藏我们的 IP 地址&#xff0c;以避免被目标网站封禁。 1. 安装必…

数据结构与算法-栈(LIFO)(经典面试题)

一&#xff1a;面试经典 1. 如何设计一个括号匹配的功能&#xff1f;比如给你一串括号让你判断是否符合我们的括号原则&#xff0c; 栈 力扣 2. 如何设计一个浏览器的前进和后退功能&#xff1f; 思想&#xff1a;两个栈&#xff0c;一个栈存放前进栈&…

【BERTopic应用 03/3】:微调参数

一、说明 一般来说&#xff0c;BERTopic 在开箱即用的模型中工作得很好。但是&#xff0c;当您有数百万个数据要处理时&#xff0c;使用基本模型处理数据可能需要一些时间。在这篇文章中&#xff0c;我将向您展示如何微调BERTopic中的一些参数并比较它们的结果。让我们潜入。 二…

简单学生信息管理系统springboot,ssm,ssh学生教师java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 简单学生信息管理系统springboot,ssm,ssh 系统有1权限…

【C++】移动构造函数

2023年8月15日 概述 移动构造函数是一个特殊的构造函数&#xff0c;用于从一个对象中移动&#xff08;转移&#xff09;资源到另一个对象&#xff0c;而不是进行复制操作。它通常与右值引用一起使用&#xff0c;以实现高效的资源转移&#xff0c;提高性能。 语法 class MyCla…

操作系统-笔记-第二章

目录 二、第二章——【进程】 1、进程的概念 &#xff08;1&#xff09;PID & PCD 进程控制块 &#xff08;2&#xff09;程序段 & 数据段 &#xff08;3&#xff09;特征 &#xff08;特性&#xff09; property &#xff08;4&#xff09;总结 2、进程的状态 …

8个常用的项目管理工具和方法,干货收藏!

在现代商业环境中&#xff0c;高效的项目管理工具和方法是成功实施项目的关键。随着项目的规模和复杂性不断增加&#xff0c;需要科学的方法和先进的工具来确保项目按时交付、控制成本并保持质量。无论是项目管理新手还是经验丰富的专业人士&#xff0c;了解和掌握一些公认好用…

SCF金融公链新加坡启动会 创新驱动未来

新加坡迎来一场引人瞩目的金融科技盛会&#xff0c;SCF金融公链启动会于2023年8月13日盛大举行。这一受瞩目的活动将为金融科技领域注入新的活力&#xff0c;并为广大投资者、合作伙伴以及关注区块链发展的人士提供一个难得的交流平台。 在SCF金融公链启动会上&#xff0c; Wil…