Считать данные с DS2406
- Войдите на сайт для отправки комментариев
Ср, 15/01/2014 - 22:42
Здравствуйте. Помогите пожалуйста разобраться с двухканальным 1-wire ключом DS2406P
Даташит взял тут http://pdfserv.maximintegrated.com/en/ds/DS2406.pdf.
Пробовал пользоваться библиотекой http://github.com/dustin/arduino-2406. Но среди ее стандартных функций не разобрался как настроить порт PIO_A на ввод и считать его состояние. В примерах есть только запись в память
В программировании еще новичок. Вот набросал код с использованием библиотеки OneWire
#include <OneWire.h> OneWire ds(9); uint8_t address[8] = {0x12, 0x2E, 0xED, 0x3D, 0, 0, 0, 0xC7}; uint8_t CHANNEL_ACCESS = 0xF5; uint8_t CHANNEL_CONTROL_BYTE = 01000100; //ALR=0;IM=1;TOG=0;IC=0;CHS1=0;CHS0=1;CRC1=0;CRC0=0 uint8_t buffer; void setup(void) { Serial.begin(9600); } void loop(void) { ds.reset(); ds.select(address); ds.write(CHANNEL_ACCESS,1); ds.write(CHANNEL_CONTROL_BYTE,1); ds.write(0xFF,1); ds.write(CHANNEL_CONTROL_BYTE,1); ds.write(0xFF,1); buffer = ds.read(); ds.reset(); Serial.println(buffer); delay(2000); }
Но в мониторе порта постоянно показывает 255 (11111111). Чего по идее (согласно даташиту) не должно быть.
Помогите разобраться пожалуйста. Спасибо.
В свое время руки не дошли научиться читать, вот списочек может вам поможет.
Спасибо за наводку))) А Вы это все из даташита вычитали? Я просто видимо не нашел или не понял как именно эти коды выделить из тех таблиц. Буду пробовать
Romosyto, у вас получилось разобраться как работать с ds2406?
Да, получилось) Код дома на компе. Вечером отпишусь...
Ок. Жду. Спасибо.
После безуспешных поисков на форумах и в инете, вот что удалось набыдлокодить)) :
Пояснения к коду:
У меня микросхема в двухканальном исполнении и мне нужно получить состояние входа PIO A.
Для того чтобы получить состояние портов необходимо обратиться либо к памяти устройства (до этого у меня мозгов не хватило) либо послать устройству сигнал CHANNEL ACCESS 0xF5 а затем так называемый CHANNEL CONTROL BYTE, в котором в каждом бите зашифровано, что Вы хотите получить от устройства.
У меня это значение 0x44;
А это расщифровка каждого байта по даташиту
ALR=0;IM=1;TOG=0;IC=0;CHS1=0;CHS0=1;CRC1=0;CRC0=0 (NO CRC)
CHS1=0 и CHS0=1 формируют запрос к PIO A;
IC=0 устанавливает асинхронный режим передачи. Так как у меня одноканальное чтение, то ставим 0
IM=1 и TOG=0 устанавливают режим чтения из выбранного порта
CRC1=0 и CRC0=0 отключают режим формирования CRC (Опытным путем выяснил, что при простом чтении состояния, CRC не формируется, поэтому установил нули)
ALR=0 - какая-то хрень с защелкой. Толком не удалось разобраться (вроде вычитал, что надо поставить ноль)
После отправки CHANNEL CONTROL BYTE к устройству, оно передает вам в ответ CHANNEL INFO BYTE, в каждом бите которого зашифровано состояние устройства. По даташиту меня интересовал байт 2, который передает состояние PIO A (для PIO B это байт 3).
Далее чтобы искючить ложные срабатывания (а такое опытным путем установлено, что бывает), я подряд 5 раз читаю состояние PIO A и если они подряд идут сработавшими - то вывожу "АВАРИЯ".
Код может и не изящен, но чем богаты так сказать)) Получится разобраться с CRC и памятью - поделитесь опытом)
Большое спасибо. Попробую. Если что-то додумаю обязательно поделюсь.
вот что у меня получилось.
И как? работает?
Можно по подробнее про CRC?
Про вот эту строчку "// 3 cmd bytes, 1 data byte, 1 0x00, 2 CRC16" ?
Жаль что вопросы Romosyto за 8 лет так и не отвечены...
Приехала ко мне эта самая ds2406. После поиска и чтения даташита вижу что нужен пример работы с этой штукой.
Дело в том что автор библиотекой http://github.com/dustin/arduino-2406 явно не докурил все возможности чипа.
Мне пока интересна запись в устройство. Т.е. вывод сигнала на его порт
Код примера БлинкБезДелеяDS2406 на порту А
Самое интересное - стр.47
Быстрый вывод одного бита прямо в пор. Как видим его можно повторять до сконания века или ресета шины. Очевидно вывод защищен от помех только везением, зато очень быстрый и простой. Если вместо одного бита выводить сразу байт, то будет воспринято как последовательные 8 бит. Можно задействовать оба порт, тогда передаваемые биты поочередно будут выводится то в один, то в другой. Можно даже синхронизировать процесс.
Ввод данных аналогичным путем так же возможен.
Похоже такой скоростной вывод позволит делать занятные вещи на 1Wire. Например поцепить серву. Или эмулировать I2C и поцепить что то типа 1604.
В 2413 похоже такого нет.
Битовые операции OneWire не во всех описаниях есть, похоже в старых версиях их воще не было.