Форум РадиоКот 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 писал(а): Есть чибиосоводы? А причём тут ОС ? 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 писал(а): А дальше не получается ничего. Повторюсь. После ресета, устройство может ждать хоть 100 лет следующих команд. По этому, несколько миллисекунд - это не очень долго.Нужно перезапустить драйвер с другим конфигом, на скорости 115200. А это уже требует несколько миллисекунд, что очень долго. Таймауты нужно выдерживать только в пределах тайм-слотов. 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); }
|
Автор: | 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/ |