Протокол 1-Wire и iButton

Практическое программирование Arduino — протокол 1-Wire и iButton

Сегодня мы познакомимся с интересным протоколом 1-Wire и даже сразу попробуем поработать с устройством, использующим этот протокол.
Это однопроводной интерфейс, разработан фирмой Dallas Semiconductor (ныне MAXIM) в конце 90-х годов.

Этот интерфейс интересен тем, что для двустороннего обмена требуется всего одна линия! (отсюда и название 🙂

1DS1990A – это и есть название нашего устройства.
DS1990A — 64 Bit ID — уникальный серийный номер-ключ
Число после # определяет форм-фактор ключа – у меня F5.

Итак, наш ключ хранит 64 бита уникальной информации
Питается от 2.8V до 6.0V
К центральной контактной площадке подключается линия данных, а к боковой каёмке – землю.
Ключ может работать в диапазоне температур от -40°C до +85°C – впрочем, это нам не нужно 🙂

Величина подтягивающего резистора рекомендуется в 2.2k

Каждый DS1990A прошивается уникальным 64-битным номером

первые 8 бит — номер серии устройства (01h)
следующие 48 бит — уникальный серийный номер
последние 8 бит — CRC-код предыдущих 56 бит информации 🙂

2

(Cyclic redundancy code, CRC — циклический избыточный код) — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического избыточного кода.

Далее в датащите перечислены команды, которые понимает ключ:
33h — считать ROM — команда позволяет считать заветные 64-бита данных ключа
F0h — поиск ROM — т.к. к сети 1-wire может быть подключено несколько устройств данная команда используется для идентификации подключённых устройств.
55h — соответствие ROM / CCh — пропуск ROM
— данные команды входят в минимальный набор необходимых команд 1-wire-устройств. Т.к. в ключе DS1990A эти команды не требуются — он на них не отвечает.
Arduino может работать с 1-Wire, используя библиотеку Jim Studt-а – OneWire.
Схема подключения – крайне проста (это ведь 1-Wire! 🙂

Далее нужно скачать библиотеку OneWire и поместить её в свою директорию libraries.

Код скетча:

#include <OneWire.h>
/* 
* тестируем работу по 1-Wire с ключём-таблеткой DS1990A
*/
OneWire ds(10); // на digital pin 10
void setup(void) 
{
 Serial.begin(9600);
}
void loop(void) 
{
 
byte i;
 
byte present = 0;
 
byte data[12];
 
byte addr[8];
 
 
if ( !ds.search(addr)) {
   
Serial.print("No more addresses.\n");
   
ds.reset_search();
   
return;
 
}
 
 
Serial.print("R=");
 
for( i = 0; i < 8; i++) {
  
Serial.print(addr[i], HEX);
  
Serial.print(" ");
 
}
 
if ( OneWire::crc8( addr, 7) != addr[7]) {
   
Serial.print("CRC is not valid!\n");
   
return;
 
}
 
if ( addr[0] != 0x01) {
   
Serial.print("Device is not a DS1990A family device.\n");
   return;
 
}
 
Serial.println();
 
ds.reset();
 
delay(1000);
}

Происходит постоянный поиск устройств на линии 1-Wire. Пока ключ не подключён – выдаётся: No more addresses.

При подключении ключа-таблетки – считывается её номер и выдаётся в COM-порт.
Например, вот что выдаётся при подключении ключа-таблетки, с которого начиналась эта статья:

3

Первая цифра – номер серии – 01h
Далее, как видим, действительно ключ хранит номер, нанесённый на своём корпусе 😉
Только этот номер выведен наоборот – как и положено по протоколу 1-Wire – начиная с младшего байта 😉
Последний байт –B6h — CRC-код предыдущих байт.

По материалам форума «робокрафт»

Метки: , , , , , , , . Закладка Постоянная ссылка.

Комментарии запрещены.