0 / 0 / 0
Регистрация: 15.05.2024
Сообщений: 1
1

DS18B20&STM32

15.05.2024, 14:52. Показов 205. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер всем!
Помогите с проблемой.
Мне нужно считать с датчика 64 битный ROM код. Датчик DS18B20 подключен к выходу в режиме Open Drain с подтяжкой через резистор к питанию.
структура для выбора порта:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct
{
  uint32_t GPIO;
  GPIO_TypeDef * Port;
  uint16_t status;
  uint8_t  data;
  uint8_t bit;
 
} ds18b20;
 
  HAL_TIM_Base_Start(&htim6);
  str.GPIO=2;
  str.Port=GPIOA;
  str.status=0;
Инициализирую датчик:
в main.c:

C
1
ds18b20_reset(&str);
в ds18b20.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void ds18b20_reset(ds18b20*io)
{
    uint16_t result;
 
    io->Port->ODR &= ~(1<<io->GPIO);//низкий уровень
    ds_delay(&htim6,480);//задержка как минимум на 480 микросекунд
    io->Port->ODR |= 1<<io->GPIO; //высокий уровень
    ds_delay(&htim6,30);//задержка 45 микросекунд
    result = io->Port->IDR & 1<<io->GPIO;
    ds_delay(&htim6,200);//задержка 480 микросекунд
    if(result==1)
    {io->status = 0;}                         //датчик обнаружен
    else
    {io->status = 1;}                         //датчик не обнаружен*/
}
 
void ds_delay(TIM_HandleTypeDef* Timer,uint16_t Imp)
{
 
    Timer->Instance->ARR = Imp;
    __HAL_TIM_ENABLE(Timer);
    while(__HAL_TIM_GET_FLAG(Timer, TIM_FLAG_UPDATE)!=1)
    {
 
    }
    __HAL_TIM_CLEAR_FLAG(Timer, TIM_FLAG_UPDATE);
}
Таймер 6 настроен на мкс.
Он отвечает мне импульсом присутствия. Далее даю команду 0х33 read rom:
в main.c
C
1
ds_write(&str,0x33);
в ds18b20.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ds_write(ds18b20*io,uint8_t byte)
{
    uint8_t i;
    for(i=0;i<8;i++)
   {
       io->Port->ODR &= ~(1<<io->GPIO);                          //потянуть шину к земле
       ds_delay(&htim6,10);                        //ждать 1 микросекунду
       if( (byte&(1<<i))==1<<i)
       {io->Port->ODR |= 1<<io->GPIO; }                 //если передаем 1, то отпускаем шину
       ds_delay(&htim6,45);          //задержка 90 микросекунд
       io->Port->ODR |=  1<<io->GPIO;                          //отпускаем шину
       ds_delay(&htim6,20);
 
    }
}
далее считываю с датчика информацию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      //прочитать 8 байт
      for( j=0; j<8; j++)
      {
 
           uint8_t c,a;
           str.data = 0;
           for(c=0;c<8;c++)
           {
 
             str.bit=0;
             str.Port->ODR &= ~(1<<str.GPIO);                       //потянуть шину к земле
             ds_delay(&htim6,1);
             str.Port->ODR |= 1<<str.GPIO; //отпускаем шину
             ds_delay(&htim6,15);                      //задержка 15 микросекунд
 
 
             str.bit =  (str.Port->IDR & 1<<str.GPIO)>>str.GPIO;            //прочитать шину
             ds_delay(&htim6,45);                         //оставшееся время
             str.data += str.bit << c;
 
           }
 
          RAM[j] =str.data;                          //сохранить его в массиве
      }
Датчик никак не реагирует на посланную команду.
Как решить проблему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2024, 14:52
Ответы с готовыми решениями:

STM32 и DS18B20 по uart
Пытаюсь завести данный датчик у себя, но пока не выходит( датчик запаял по...

STM32: Шина 1-Wire и термометр DS18B20
Ребята вот тут код начал ругаться не могу понять на камне (stm32f051) оно не работает а в остальных...

STM32: FatFS & USB Host & Flash - проблемы с чтением/записью
Уважаемые гуру! Ломаю голову, но найти разумное объяснение симптомам не могу. Есть...

Stm32 & Duktape
Здравствуйте, пытаюсь запустить Duktape на контролере stm32f303zet. В папку Inc добавила файлы...

Задержка по таймеру Stm32&AVR в 1мксек
Как мне лучше настроить таймер на 1 мкрсек.?

1
Модератор
Эксперт по электронике
8918 / 6686 / 919
Регистрация: 14.02.2011
Сообщений: 23,552
15.05.2024, 17:34 2
Цитата Сообщение от nybb Посмотреть сообщение
io->Port->ODR &= ~(1<<io->GPIO);                          //потянуть шину к земле
у STMа есть специальные регистры GPIOx_BSRR( у 103 еще GPIOx_BRR )
https://dimoon.ru/obuchalka/st... -gpio.html
в приведённой тобой конструкции возможны коллизии, поскольку операция не атомарно
Цитата Сообщение от nybb Посмотреть сообщение
for(c=0;c<8;c++)
           {
str.bit=0;
при каждой итерации цикла str.bit обнуляется

Добавлено через 5 минут
Цитата Сообщение от nybb Посмотреть сообщение
void ds_delay(TIM_HandleTypeDef* Timer,uint16_t Imp)
если уж пользуешься HAL ом, то посчему не используешь HAL_Delay
0
15.05.2024, 17:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2024, 17:34
Помогаю со студенческими работами здесь

Общение с барометром MS5540 на STM32 (Arduino to STM32)
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не тут то было....

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка сигналов +...

DS18b20
Проблема заключается в том, что в переменную, в которую записывается окончательный результат...

DS18b20 + STM32F100 = ?
Доброго всем времени суток. Пытаюсь запустить датчик DS18b20 на МК ST32F100. Взял библиотеки,...

STM32F103+DS18b20
Добрый день!!! Плиз подскажите где у меня ошибка!!!! Написал библиотеку для работы с ds18b20 однако...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru