关于detect 函数的最后为什么不需要拉低电平有点疑问?
// =====> 疑问的标签是这个
#include "imx6ull.h"
#define DS18B20_HEIGHT_LEVEL 1
#define DS18B20_LOW_LEVEL 0
void ds18b20_pin_init(void)
{
/*101 GPIO5_IO02*/
IOMUXC_SW_MUX_CTL_PAD_GPIO5_IO02 &= ~(0xf << 0); // 位清零
IOMUXC_SW_MUX_CTL_PAD_GPIO5_IO02 |= (0x5 << 0);
return;
}
// read
void ds18b20_pin_input(void)
{
GPIO5->GDIR &= ~(1 << 2);
return;
}
// write
void ds18b20_pin_output(void)
{
GPIO5->GDIR |= (1 << 2);
return;
}
void ds18b20_write_level(int level)
{
if (level){
GPIO5->DR |= (1 << 2);
}else{
GPIO5->DR &= ~(1 << 2);
}
return;
}
int ds18b20_read_level(void)
{
int level;
level = GPIO5->PSR & (1 << 2);
return level ? 1 : 0;
}
int ds18b20_detect(void)
{
int level;
ds18b20_pin_output();
ds18b20_write_level(DS18B20_HEIGHT_LEVEL);
gpt_delay_us(10);
/*
*During the initialization sequence the bus master transmits (TX)
*the reset pulse by pulling the 1-Wire bus low for a minimum of 480us.
*/
ds18b20_write_level(DS18B20_LOW_LEVEL);
gpt_delay_us(550);
/*releases the bus 通过状态转换来释放资源*/
ds18b20_write_level(DS18B20_HEIGHT_LEVEL);
ds18b20_pin_input();
/*waits 15us to 60us */
gpt_delay_us(70);
level = ds18b20_read_level();
/*presence pulse by pulling the 1-Wire bus low for 60us to 240us.*/
//=====> 这里的不是说拉低1-write? 在经过wait15us-60us的等待上拉电阻会将它设计为高电平在这里不需要重新设计回低电平吗?
gpt_delay_us(200);
if (level == DS18B20_HEIGHT_LEVEL){
uart_printf("Detect ds18b20 failed.\r\n");
return -1;
}else {
uart_printf("Detect ds18b20 succeessed.\r\n");
}
return 0;
}
11
收起
正在回答
1回答
不需要了,管脚设为输入模式后,上拉电阻会把管脚自动拉高,接下来拉低是DS18b20给出的响应的信号,时间是这个信号的持续时间。
物联网/嵌入式工程师
- 参与学习 394 人
- 提交作业 22954 份
- 解答问题 1165 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星