Arduino:Примеры/DS250x PROM

Материал из Онлайн справочника
Версия от 12:33, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Чтение данных с PROM-чипа DS250x[1]

Этот пример показывает, как считывать данные с PROM-чипа семейства DS250x.

Код

/*
Скетч, считывающий данные с PROM-чипа DS250x при помощи функции SKIP ROM.

DS250x – это PROM-чип типа «add-only» (то есть новые данные добавлять 
можно, а изменять старые – нельзя) на 512/1024 бита, который 
используется, как правило, для хранения идентификационных данных вроде 
серийного номера, mfgr-данных, уникальных идентификаторов и т.д. Он 
использует шину 1-Wire от Maxim.

Этот скетч использует функцию SKIP ROM, которая пропускает фазу поиска 
в 1-Wire, поскольку скетч рассчитан на то, что к шине (точнее, к 6-ому 
контакту) подключено всего одно устройство. 

Если к шине будет подключено больше одного устройства, то скетч 
работать не будет. Кроме того, скетч не будет проверять, подключено ли 
к Arduino именно устройство семейства DS250x, т.к. благодаря функции 
SKIP ROM этап считывания ID семейства будет пропущен. 

Поскольку этот скетч можно запустить с любым устройством Maxim 
OneWire, команда CRC в большинстве случаев работать не будет.

Скетч считывает только первую страницу памяти (32 бита) – начиная с 
самого младшего адреса (0000h). Если в сети имеется больше одного 
девайса, используйте скетч с функциями поиска.

Не забудьте подключить резистор на 4,7 кОм между 6-ым контактом и +Vcc.

Чтобы изменить диапазон данных для считывания, просто поменяйте размер 
массива данных, адреса самого младшего и самого старшего битов, а 
также итерации в цикле for().

Этот код не защищен авторским правом и предоставляется в состоянии 
«как есть».
 
Написан для Arduino 0022 и библиотеки OneWire 2.0 (от PJRC) 
http://www.pjrc.com/teensy/td_libs_OneWire.html
 
Создан Гильермо Ловато (Guillermo Lovato; <glovato@gmail.com>) в марте 2011 года
 
*/

#include <OneWire.h>
OneWire ds(6);                    // шина OneWire на 6-ом цифровом контакте
void setup() {
  Serial.begin (9600);
}

void loop() {
  byte i;                         // это для циклов for()
  boolean present;                // переменная для устройства
  byte data[32];                  // контейнер для данных от девайса 
  byte leemem[3] = {              // массив с командами для инициации записи; устройствам DS250x для начала записи нужны 3 байта: команда, а также адреса самого младшего и самого старшего битов
    0xF0 , 0x00 , 0x00   };       // 0xF0 – это команда для чтения данных, а за ней стартовые адреса 00h и 00h (начало, 0000h)
  byte ccrc;                      // переменная для хранения команды CRC
  byte ccrc_calc;

  present = ds.reset();           // сброс шины OneWire, всегда нужно для начала работы с шиной; если присутствует девайс, возвращает 1/TRUE
  ds.skip();                      // поиск Skip ROM

  if (present == TRUE){           // если девайс подключен, пытаемся только прочесть данные 
    Serial.println("DS250x device present");  //  "Обнаружено устройство DS250x"
    ds.write(leemem[0],1);        // команда чтения данных, паразитное питание оставляем включенным
    ds.write(leemem[1],1);        // начальный адрес самого младшего бита, паразитное питание оставляем включенным
    ds.write(leemem[2],1);        // начальный адрес самого старшего бита, паразитное питание оставляем включенным

    ccrc = ds.read();             // DS250x генерирует CRC для отправленной команды, а мы сохраняем это значение в специально созданной для этого переменной
    ccrc_calc = OneWire::crc8(leemem, 3);  // при помощи библиотечной функции высчитываем CRC отправленных нами команд и сохраняем его

    if ( ccrc_calc != ccrc) {      // затем сравниваем его со значением, рассчитанным ds250x, и если они не совпадают, выводим сообщение об ошибке и завершаем работу цикла
      Serial.println("Invalid command CRC!");  //  "Неверная команда CRC!"
      Serial.print("Calculated CRC:");    //  "Рассчитанный CRC:"
      Serial.println(ccrc_calc,HEX);    // при помощи HEX-формата проще сравнивать
      Serial.print("DS250x readback CRC:");   //  "Обратное считывание CRC на DS250x:"
      Serial.println(ccrc,HEX);
      return;                      // поскольку с CRC произошла ошибка, завершаем цикл и начинаем заново
    }
    Serial.println("Data is: ");   // для вывода данных 
    for ( i = 0; i < 32; i++) {    // теперь пришло время считывать сами PROM-данные; каждая страница – это 32 байта, так что нам нужно 32 команды чтения
      data[i] = ds.read();         // для каждого считанного байта в массиве данных отведена отдельная позиция
      Serial.print(data[i]);       // выводим ASCII
      Serial.print(" ");           // просто пробел 
    }
    Serial.println();
    delay(5000);                    // задержка, чтобы не переборщить с выводом данных
  }
  else {                           // к шине ничего не подключено 
    Serial.println("Nothing connected");   //  "Ничего не подключено"
    delay(3000);
  }
}

См.также

Внешние ссылки