如上图,需要DQ发送低电平,时间为480us到960us之间。
如下程序:
+ 查看代码
reset_state: begin //DQ output 0 600us
enable_read = 0; //DQ is output
DQ_reg = 0; //DQ output 0
if(delay_time >= 30000 - 1 ) //delay 600us
begin
delay_time_next = 'd0;
state_next = read_pulse_state;
end
else
delay_time_next = delay_time + 1'b1;
end
还是设定enable_read为0,DQ作为输出。然后DQ_reg赋值为0。那么DQ就输出0了。规定时间在480us到960us之间。这里
就设定600us。然后通过delay_time_next和delay_time计数就可以了。
计时到600us后,就跳转到读取脉冲响应状态。然后清零计数器。以便下一状态计数。
第三个状态:读取存在脉冲。
在复位之后,需要读取存在脉冲。即判断外部有DS18B20器件。时序就是复位之后,DQ作为输入。然后在最大60us之后,外
部DS18B20会把DQ给置低。保持一段时间,然后在释放总线。(注意DQ是要接上拉电阻的,所以释放总线后,总线就输出
高电平)。
然后这个读取过程至少要480us。
以下程序:
+ 查看代码
read_pulse_state: begin
enable_read = 1; //DQ is input
DQ_reg = 1;
if(delay_time == 3500 - 1) //delay 70us
ack_next = DQ;
if(delay_time >= 25000 - 1 ) //delay 500us
begin
delay_time_next = 0;
//if receive pulse ack, write rom command, otherwise there is no ds18b20 is bus,go idle_state
if(ack == 0)