Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
FT232: Как подружить 1-wire с компом / Связь железа с компьютером. / Сообщество EasyElectronics.ru

FT232: Как подружить 1-wire с компом

Устройств, работающих на шине 1-wire великое множество: ключи-таблетки, датчики температуры, память, RTC, АЦП…
Некоторые из них хочется подключить к компу. Но как? Неужели придется делать какой-то преобразователь на МК, или ставить специальную микросхему?!

Нет, все гораздо проще. Передавая через UART байты с разным коэфф. заполнения можно получить нужные по длительности импульсы. Таким образом можно эмулировать 1-wire. Идея в общем-то довольно известная, но я о ней узнал недавно, и думаю, что не только я один :)

Для того, чтобы UART порт мог работать как 1-wire, нужно прицепить пару деталей:

sch.PNG

С RX мы будем принимать данные, которые сами передаем + изменения, вносимые слейвом. TX подключен так, чтобы не было конфликтов уровней на линии (когда TX в лог единице, а слейв тянет линию вниз). Плату под такое делать рука не поднимается, поэтому я применил скилл говноляпства:

conv.JPG

Чтобы UART мог генерировать импульсы нужной длины, нам придется хитро переключать скорости:

RESET передаем так: бодрейт — 9600, предаем 0xF0. В случае если слейв сказал «привет», получим не то, что отправили.
Картинка с MAXIM-IC.com - не грузится? я не виноват!

Единичка (или чтение): бодрейт 115200, передаем 0xFF. Если слейв потянул линию вниз — получим что-то меньшее.
Картинка с MAXIM-IC.com - не грузится? я не виноват!

Ноль: бодрейт 115200, передаем 0x00.
Картинка с MAXIM-IC.com - не грузится? я не виноват!

--Все картинки я нагло скопипастил из аппноута от Максима.

Теперь, попробуем реализовать это на практике. Для примера я написал программу, которая опрашивает датчик DS18b20 и выдает на экран температуру:

screenshot.PNG

Весь код приводить не буду, покажу лишь то, что связано с обменом данными.

Генерация RESET. Если кто-то откликнулся — функция возвращает true, иначе false.

function OneWire_reset: boolean;
begin
 Result := false;
 FT_Current_Baud := 9600;
 FT_Current_DataBits := 8;
 FT_Current_StopBits := FT_STOP_BITS_1;
 FT_Current_Parity := FT_PARITY_NONE;
 FT_Current_FlowControl := FT_FLOW_NONE;
 Set_USB_Device_BaudRate;
 Set_USB_Device_DataCharacteristics;
 Set_USB_Device_FlowControl;

 FT_Out_Buffer[0] := $F0;
 Write_USB_Device_Buffer(1);

 repeat
   Get_USB_Device_QueueStatus;
 until (FT_Q_Bytes > 0);

 Read_USB_Device_Buffer(1);

 if FT_In_Buffer[0] <> $F0 then Result := true;
end;


Передача 1 байта данных:

procedure OneWire_send_byte(DataToTransfer: byte);
var
 tmp_b: byte;
 i: integer;
begin
 FT_Current_Baud := 115200;
 Set_USB_Device_BaudRate;

 for I := 0 to 7 do
  if (DataToTransfer and (1 shl I)) <> 0 then
   FT_Out_Buffer[i] := $FF
  else
   FT_Out_Buffer[i] := $00;

  Write_USB_Device_Buffer(8);

 //RX у нас замкнут на TX, поэтому данные придут обратно,
 //и если их не прочитать - будут валяться в буфере FT232.
 repeat
   Get_USB_Device_QueueStatus;
 until (FT_Q_Bytes >= 8);

 Read_USB_Device_Buffer(8);

end;

Чтение байта:

function OneWire_read_byte(): byte;
var
 tmp_b: byte;
 i: integer;
begin
 Result := 0;
 FT_Current_Baud := 115200;
 Set_USB_Device_BaudRate;

 for I := 0 to 7 do
  FT_Out_Buffer[i] := $FF;

  Write_USB_Device_Buffer(8);

 repeat
   Get_USB_Device_QueueStatus;
 until (FT_Q_Bytes >= 8);

 Read_USB_Device_Buffer(8);

 for I := 0 to 7 do
  if FT_In_Buffer[i]<>$FF then
   Result := Result or (1 shl I);
   Result := not result;
end;


Остальной код + скомпилированную прогу можно взять тут. В папке _inc есть два ценных файла: One_wire.pas — реализация низкоуровневого обмена данными (ресет, чтение, запись); и DS18b20.pas — функции для работы с градусником. А вот, как это все работает:



P.S. Все вышесказаное применимо не только к FT232. Можно сделать тоже самое на железном COM порте или другом преобразователе…

  • +14
  • 23 мая 2011, 14:59
  • dcoder

Комментарии (33)

RSS свернуть / развернуть
Уважаемый dcoder, а можно следующий пост по I2C + FT232? Картридж принтерный пора реверсить, а сниффить похоже надо на большой частоте.
0
А там точно I2C? У меня в принтере (HP LaserJet P1005) что-то типа 1-wire, а в некоторых что-то свое.

Послушать I2C (макс частота, ЕМНИП, 50кГц) и 1-wire можно вот этой приблудой. Первая версия на ком-порт, но oss хотел в близжайшее время выложить свою печатку с ft232.

А I2C + FT232 = мой мультипрог. (Живет вот в этой теме, все лень вытащить в отдельный пост). Но он только I2C мастер и мееедленный.
0
у меня i2c. там в большинстве микрухи памяти тупо стоят, с этим интерфейсом.
0
А у меня какая-то НЕХ. Физически — 1-wire (земля и сигнальный провод), но на просьбу сказать серийный номер не отзывается.
0
А у меня — криптоинтерфейс >_<. Хотя одна дырка там есть есть, только нужно прошивку даунгрейднуть…
0
Похоже, что у меня одна из этих: www.maxim-ic.com/products/1-wire/consumable_print.cfm
0
Точно I2C. Причем с криптозащитой (Samsung ML-1865). Вот, хочу эмулятор чипа запилить, а то замена 10 баксов стоит, да и вообще — интересно же. Мультипрог погляжу, спасибо, может и разогнать смогу :).
0
О, а криптозащиту самсуев уже сломали? У меня ML-1641.
0
Вроде нет. Есть какие-то половинчатые решения, типа остановки прогрессбара в картридже, но полностью еще не поломали. Китаесы вроде чипы делают, но работают ли они — неизвестно. Кстати, 1641й прошивают и после можно не обращать внимания на чип.
0
Да, я знаю — это и есть та дырка, про которую я говорил. Ну там еще нужно перемычек пару бросить. Еще вариант (теоретически) — сдампить содержимое епрома на новом принтере и заливать обратно когда будет жаловаться.
0
плашку конкурса можно поставить ;-) классная реализация
0
Поставил :)
Осциллограф я точно не поймаю, но может паяльник газовый. Да и марсоход тоже очень не плохо :)
0
ну, баллы-то сохранятся на следующий раз.
0
А зачем общаться фт-хой через D2XX? Здесь же обычный уарт, можно работать через виртуальный комп-порт, насколько я вижу. А значит — использовать любой другой USB->UART или ком-порт без изменения кода.
0
  • avatar
  • Vga
  • 23 мая 2011, 16:00
Вообще да… как-то эта мысля мимо меня прошла :( Может переделаю потом.
0
D2XX удобен тем, что через него ДиХальтовая версия AVR-программатора работает. И бит-банг тоже, на сколько я понял. А каждый раз переставлять дрова — лишний геморой…
0
Дрова переставлять не нужно. Максимум фт-шку передернуть. По крайней мере я спокойно прошивал проц на пинборде фт-шным программатором, передергивал питание (это нужно чтобы шлейф программатор-МК без опаски сдернуть) и после включения с фт-шкой можно спокойно работать как с комом. А возможно — даже и передергивание не требуется.
0
Не требуется. Я так и работаю — нажал в терминале «отключить», запустил дудку — перепрошилось, нажал в терминале «подключить», всё ок.
Правда если контроллер по дурости начинает очень много гадить в сериал порт, то дудка запускается через раз на десятый. Иногда приходится пинцетом на ресет её затыкать.
0
его, конечно — контроллер, а не дудку.
0
Какая умная микросхема. В кои-то веки программеры дров не зря свой хлеб едят.
0
Пикча с говноляпством оказалась настолько унылой, что не отобразилась вообще :)
0
А другие (кроме максимовских) видно? Странно… сервер-то один.
0
сейчас обновил страницу — отобразилась, действительно, говноляпство :)

на чем прога написана?
0
На delphi
0
А по-моему клёвое говноляпство. Обожаю минимализм.
0
Кстати, а почему ты выкладываешь картинки на внешних серверах? Сейчас-то все нормально, но на том же хабре часто несказанно радует статья из 90% протухших картинок и 10% текста в духе «см. рис. 1».
0
  • avatar
  • Vga
  • 24 мая 2011, 19:38
Вопрос по схеме — вариант диодом в реальной работе сильно хуже рекомендованной в аппноуте с двумя 2N7002?
0
Сравнивать не могу. Но работает :)

Единственное, там видимо 0 — это ноль. А у меня где-то 0.5 — 0.6 V
0
Понятно :) Поковыряюсь тогда в дохлых мамках и БП — может найду аналоги этих 2N2007. Хочу 1-wire прикрутить к SMT32
0
собрал, но не работает(не определяется датчик-ступор полный ) брал первый попавшийся диод, подозреваю его, на каких диодах у вас работает?
0
  • avatar
  • doki
  • 14 февраля 2013, 14:48
«ступор полный» — всмысле зависает наглухо? Проверьте внимательно подключение — может где замкнуло что-то. Так бывает, когда на RX сигнал не приходит.
0
проверил, все нормально с соединением, да и там нечему замыкать.диод д2в, резистор 3.6ком, устройство phreakerclub.com/563, запускаю программу(ехе) не определяется, нажимаю подключить и в этот момент начинает виснуть, не прямо что пипец, но заметно,,,
0
Тоже собрал, программа зависает. Датчик почему-то ничего не отвечает. Может датчик неисправный? Подскажите, а с ds18s20 должно работать? Или обязательно ds18b20?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.