Действия с 1-wire устройствами всегда однотипно:
- Rest
- Команда выбора устройства
- Номер устройства
- Команда записи/чтения
- Отправка байтов на запись/получение байтов при чтении
- Reset
Но сначала надо найти устройства:
Код:
|
#define MAX_DEVICES 3
#define FAMILY_CODE 0x08
char devices_codes[MAX_DEVICES][9];
char devices;
w1_init();
devices = w1_search(FAMILY_CODE, &devices_codes[0][0]); |
Функция вернёт в devices количество найденных девайсов DS1992 по их Family Code 0x08 (см. даташит), а devices_codes - будет массив 64 битных кодов найденных устройств,
ну и далее можно с ними рабоать:
(комманды и последовательность действий подробно описаны в даташите)
Код:
|
#define MATCH_ROM 0x55
#define WRITE_SCRATCHPAD 0x0F
char i;
char data[2] = {'Х', 'У'}; // два байта, что будем записывать в память
for (i=0; i‹devices; i++)
{
w1_init(); // отправка reset
w1_write(MATCH_ROM); // команда выбора определённого девайса
w1_write(&device_codes[i][0]); // код девайса
w1_write(WRITE_SCRATCHPAD); // команда записи
w1_write(0x26); // передача этих двух байтов определят позицию записи
w1_writre(0x00); // снчала LSB, потом MSB. здесь мы пишем в позицию памяти 0026h
w1_write(data[0]); // пишем первый байт наших данных
w1_writre(data[1]); // пишем второй байт наших данных
w1_init(); // на всякий случай резетим, говорим спасибо и выходим
} |
Чтение делается аналогично. Можно считывать память побайтово. Можно получить её всю. Если устройство на линии одно - с ним можно работать не используя его номер, и заменив MATCH_ROM на SKIP_ROM.
Всё написано в даташите с примером последовательностей и кодами команд.
Да, и ещё одно - Scratchpad сохранится в постоянной памяти устройства только после команды Copy Scratchpad. В противном случае после отключения питания эти данные пропадут.
Полная последовательность действий при записи:
- Записать
- Считать и проверить, что всё ок (для эстетов)
- Инициировать копирование в EEPROM устройства.