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());
}
}
}
вот результат работы программы:
Вы спросите, почему
мы получили два адаптера (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();
}
}
}
Вот в принципе и все
по этому вопросу. Правильнее сказать все, что готово на данный момент. К
сожалению времени на все не хватает, но все же я постараюсь в самое
ближайшее время переделать странички посвященные примерам и расписать их
подробнее.
(С)
2002-2003
AK
|