ChibiOS и onewire ds1990

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
WaL97
Потрогал лапой паяльник
Сообщения: 342
Зарегистрирован: Чт июн 30, 2011 10:10:23
Откуда: лютая Россия
Контактная информация:

ChibiOS и onewire ds1990

Сообщение WaL97 »

Исходные данные:
в роли программиста полный нуб в этом деле, в роли 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. А это уже требует несколько миллисекунд, что очень долго.
Подозреваю, что ус-во не отвечает мне именно из-за этого, но может делаю что-то вообще не так.
Есть чибиосоводы? Кто-то сможет помочь? Я готов и заплатить, если мне кто-то сделает этот кусок, но не откажусь и от помощи.
[b]— Да не боись, всего двенадцать вольт… и восемьсот ампер.[/b]
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ChibiOS и onewire ds1990

Сообщение Аlex »

WaL97 писал(а):Есть чибиосоводы?
А причём тут ОС ? :dont_know:
WaL97 писал(а):А это уже требует несколько миллисекунд, что очень долго.
Устройству пофиг на эти миллисекунды после сброса.
Почитали бы, что-ли, для начала документацию на протокол...
WaL97
Потрогал лапой паяльник
Сообщения: 342
Зарегистрирован: Чт июн 30, 2011 10:10:23
Откуда: лютая Россия
Контактная информация:

Re: ChibiOS и onewire ds1990

Сообщение WaL97 »

[uquote="Аlex",url="/forum/viewtopic.php?p=3381575#p3381575"]Устройству пофиг на эти миллисекунды после сброса.[/uquote]

Код: Выделить всё

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
[b]— Да не боись, всего двенадцать вольт… и восемьсот ампер.[/b]
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ChibiOS и onewire ds1990

Сообщение Аlex »

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

PS: Повторюсь №2. Почитайте протокол 1-Wire, чтобы такие элементарные вещи не вводили Вас в заблуждение и Вы не гадали - "может из-за этого", а "может из-за того" ... Ну и вопросы чтобы задавали адекватные, а не писали сумбур, который можно разгадать только экстрасенсам.
Реклама
WaL97
Потрогал лапой паяльник
Сообщения: 342
Зарегистрирован: Чт июн 30, 2011 10:10:23
Откуда: лютая Россия
Контактная информация:

Re: ChibiOS и onewire ds1990

Сообщение WaL97 »

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 КБ) 677 скачиваний
[b]— Да не боись, всего двенадцать вольт… и восемьсот ампер.[/b]
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: ChibiOS и onewire ds1990

Сообщение arkhnchul »

[uquote="WaL97",url="/forum/viewtopic.php?p=3381530#p3381530"]Нужно перезапустить драйвер с другим конфигом, на скорости 115200. А это уже требует несколько миллисекунд, что очень долго.[/uquote]
зачем его целиком переинициализировать? Достаточно один регистр BRR перезаписать.
Ответить

Вернуться в «ARM»