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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Чтение данных с 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 }

См.также

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