Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

ChibiOS и onewire ds1990

Вс май 20, 2018 18:43:31

Исходные данные:
в роли программиста полный нуб в этом деле, в роли 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. А это уже требует несколько миллисекунд, что очень долго.
Подозреваю, что ус-во не отвечает мне именно из-за этого, но может делаю что-то вообще не так.
Есть чибиосоводы? Кто-то сможет помочь? Я готов и заплатить, если мне кто-то сделает этот кусок, но не откажусь и от помощи.

Re: ChibiOS и onewire ds1990

Вс май 20, 2018 19:19:28

Посмотрите как сделано в 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;
}

Re: ChibiOS и onewire ds1990

Вс май 20, 2018 19:19:55

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

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

Re: ChibiOS и onewire ds1990

Вс май 20, 2018 20:12:44

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


Код:
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

Re: ChibiOS и onewire ds1990

Вс май 20, 2018 21:23:32

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

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

Re: ChibiOS и onewire ds1990

Пн май 21, 2018 00:30:01

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) Скачиваний: 624

Re: ChibiOS и onewire ds1990

Пн май 21, 2018 14:17:46

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

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