Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

Код

  1. /*
  2. Скетч, считывающий данные с PROM-чипа DS250x при помощи функции SKIP ROM.
  3.  
  4. DS250x – это PROM-чип типа «add-only» (то есть новые данные добавлять
  5. можно, а изменять старые – нельзя) на 512/1024 бита, который
  6. используется, как правило, для хранения идентификационных данных вроде
  7. серийного номера, mfgr-данных, уникальных идентификаторов и т.д. Он
  8. использует шину 1-Wire от Maxim.
  9.  
  10. Этот скетч использует функцию SKIP ROM, которая пропускает фазу поиска
  11. в 1-Wire, поскольку скетч рассчитан на то, что к шине (точнее, к 6-ому
  12. контакту) подключено всего одно устройство.
  13.  
  14. Если к шине будет подключено больше одного устройства, то скетч
  15. работать не будет. Кроме того, скетч не будет проверять, подключено ли
  16. к Arduino именно устройство семейства DS250x, т.к. благодаря функции
  17. SKIP ROM этап считывания ID семейства будет пропущен.
  18.  
  19. Поскольку этот скетч можно запустить с любым устройством Maxim
  20. OneWire, команда CRC в большинстве случаев работать не будет.
  21.  
  22. Скетч считывает только первую страницу памяти (32 бита) – начиная с
  23. самого младшего адреса (0000h). Если в сети имеется больше одного
  24. девайса, используйте скетч с функциями поиска.
  25.  
  26. Не забудьте подключить резистор на 4,7 кОм между 6-ым контактом и +Vcc.
  27.  
  28. Чтобы изменить диапазон данных для считывания, просто поменяйте размер
  29. массива данных, адреса самого младшего и самого старшего битов, а
  30. также итерации в цикле for().
  31.  
  32. Этот код не защищен авторским правом и предоставляется в состоянии
  33. «как есть».
  34.  
  35. Написан для Arduino 0022 и библиотеки OneWire 2.0 (от PJRC)
  36. http://www.pjrc.com/teensy/td_libs_OneWire.html
  37.  
  38. Создан Гильермо Ловато (Guillermo Lovato; <glovato@gmail.com>) в марте 2011 года
  39.  
  40. */
  41.  
  42. #include <OneWire.h>
  43. OneWire ds(6);                    // шина OneWire на 6-ом цифровом контакте
  44. void setup() {
  45.   Serial.begin (9600);
  46. }
  47.  
  48. void loop() {
  49.   byte i;                         // это для циклов for()
  50.   boolean present;                // переменная для устройства
  51.   byte data[32];                  // контейнер для данных от девайса
  52.   byte leemem[3] = {              // массив с командами для инициации записи; устройствам DS250x для начала записи нужны 3 байта: команда, а также адреса самого младшего и самого старшего битов
  53.     0xF0 , 0x00 , 0x00   };       // 0xF0 – это команда для чтения данных, а за ней стартовые адреса 00h и 00h (начало, 0000h)
  54.   byte ccrc;                      // переменная для хранения команды CRC
  55.   byte ccrc_calc;
  56.  
  57.   present = ds.reset();           // сброс шины OneWire, всегда нужно для начала работы с шиной; если присутствует девайс, возвращает 1/TRUE
  58.   ds.skip();                      // поиск Skip ROM
  59.  
  60.   if (present == TRUE){           // если девайс подключен, пытаемся только прочесть данные
  61.     Serial.println("DS250x device present");  //  "Обнаружено устройство DS250x"
  62.     ds.write(leemem[0],1);        // команда чтения данных, паразитное питание оставляем включенным
  63.     ds.write(leemem[1],1);        // начальный адрес самого младшего бита, паразитное питание оставляем включенным
  64.     ds.write(leemem[2],1);        // начальный адрес самого старшего бита, паразитное питание оставляем включенным
  65.  
  66.     ccrc = ds.read();             // DS250x генерирует CRC для отправленной команды, а мы сохраняем это значение в специально созданной для этого переменной
  67.     ccrc_calc = OneWire::crc8(leemem, 3);  // при помощи библиотечной функции высчитываем CRC отправленных нами команд и сохраняем его
  68.  
  69.     if ( ccrc_calc != ccrc) {      // затем сравниваем его со значением, рассчитанным ds250x, и если они не совпадают, выводим сообщение об ошибке и завершаем работу цикла
  70.       Serial.println("Invalid command CRC!");  //  "Неверная команда CRC!"
  71.       Serial.print("Calculated CRC:");    //  "Рассчитанный CRC:"
  72.       Serial.println(ccrc_calc,HEX);    // при помощи HEX-формата проще сравнивать
  73.       Serial.print("DS250x readback CRC:");   //  "Обратное считывание CRC на DS250x:"
  74.       Serial.println(ccrc,HEX);
  75.       return;                      // поскольку с CRC произошла ошибка, завершаем цикл и начинаем заново
  76.     }
  77.     Serial.println("Data is: ");   // для вывода данных
  78.     for ( i = 0; i < 32; i++) {    // теперь пришло время считывать сами PROM-данные; каждая страница – это 32 байта, так что нам нужно 32 команды чтения
  79.       data[i] = ds.read();         // для каждого считанного байта в массиве данных отведена отдельная позиция
  80.       Serial.print(data[i]);       // выводим ASCII
  81.       Serial.print(" ");           // просто пробел
  82.     }
  83.     Serial.println();
  84.     delay(5000);                    // задержка, чтобы не переборщить с выводом данных
  85.   }
  86.   else {                           // к шине ничего не подключено
  87.     Serial.println("Nothing connected");   //  "Ничего не подключено"
  88.     delay(3000);
  89.   }
  90. }

См.также

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

  1. github.com - DS250x_PROM.pde