На начало  
Карта сайта
О себе
TINI ?
"Железо"
Справочник
Софт
Проекты
Документация
FAQ
Ссылки
Связь


TINI и 1-Wire шина

 

В принципе о чем тут можно говорить? Было бы удивительно, если бы TINI не поддерживал 1-Wire, ведь и то и другое произведения Dallas Semiconductor. О чем обычно «болит голова» у разработчика? Да все о том же, о том, как проще, дальше и дешевле. Вот основные «камни» в фундаменте 1-Wire шины. По сути один полевик+резистор в качестве драйвера-формирователя шины, кусок телефонной лапши и датчики стоимостью от полутора до 5 «убитых енотов» – шикарное решение по измерению нужной величины. Плюс к этому обширный список свободного софта и примеров практически для всех процессоров и микроконтроллеров (от PIC до ARM 7). Есть конечно и проблемы, но где без них? Все решаемо. Думаю, не имеет смысла особо останавливаться на описании структуры 1-Wire и особенностях ее построения, а сразу перейдем к вопросам связанным с совмещением TINI и однопроводных приборов. Более подробную информацию о топологии однопроводной сети и ее компонентах можно посмотреть на сайте производителя http://www.IButton.com и на сайте московской фирмы «Элин».

 Теперь давайте разберемся с применяемой терминологией: под адаптером будем считать МАСТЕР (например, DS2480) однопроводной шины и подпрограмму обслуживания МАСТЕРА, либо чисто программное решение как на внутренней "ветке" TINI.

Первый пример, это поиск установленных в системе адаптеров:

 import java.util.Enumeration;

import com.dalsemi.onewire.OneWireAccessProvider;

import com.dalsemi.onewire.adapter.DSPortAdapter;

 

class FindAdapters {

  public static void main(String[] args) {

    Enumeration e = OneWireAccessProvider.enumerateAllAdapters();

    while (e.hasMoreElements()) {

      System.out.println(

        ((DSPortAdapter) e.nextElement()).getAdapterName());

    }

  }

}

 

вот результат работы программы:

Результат поиска 1-Wire адаптеров

 

Вы спросите, почему мы получили два адаптера (TINIExternalAdapter и TINIInternalAdapter)? Все просто, один адаптер это внутренняя «ветка» 1-Wire организованная программным способом на P3.5 , второй это внешняя «ветка» организованная на DS2480.

 Второй пример, это поиск подключенных к внешней «ветке» устройств. В качестве подопытных «кроликов» у нас будут выступать обычная «дверная» таблетка DS1990-F5 и датчик на основе DS2438 удаленный на энное расстояние от TINI.

import java.util.Enumeration;

import com.dalsemi.onewire.OneWireAccessProvider;

import com.dalsemi.onewire.container.OneWireContainer;

import com.dalsemi.onewire.adapter.DSPortAdapter;

import com.dalsemi.onewire.OneWireException;

 

class Search_Dev {

  public static void main(String[] args) {

    try {

      DSPortAdapter adapter = OneWireAccessProvider.getDefaultAdapter();

      adapter.targetAllFamilies();

      System.out.println("1-Wire net addresses:");

      Enumeration e = adapter.getAllDeviceContainers();

      while (e.hasMoreElements()) {

        System.out.println(

          ((OneWireContainer) e.nextElement()).getAddressAsString());

      }

    } catch (OneWireException owe) {

      owe.printStackTrace();

    }

  }

}

 Итог работы программы, найдены наши устройства:

Результат поиска устройств на однопроводной шине

 

Так, мы определились с адаптерами и поиском устройств, пора попробовать поработать с ними.

 Вот примерчик чтения Ethernet MAC адреса нашего TINI.

import com.dalsemi.onewire.adapter.TINIInternalAdapter;

import com.dalsemi.onewire.OneWireException;

 

class EthernetAddressReader {

  static final int TARGET_FAMILY_ID    = 0x89;

  static final int START_ADDRESS       = 0x6;

  static final int READ_MEMORY_COMMAND = 0xf0;

 

  public static void main(String[] args) {

    TINIInternalAdapter adapter = new TINIInternalAdapter();

    boolean foundIt = false;

 

    try {

      adapter.beginExclusive(true);

      if (adapter.findFirstDevice()) {

        // Test LSB (family id) against target

        if ((adapter.getAddressAsLong()&0xff) == TARGET_FAMILY_ID) {

          foundIt = true;

        }

        while (!foundIt && adapter.findNextDevice()) {

          if ((adapter.getAddressAsLong() & 0xFF) ==

             TARGET_FAMILY_ID) {

            foundIt = true;

          }

        }

        if (foundIt) {

          /*

           * data[0] -> read memory command byte

           * data[1] -> low byte of starting address

           * data[2] -> high byte of starting address

           */

          byte[] command = new byte[3];

          command[0] = (byte) READ_MEMORY_COMMAND;

          command[1] = START_ADDRESS & 0xFF;

          command[2] = (START_ADDRESS >>> 8) & 0xFF;

 

          // Send the command and starting memory address

          adapter.dataBlock(command, 0, command.length);

          // Read 48-bit ethernet address

          byte[] macID = adapter.getBlock(6);  

          for (int i = 5; i >= 0; i--) {

            System.out.print(Integer.toHexString(macID[i] & 0xff));

            if (i != 0) {

              System.out.print(":");

            }

          }

          System.out.println();

        } else {

          System.out.println("Device not found");

        }

      }

    } catch (OneWireException owe) {

      System.out.println(owe.getMessage());

    } finally {

      adapter.endExclusive();

    }

  }

}

 

Вот наш искомый MAC адрес

 

Вот в принципе и все по этому вопросу. Правильнее сказать все, что готово на данный момент. К сожалению времени на все не хватает, но все же я постараюсь в самое ближайшее время переделать странички посвященные примерам и расписать их подробнее.

 (С) 2002-2003 AK

 

| TINI? | Железо | Справочник | Софт | Проекты | Документация | FAQ | Связь |

Ссылки | На главную страницу

Используются технологии uCoz