Arduino:Примеры/DS250x PROM
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (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 }
См.также
Внешние ссылки