Примеры использования драйвера DS18B20 от CooCox для STM32 (несколько датчиков на линии)

Здравствуй, хабраюзер!

Пытаюсь завести драйвер DS18B20 от CooCox для STM32 www.coocox.org/driver_comp/ds18b20-temperature-driver-using-1-wire-c12.html.
Примеров использования нигде не нашел.

Такой код, собирается, но не работает:
#include "xhw_types.h"
#include "xsysctl.h"
#include "xgpio.h"
#include "xcore.h"
#include "xhw_memmap.h"
#include "DS18B20.h"


void pinSet()
{
}

int main(void)
{
// Set System Clock
xSysCtlClockSet(24000000, xSYSCTL_OSC_MAIN | xSYSCTL_OSC_INT);


tDS18B20Dev dev;
dev.ulPort = xGPIO_PORTB_BASE;
dev.ulPin = xGPIO_PIN_3;
dev.PinSet = pinSet;
DS18B20Init(&dev);

xtBoolean status = DS18B20Reset(&dev);
DS18B20ROMSkip(&dev);
DS18B20TempConvert(&dev);

float temp = 0.0;

status = DS18B20Reset(&dev);
DS18B20ROMSkip(&dev);
DS18B20TempRead(&dev, &temp);

    while(1)
    {
    }
}


Помогите с рабочим примером, пожалуйста, или с рабочей библиотекой для нескольких датчиков на линии.
  • Вопрос задан
  • 11717 просмотров
Пригласить эксперта
Ответы на вопрос 7
@DROS
Хм, а разве не нужно опрос датчиков сунуть как раз в цикл while(1) {} ???
Ответ написан
Ocelot
@Ocelot
1. Что возвращает DS18B20Reset()? Устройства на линии вообще отвечают на импульс сброса?

2. С тактированием ничего не напутали? Контроллер работает именно на той частоте, которая нужна? Если тайминги будут неправильными, 1-wire работать не будет.

Идеально было бы взять осциллограф и посмотреть, что именно творится на линии. Будет хоть ясно, то ли лыжи не едут... то ли проблема в опросе датчика, то ли в интерпретации результата.
Ответ написан
Комментировать
@smartly
Я не вижу здесь задержки между стартом преобразования и чтением результата. Ну и SkipRom не будет работать с несколькими датчиками. Сколько их подключено?
Ответ написан
Комментировать
N0Good
@N0Good
В своё время писал на BASIC (Жуть! Требование языка было связано с используемым ПО.) реализацию функции поиска устройств на линии 1-wire.

Если заранее не знаете ROM кодов устройств — то необходимо обязательно реализовывать поиск. И, получив ROM_Code делать дальше. Если же знаешь, то вместо DS18B20ROMSkip нужно использовать (я точно функции не знаю, но скорее всего будет что-то подобное) DS18B20ROMSelect(ROM_Code). Тоесть функция выбора устройства на линии.
Ответ написан
Комментировать
N0Good
@N0Good
А если этого не делать, то естественно с несколькими датчиками работать не будет. Ведь выполняя DS18B20ROMSkip вы пропускаете выбор устройства на линии (тоесть изначально предполагая, что устройство одно).

Кстати, функция поиска может быть уже реализована в вашей библиотеке, почитайте.
Ответ написан
Комментировать
@Eddy_Em
Рабочий пример: habrahabr.ru/post/161863/ (см. ссылочку на сосфорж).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы