一、分析AHT10 技术手册
(一)温湿度传感器信息(不太重要)
1.简介
2.应用范围
3.传感器性能
(二)温湿度传感器信息(重要)
1.接口
2.串行时钟线SCL
3.串行数据线SDA
4.I2C时序
5.AHT10指令
6.状态位说明
7.读取温湿度流程
(1)触发测量数据
(2)读取温湿度
8.采集数据处理
二、思路
(类似于I2C读写EEPROM,所以整个框架图很相似)
(先上电等待40ms,然后进入空闲状态,接着进行读操作,根据都回来的状态字节的bit[3]来判断是否需要初始化。如果bit[3]=0则需要进行初始化(发送写控制字节,0xE1命令,初始化参数0x08,0x00)如果是bit[3]=1则不需要初始化,可以直接开始触发测量(发送控制字节,0xAC命令,触发参数0x33,0x00),测量完成之后等待80ms(本来是应该再进行读操作,判断状态字节的bit[7]查看是否已经测量完成设备处于空闲状态。不过感觉挺麻烦,延迟80ms应该够了,所以没进行这次读状态操作),之后进行读温湿度操作(发送读控制字节))
(一)温湿度采集系统框架图
模块说明:
1.顶层模块–aht10
aht10(
input clk ,
input rst_n ,
output i2c_scl,
inout i2c_sda,
output tx
);
2.控制模块–controller
controller(
input clk ,
input rst_n ,
input busy ,
output i2c_scl ,
inout i2c_sda ,
output [7:0] data_tx,
output data_tx_vld
);
控制aht10_rw和i2c_interface数据传输,接收uart_tx模块的busy信号,输出data_tx和data_tx_vld给uart_tx模块,传输i2c时钟和数据。
3.AHT10读写模块–aht10_rw
aht10_rw(
input clk ,
input rst_n ,
input busy ,
output req ,
output [3:0] cmd ,
output [7:0] wr_data ,
input [7:0] rd_data ,
output reg [7:0] dout ,
output reg dout_vld ,
input done ,
input slave_ack
);
根据状态对i2c接口模块发送请求、命令(读、写、起始、停止)、发送数据。实现控制i2c接口模块对aht10传感器进行读写操作。处理接收数据并发送给uart_tx模块。
数据处理
(我直接在这个模块中处理了数据)
思路:
(1)按字节将数据存入[19:0]RH和[19:0]TP中,过滤掉状态字节,将后面的温湿度字节前2.5字节存入[19:0]RH,后2.5字节存入[19:0]TP。
//数据处理
//RH、TP
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
RH <= 1'b0;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 2) begin
RH[19:12] <= rd_data;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 3) begin
RH[11:4] <= rd_data;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 4) begin
RH[3:0] <= rd_data[7:4];
TP[19:16] <= rd_data[3:0];
end
else if(state_c == READ_WAIT && cnt_byte == 5) begin
RH <= RH;
TP[15:8] <= rd_data;
end
else if(state_c == READ_WAIT && cnt_byte == 6) begin
RH <= RH;
TP[7:0] <= rd_data;
end
end
(2)按公式处理数据
wire [39:0] RH_r;
wire [39:0] TP_r;
assign RH_r = (RH * 10000)>>20;
assign TP_r = ((TP * 20000)>>20) - 5000;
(3)将数据转换为ASCII码
wire [7:0] data_r [15:0];//寄存湿度、温度的个十百千位
assign data_r [0] = 8'b01010010 ;//R
assign data_r [1] = 8'b01001000 ;//H
assign data_r [2] = 8'b00111010 ;//:
assign data_r [3] = RH_r /1000 + 8'b0011_0000;//湿度千位
assign data_r [4] = RH_r /100 %10 + 8'b0011_0000;//湿度百位
assign data_r [5] = 8'b00101110 ;//.
assign data_r [6] = RH_r /10 %10 + 8'b0011_0000;//湿度十位
assign data_r [7] = RH_r %10 + 8'b0011_0000;//湿度个位
assign data_r [8] = 8'b01010100 ;//T
assign data_r [9] = 8'b01010000 ;//P
assign data_r [10] = 8'b00111010 ;//:
assign data_r [11] = TP_r /1000 + 8'b0011_0000;//温度千位
assign data_r [12] = TP_r /100 %10 + 8'b0011_0000;//温度百位
assign data_r [13] = 8'b00101110 ;//.
assign data_r [14] = TP_r /10 %10 + 8'b0011_0000;//温度十位
assign data_r [15] = TP_r %10 + 8'b0011_0000;//温度个位
4.I2C接口模块–i2c_interface
i2c_interface(
input clk ,
input rst_n ,
//主机发送数据
input req ,//请求
input [3:0] cmd ,//i2c接口指令,控制状态
input [7:0] din ,//i2c接口需要发送的数据
//主机接收数据
output [7:0] dout ,//i2c接口接收的数据
output done ,//完成一次读/写指令
output slave_ack ,//主机给从机的应答
//从机接收数据
output i2c_scl ,//i2c时钟
input i2c_sda_i , //i2c给主机发数据
output i2c_sda_o ,//主机给从机发数据
output i2c_sda_oe
);
根据aht10_rw模块的请求、命令进行读写操作,满足i2c读写时序,产生i2c时钟,控制i2c时钟线和数据线进行数据传输。
(二)状态转移图
1.AHT10_RW模块状态转移图
(1)状态说明:
WAIT:上电等待40ms
IDLE:空闲状态
STATU、STATU_WAIT:读状态字节状态及其等待状态
INIT、INIT_WAIT:初始化状态及其等待状态
START、START_WAIT:触发状态及其等待状态
READ、READ_WAIT:读温湿度数据状态及其等待状态
DONE:结束状态
(2)各个状态字节数:
读状态 读控制字节(8’b0111_0001) 读状态字节 共两字节
初始化 写控制字节(8’b0111_0000) 写命令(8’b11100001) 写两个参数(8’b00001000、8’b00000000) 共四字节
触发测量 写控制字节(8’b0111_0000) 写命令(8’b10101100) 写两个参数(8’b00110011、8’b00000000) 共四字节
读数据 读控制字节(8’b0111_0001) 读六字节 共七字节
(3)状态转移条件:
2.I2C_interface模块状态转移图
状态跳转条件:
三、实验结果
(一)实验效果
(二)仿真
1、状态跳转仿真
(1)读状态、初始化状态
(2)读状态、触发测量状态
(3)读温湿度状态
2、数据处理仿真
3.RTL视图