以verilog和DHT11为例,说明如何看手册写代码

相信大家刚捣鼓电子玩意的时候,商家会发来很多天书一样的“XX技术手册”,这个器件怎么接收信号,那个信号如何发送...对于初学者可能还是有一点难。

那么我就结合手册简单写一段代码,来说明如何阅读这些手册。(代码我只好截图了,牛客代码块没verilog)

----------------------

引脚定义

----------------------

看表格第二行,我们先讲一下串行数据。

器件的引脚往往相当有限,如果我们让传感器发送一个8位数据,有什么办法只占用一个引脚吗

串行通信:把一个多位数据分开发送,一个时间单位接收一位数据。

并行通信:有n位数据就用n位引脚,好处是低延时,也精确,但太占用引脚了。

这是一个简单说明串行通信的代码。(省略了一些东西,这只是简单说明核心功能)

然后单总线的意思是,数据总线同时只能一个机器占用,mcu往dht11发信号,mcu收dht11的信号,这两件事肯定不能同时进行。

----------------------

通信协议(一定要严格按手册说得来哦)

----------------------



这是通讯过程大致示意图

(简单来说,这就是机器之间传输信号的格式,是器件出厂就既定的,我们只要遵守)

具体的过程(下图MCU指的是微控制器,单片机就属于此类玩意)

初始 0:总线空闲(要拉高,高电平,板子上一般都接个上拉电阻)

1:主机把总线拉低(这是发送开始信号,时间>18ms,这样确保DHT11能收到信号)

2:主机把总线拉高(20-40us)(等待DHT11切换模式,把开始信号发送过去以后,DHT11从低功耗模式进入高速工作模式,这显然需要时间,你信号发过去他要等会才能响应)。

3:DHT11拉低总线,发送响应信号给主机(80us)

4:DHT拉高总线,等待80us(下一步就是发送数据了)

5:DHT11发送50us低电平

6:DHT11发送26-28us高电平(这代表0)或者70us高电平(这代表1)

7:DHT发送50us低电平(两个位的数据之间要等50us低电平呀)

8:DHT发送下一位数字.......

END:发送完全部八位数据,DHT11先拉低总线50us,再释放总线,最后上拉电阻会拉高总线的。

----------------------

数据格式(当然也要严格按手册说来哦)

----------------------

这说明DHT11单次处理的信号是八位的。

可知,一次完整通信是五个数据拼接而成的。(DHT11进入发送状态,会完整把这些数据都发出来,中间不停)

PS:通信中有一段数据,一般拿来做校验用,至于为什么有校验数据,那是因为实际电路会受各种干扰,导致很多玄学问题。

所以工程师用校验数据(放在数据段某个位置),来确保这个数据是正确的,可以被收发处理的(如果数据不对咱就pass)

----------------------

由通信协议写状态机

----------------------

状态机:简单来说,我们把机器通信过程归纳为几个状态,这样把全机器通信过程封装成几个独立的代码块,然后把状态作为标志位去调用不同的代码。

下列代码里的parameter和上面通信协议提到的过程,可以一一对应

这些是其他变量

以及两个必要的always

接下来是状态机!!!!!

这个是最重量级的,注释我尽量写的详实了

最后S_DELAY状态没写,其实这一步就很看您个人意愿了,可以直接开始下一个周期,我不再赘述

----------------------

校验数据

----------------------

校验模块

----------------------

关于其它

----------------------

这里简单陈述了一下如何根据手册写代码,我们发现技术手册其实给了非常详尽的数据。

此外手册还会有很详尽的硬件数据,比如极限工作温度什么

总之,请一定认真阅读手册

全部评论
帖子里由个数据没注明,这里POWER_ON_NUM就是采样周期(通常不超过1s),我这里也定为1s。
点赞 回复 分享
发布于 2023-05-09 16:06 山东

相关推荐

评论
6
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务