|
|
  |
1-wire Accelerated ROM search, нужна помощь |
|
|
|
Nov 29 2011, 09:04
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Привет! Кто работал с интерфейсом, помогите понять как работает алгоритм. Прикрутил далласовскую корку 1-wire master к своему проекту на fpga, пытаюсь сделать алогоритм автоопределения. Для корки есть описание Synthesizable 1-Wire Bus Master. Также нашел app-note 137 с алгоритмом определения. Но, ничерта там не понял, уж очень мутная стейт машина нарисована, да еще и для битовых операций, а у меня корка сразу байт выплевывает за один проход. Что представляет из себя мастер: это корка с набором команд и 8ми рарядной шиной данных. Для реализации одной итерации автоопределения, нужно подать корке команду сброса, затем перевести ее в режим автоопределения, после чего 16 раз записать байт с маской поиска, и считать 16 байт результата. После этого 16 полученных байт разбираются на определенный ID код (64бит) и некий результат, тоже 64 бит. Из результата надо сформировать маску для следующего запроса. Вроде просто, но как формировать эту маску? Предположим, повесил я на шину 4 слэйва. Выставил код 0...0, получил ID code и результат - 0x0..18. Согласно гайду выделил старший разряд, получилось 0x0..10. Получил второй айдикод и 0x0..38. Опять взял старший бит, выставил 0x0..20, получил опять 0x0..18! Если же выставлять маску 0x0..08, получаю тот же айдикод что и с маской все нули. И вот тут у меня мозг сломался ... Может, ктонибудь обьяснит на пальцах алгоритм?
p.s. Сишный код тоже видел, для меня он нечитабелен, т.к. Си почти не знаю. Да и реализовать я автомат планировал, или простенькую программу на ассемблере со всеми ключевыми вычислялками на логике ПЛИС.
Спасибо!upd: вроде разобрался, нужно к старшему биту маски добавлять еще кусок последнего обнаруженного id кода. но полной победы не достигнуто, теперь определяются 7 из 8 устройств)
|
|
|
|
|
Dec 6 2011, 16:23
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Shivers @ Dec 6 2011, 17:48)  Отличная подборка, спасибо! У меня алгоритм в целом работает, но из N устройств стабильно находит только (N-1) : ) Пока не разобрался, почему так
p.s. статья с RS оказалась бесполезной, поскольку алгоритма Autodetect я там не обнаружил, а общение с датчиком (в качестве датчика у меня модифицированная модель из далласовской корки) у меня проходит на ура - и запись и чтение. Нужно только автодетект допилить, либо покупать на один датчик больше ))) А Вы обратили внимание, что сначала вызываается OWFirst, а потом OWNExt, Может у Вас только OWNext реализовано? Отличия то там только в инициализации переменных, а OWSearch вызывается один и тот же. З.Ы. В терминах максимовской аппликухи.
|
|
|
|
|
Dec 7 2011, 10:55
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Гмм. Ну, OWFirst (условно говоря, поиск первого айдикода) пропустить сложно, т.к. первая маска идет со всеми нолями, и из нее выпадает первый айдикод и первый результат маскирования, из которых формируется маска для итерации OWNExt (поиск следующего). Итого, OWFirst пропустить нельзя никак, я точно не пропустил )
Может, вспомните алгоритм? У меня сейчас так, пример: 1. посылаем 64'h0. Получаем 128 бит, разделяем на 64бита ROMID0, например 0xfedcba98_76543210 и 64 бита MASK0, например 0x00000000_00000180. 2. в MASK0 выделяем старшую 1 (0x00000000_00000100), заполняем все единицы справа, 0x00000000_000001FF, умножаем на ROMID0 и считаем маску для OWNExt = 0xfedcba98_76543210 & 0x00000000_000001FF = 0x00000000_00000110. посылаем на шину результат: 0x00000000_00000110, и получаем в ответ следующие ROMID1 и MASKID1, на основе которых повторяется п.2. и так повторяется, пока не 3. Условие по выходу из алгоритма: когда старшая 1 в промежуточном результате вычислений повторится в одной позиции два раза. Это значит что дальше алгоритм будет находить повторные ROMID.
При этом, из 4х дачиков определяются 3, из 8 датчиков - 7 и т.д., причем если выход из алгоритма убрать то начинаются повторы, а один айдикод упорно не отыскивается. Вроде не сложно получилось, но где то здесь зарыт косяк ..
|
|
|
|
|
Dec 7 2011, 18:53
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Shivers @ Dec 7 2011, 13:55)  Может, вспомните алгоритм? У меня сейчас так, пример: 1. посылаем 64'h0. Получаем 128 бит, разделяем на 64бита ROMID0, например 0xfedcba98_76543210 и 64 бита MASK0, например 0x00000000_00000180. 2. в MASK0 выделяем старшую 1 (0x00000000_00000100), заполняем все единицы справа, 0x00000000_000001FF, умножаем на ROMID0 и считаем маску для Алгоритм поиска основан на вычитывании id_bit и cmp_id_bit, поскольку шина 1-wire, если есть устройства с 0 и 1 в одном и том же бите адреса, то id_bit и cmp_id_bit будут 0, если же устройство одно, то будет либо id_bit=1 и cmp_id_bit=0 либо наоброт, id_bit=0 и cmp_id_bit=1. Из этого определяете с каким значением бита устройства у Вас есть на шине. Маска в Вашем случае как раз означает истинное значение бита адреса равное 0. Посмотрите внимательнее AN187 и DS1WM, Maxim использует одинаковые термины в обоих документах. Цитата(Shivers @ Dec 7 2011, 13:55)  3. Условие по выходу из алгоритма: когда старшая 1 в промежуточном результате вычислений повторится в одной позиции два раза. Это значит что дальше алгоритм будет находить повторные ROMID. Thus, if r’63 and d63 are both 1, an error has occurred during the search procedure and the last sequence has to be repeated.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|