以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状态没写,其实这一步就很看您个人意愿了,可以直接开始下一个周期,我不再赘述
----------------------
校验数据
----------------------
校验模块
----------------------
关于其它
----------------------
这里简单陈述了一下如何根据手册写代码,我们发现技术手册其实给了非常详尽的数据。
此外手册还会有很详尽的硬件数据,比如极限工作温度什么
总之,请一定认真阅读手册
查看8道真题和解析