Например TDA7294

Форум РадиоКот :: Просмотр темы - ChibiOS и onewire ds1990
Форум РадиоКот
https://radiokot.ru/forum/

ChibiOS и onewire ds1990
https://radiokot.ru/forum/viewtopic.php?f=59&t=155058
Страница 1 из 1

Автор:  WaL97 [ Вс май 20, 2018 18:43:31 ]
Заголовок сообщения:  ChibiOS и onewire ds1990

Исходные данные:
в роли программиста полный нуб в этом деле, в роли ide - eclipse, в роли контроллера плата с stm32f103c8t6 на борту, на котором крутится RTOS ChibiOS.

Нужно читать код с DS1990A(ключ-таблетка).
однопроводный интерфейс многие реализуют через UART. Попробовал сделать и я так.

Сначала отправляем reset - для этого на скорости 9600 бод отправляем в порт 0xF0. Если пришло что-то другое, значит ответ есть.
Потом посылаем команду READROM (0x33). Для этого на скорости 115200 посылаем 8 байт. 0x00 - 0, 0xFF - 1.

Это я ничего не напутал? Все так? После этого опять пишем в порт 0xFF, и если вместо 0xFF пришло 0,то и slave устройство отправляло 0.

Значит, если посылать reset, то результат есть. делаю я это так:

Код:
  static UARTConfig uart_cfg_1 = {
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    9600,
    0,
    USART_CR2_LINEN,
    0
  };

  uint8_t reset_onewire=0xF0;

  while(1)
  {
    uartStart(&UARTD1, &uart_cfg_1);
    uartStartSend(&UARTD1,1 , &reset_onewire);
    chThdSleepMilliseconds(2000);
  }


Результат смотрю терминалом. Если ключ подключен получаю E0. Если не подключен - F0.

А дальше не получается ничего.
Нужно перезапустить драйвер с другим конфигом, на скорости 115200. А это уже требует несколько миллисекунд, что очень долго.
Подозреваю, что ус-во не отвечает мне именно из-за этого, но может делаю что-то вообще не так.
Есть чибиосоводы? Кто-то сможет помочь? Я готов и заплатить, если мне кто-то сделает этот кусок, но не откажусь и от помощи.

Автор:  Мурик [ Вс май 20, 2018 19:19:28 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

Посмотрите как сделано в 1-Wire библиотеках, например этой. http://www.cyberforum.ru/blogs/204791/blog5170.html
Функция OW_Reset.
Код:
void Usart_Cnf(uint32_t Rate) // Настройка USART.
{
    USART_InitTypeDef Usart;

    Usart.USART_BaudRate = Rate;
    Usart.USART_WordLength = USART_WordLength_8b;
    Usart.USART_StopBits = USART_StopBits_1;
    Usart.USART_Parity = USART_Parity_No;
    Usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    Usart.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(OW_USART, &Usart);
}

uint8_t OW_Reset(void) // Сброс 1-Wire.
{
    uint8_t Res;

    Usart_Cnf(9600);

    uint8_t x=0xF0;
    Res = OW_BitRW(&x);

    if (Res == OW_OK)
    {
       if (x == 0xF0) Res = OW_NO_DEVICE;
       else if ((x == 0x00) || (x == 0xFF)) Res = OW_ERROR;
    }

    Usart_Cnf(115200);
    return Res;
}

Автор:  Аlex [ Вс май 20, 2018 19:19:55 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

WaL97 писал(а):
Есть чибиосоводы?
А причём тут ОС ? :dont_know:

WaL97 писал(а):
А это уже требует несколько миллисекунд, что очень долго.
Устройству пофиг на эти миллисекунды после сброса.
Почитали бы, что-ли, для начала документацию на протокол...

Автор:  WaL97 [ Вс май 20, 2018 20:12:44 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

Устройству пофиг на эти миллисекунды после сброса.


Код:
uint8_t reset_onewire=0xF0;
  uint8_t readrom_cmd[72]=
                         {0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF, //0x33
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //чтение
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  while(1)
  {

    uartStart(&UARTD1, &uart_cfg_1);
    chThdSleepMilliseconds(3);
    uartStartSend(&UARTD1, 1, &reset_onewire);
    chThdSleepMilliseconds(3);
    uartStart(&UARTD1, &uart_cfg_2);
    chThdSleepMilliseconds(3);
    uartStartSend(&UARTD1, 72, &readrom_cmd[0]);

    chThdSleepMilliseconds(2000);
  }


Терминал в таком случае независимо от того, подключен ключ или нет читает

Цитата:
00
30 30 31 33 38 37 20 00
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF

Автор:  Аlex [ Вс май 20, 2018 21:23:32 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

Вы вообще, о чём ? Какой терминал ? Что читает ? Куда читает ? ...
Судя по тексту из Вашего первого поста, проблем нет до этого момента :
WaL97 писал(а):
А дальше не получается ничего.
Нужно перезапустить драйвер с другим конфигом, на скорости 115200. А это уже требует несколько миллисекунд, что очень долго.
Повторюсь. После ресета, устройство может ждать хоть 100 лет следующих команд. По этому, несколько миллисекунд - это не очень долго.
Таймауты нужно выдерживать только в пределах тайм-слотов.

PS: Повторюсь №2. Почитайте протокол 1-Wire, чтобы такие элементарные вещи не вводили Вас в заблуждение и Вы не гадали - "может из-за этого", а "может из-за того" ... Ну и вопросы чтобы задавали адекватные, а не писали сумбур, который можно разгадать только экстрасенсам.

Автор:  WaL97 [ Пн май 21, 2018 00:30:01 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

http://www.gaw.ru/html.cgi/txt/app/micr ... avr318.htm опираюсь на это.

Цитата:
Вы вообще, о чём ? Какой терминал ? Что читает ? Куда читает ? ...


Сейчас подключаюсь таким образом и на компьютере в терминале смотрю, что отправляет микроконтроллер и какие изменения вносит ds1990.
Изображение

Цитата:
Повторюсь. После ресета, устройство может ждать хоть 100 лет следующих команд. По этому, несколько миллисекунд - это не очень долго.
Таймауты нужно выдерживать только в пределах тайм-слотов.

Спасибо, это понял. Значит проблема не в этом. иду дальше.

Делаю ресет путем отправки на юарт на скорости 9600 байта 0хF0. В терминале вижу, как таблетка реагирует.
Затем я формирую массив из 72 байт
первые 8 байт 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00 - это команда 0х33 - ReadRom
остальные 64 байта идут следом для чтения ответных 8 байт,которые пошлет таблетка.


P.S. Вроде проблему решил, пока писал ответ на форум.
В общем, то ли большой массив бьется, то ли буфер переполняется. в итоге на uart приходила уже не та команда, которая отправлялась.
Причем при массиве длиной 72 байта и при массиве длиной 64 байта бьются первые восемь.
Пока проблему решил отправляя пачками по 8 байт. Так как мне сверхскорости не нужны, возможно так и оставлю
Код:
while(1)
  {
    uartStart(&UARTD1, &uart_cfg_1);
    uartStartSend(&UARTD1, 1, &reset_onewire);
    chThdSleepMilliseconds(3);
    uartStart(&UARTD1, &uart_cfg_2);
    uartStartSend(&UARTD1, 8, &readrom[0]);
    for (int i=0;i<8; i++)
    {
      chThdSleepMilliseconds(1);
      uartStartSend(&UARTD1, 8, &readrom_cmd[0]);
    }
    chThdSleepMilliseconds(2000);

  }


Вложения:
Безымянный.png [56.21 KiB]
Скачиваний: 625

Автор:  arkhnchul [ Пн май 21, 2018 14:17:46 ]
Заголовок сообщения:  Re: ChibiOS и onewire ds1990

Нужно перезапустить драйвер с другим конфигом, на скорости 115200. А это уже требует несколько миллисекунд, что очень долго.

зачем его целиком переинициализировать? Достаточно один регистр BRR перезаписать.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/