1、驱动流程

    买的是模块化的ds18b20不用自己加电阻,在尝试驱动过程中有试过官方IDF的API也试过alios things的API,虽然说失败了,但还是记录一下,整理一下驱动ds18b20的流程

    首先是对ds18b20的初始化操作,或者说是建立连接的过程。在这里首先设置gpio引脚和为输入输出等gpio配置;然后先拉高总线,再拉低总线480us~960us;随后再拉高总线,接着识开始检测总线电平,如果总线被再次拉低了则证明通信建立成功。

    然后是读入与写入,其中写入主要是写入对ds18b20的控制命令,读入就是读入传感器信息了。读入或者写入时都是先拉低总线1us,然后再将信息一位一位地读取或是设置,每位的读入/写入周期为60us~120us

    最后就是对数据的拼接啦

 

整个流程其实看起来很简单,但是我在第一步建立通信就始终通不过了,在我先拉低再拉高总线,等多久都等不到总线被拉低。尝试过反复换gpio口和换gpio输入输出配置,始终无法解决问题,都开始怀疑是不是元件坏掉了。

2、代码

代码以及思路大部分是参考另一篇esp8266的文章:ESP8266--驱动DS18B20

其中自己改的部分主要集中在建立通信:

uint8_t Ds18b20Init() {
    int i;
	gpio_config_t temp_cfg = {
		GPIO_SEL_19,
		GPIO_MODE_INPUT_OUTPUT,
		GPIO_PULLUP_DISABLE,
		GPIO_PULLDOWN_DISABLE,
		GPIO_INTR_DISABLE
	};
	ESP_ERROR_CHECK(gpio_config(&temp_cfg));
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 1));
	ets_delay_us(666);
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 0));
	ets_delay_us(666);
	ESP_ERROR_CHECK(gpio_set_level(GPIO_NUM_19, 1));
	printf("%d\n", gpio_get_level(GPIO_NUM_19));
	while (gpio_get_level(GPIO_NUM_19))
	{
		ets_delay_us(20);
		i++;
		if (i > 15){
			printf("init failed!\n");
			return 0;
		}
	}
    printf("init success!\n");
	return 1;	//初始化成功
}

其中微秒延时用的是ets_sys.h中的ets_delay_us,这个头文件可以在studio关于esp32的API文件夹里找到

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐