手里有个温湿度传感器,想用STM32读取,但习惯性用FPGA来试试了。
这个传感器长这样:
引脚定义:
AM2302的供电电压为3.3-6V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
DATA 用于微处理器与 AM2302之间的通讯和同步,采用单总线数据格式,一次通讯时间5ms左右 ,具体格式在下面说明,当前数据传输为40bit,高位先出。
数据格式: 40bit数据=16bit湿度数据+16bit温度数据+8bit校验和
例子: 接收40bit数据如下:
0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
湿度数据 温度数据 校验和
湿度高8位+湿度低8位+温度高8位+温度低8位=的末8位=校验和
例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110
湿度=65.2%RH 温度=35.1℃
当温度低于0℃时温度数据的最高位置1。
例如:-10.1℃表示为1000 0000 0110 0101
用户主机(MCU)发送一次开始信号后,AM2302从低功耗模式转换到高速模式,等待主机开始信号结束后,AM2302发送响应信号,送出40bit的数据,并触发一次信号采集。(注:主机从AM2302读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,请连续读两次以获得实时的温湿度值)
空闲时总线为高电平,通讯开始时主机(MCU)拉低总线1~10ms后释放总线,延时20-40us后主机开始检测从机(AM2302)的响应信号。
从机的响应信号是一个80us左右的低电平,随后从机在拉高总线80us左右代表即将进入数据传送。
高电平后就是数据位,每1bit数据都是由一个低电平时隙和一个高电平组成。低电平时隙就是一个50us左右的低电平,它代表数据位的起始,其后的高电平的长度决定数据位所代表的数值,较长的高电平代表1,较短的高电平代表0。共40bit数据,当最后一Bit数据传送完毕后,从机将再次拉低总线50us左右,随后释放总线,由上拉电阻拉高。
数字1信号表示方法如下:
数字0信号表示方法.如下所示:
FPGA设计:
协议很简单。。用状态机实现的,写的很随意。。。。
很多变量都是随意命名的,因为当时就是测试一下这个传感器,发现花了一晚上,于是写博客mark一下,后续把代码整理优化后再贴上来吧。
读出来的数据:02E0009C7EH
湿度:73.6%RH 温度:15.6°-----------终于冬天走了
MARK:
(1)两次连续读取的时间不能太短,之前太短的时候,只能读取一次,第二次就失败了,因为应答失败。
http://wenku.baidu.com/link?url=mRDG_-EzxonXzYZf57ykIQf3oFV056cUzh8rT2mqaEbE9DMOgkn8MkxXHKNZ8VbIaFw1pPBoHVRrKUMqz5HF6NwIi3WQzhzBRCT1T2KZLS3
这个文章中说要2s,其实不用2s。
接下来,用STM32外接12864做菜单显示,并将数据发给上位机,上位机打算用java来做,慢慢来吧。朋友给取了一个高大上的名称:智能温室大棚,用LCD显示温湿度,用户可以通过按键进去菜单,在里面可以设置温湿度报警值,然后把温湿度通过串口(网口)实时的发送到电脑,在电脑上用java写一个上位机,绘制温度曲线~~~~