Как записать переменную во флеш память 80c51f120
Перейти к содержимому

Как записать переменную во флеш память 80c51f120

  • автор:

Как записать переменную во флеш память 80c51f120

подскажите как записать переменную в флеш память плк а потом прочитать ее оттуда или может по другому как то может в файл текстовый сохранить а потом оттуда прочитать состояние переменных или как то по другому

04.03.2012, 12:04

Плк 150 запись и чтение.
Создается файл с именем переменной.
Постоянно перезаписывать файл нельзя— упорите флеш.

зап:
dwHandle := SysFileOpen(‘Pr_XX.t’,’

alexval2006
04.03.2012, 12:12
спасибо попробую
06.03.2012, 12:47
См. в справке RETAIN.
13.12.2012, 15:12

Плк 150 запись и чтение.
Создается файл с именем переменной.
Постоянно перезаписывать файл нельзя— упорите флеш.

зап:
dwHandle := SysFileOpen(‘Pr_XX.t’,’w’);
SysFileWrite(dwHandle,ADR(Pr_XX),SIZEOF(Pr_XX));
SysFileClose(dwHandle);

Чтение:
dwHandle := SysFileOpen(‘Pr_XX.t’,’r’);
SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)-1);
SysFileClose(dwHandle);

Работает.
Pr_XX — имя переменной
SysLibFile.lib — добавь библиотеку.

SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)); — минус один, видимо, по ошибке

13.12.2012, 21:13
нет это не ошибка!
13.12.2012, 21:47

нет это не ошибка!
Сегодня проверял на ПЛК 100. Без -1 — работает, написал список переменных в файл. С -1 например UInt,Word работает до 255, так как из двух записанных байт восстанавливает один (из 4 -3, из 8 -7). Есть варианты когда можно проигнорировать целый байт?

19.12.2012, 23:39

объясните тупому, что здесь делает переменная dwHandle? Какая-то индикация то файл открылся? Тогда зачем её пихать в функцию записи?
И еще, может кто подскажет как единоразово при включении ПЛК считать значение переменной из файла? откуда взять индикацию того что ПЛК включился после пропадания питания? Мне нужно примерно раз в 12 часов писать значение наработки двигателей во флеш и в случае пропадания питания или перезаливки проекта\сброса плк (когда RETAIN переменные слетают или могут слететь) восстанавливать это значение в программе.

20.12.2012, 08:00

объясните тупому, что здесь делает переменная dwHandle? Какая-то индикация то файл открылся? Тогда зачем её пихать в функцию записи?
А вообще читали документацию на библиотеку.
У Вас есть пластиковая карта, по её идентификатору Вам банкомат выдает деньги и принимает, так же и с переменной
И по поводу единовременно, ну полистайте форум, в этом же месяце обсуждалось это

12.05.2020, 11:59

Доброго времени суток!
Да простит меня модератор за поднятие темы, но чтобы не создавать новой спрошу тут.
Есть ли возможность прямого доступа к внутреннему флеш-диску? Можно по произвольному адресу писать?
Или внутренний флеш-диск предназначен только для работы с файловой системой?
Спасибо!

12.05.2020, 12:16

Точно с файловой системой.
Так тут уже говорили. RETAIN не помогут разве? Там что угодно можно хранить: да хоть массив байтов.

12.05.2020, 12:18

Точно с файловой системой.
Так тут уже говорили. RETAIN не помогут разве? Там что угодно можно хранить: да хоть массив байтов.

RETAIN мало по объему. Буду обдумывать другое решение.

Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot

Чтение и запись флеш-памяти с помощью Arduino на примере микросхемы 25L8005

Print Friendly, PDF & Email

В статье мы рассмотрим, как записывать во флеш-память и читать из флеш-памяти с помощью Arduino на примере микросхемы 25L8005.

1 Микросхема флеш-памяти25L8005

Микросхема флеш-памяти (или ПЗУ ) 25L8005 изготавливается в разных корпусах. Но как правило, ввиду малого размера, удобнее использовать микросхемы поверхностного монтажа. У меня как раз такая. Она выполнена в корпусе типа SOP 8L.

Поэтому сначала нужно сделать так, чтобы мы могли с лёгкостью подключиться к микросхеме флеш-памяти. Для этого можно воспользоваться либо специальным переходником, к которому придётся припаять микросхему, либо (что предпочтительнее) использовать панель с нулевым усилением (т.н. панель ZIF , купить можно на Али).

Так выглядит наша микросхема ПЗУ , припаянная к плате-переходнику с DIP-выводами:

Флеш-память припаяна к плате-переходнику

А вот так выглядит микросхема флеш-памяти в ZIF-панели:

Флеш-память в переходной панели с нулевым усилением

И под микроскопом:

Флеш-память в панели с нулевым усилением под микроскопом

Купить ПЗУшку можно, например, в Китае.

Теперь мы можем использовать макетную плату (бредборд) и с лёгкостью подключаться к микросхеме.

2 Подключение Arduino к микросхеме flash-памяти 25L8005

Назначение выводов микросхемы ПЗУ , приведённое в техническом описании на микросхему (datasheet), следующее:

Назначение выводов микросхемы флеш-памяти 25L8005

Кстати, datasheet на микросхему флеш-памяти 25L8005 можно скачать в конце статьи.

Будем использовать для программирования флэш-памяти интерфейс SPI , поэтому подключимся к стандартным SPI выводам Arduino:

Вывод микросхемы флеш-памяти Вывод платы Arduino
CS# цифровой пин 10
SI цифровой пин 11
SO цифровой пин 12
SCLK цифровой пин 13
WP# 3V3
HOLD# 3V3
VCC 3V3
GND GND

Здесь символом решётки # отмечены выводы, которые активируются логическим нулём.

Соберём электрическую схему подключения микросхемы флеш-памяти MX25L8005 к Arduino.

Схема подключения микросхемы флеш-памяти 25L8005 к Arduino

У меня ПЗУ на монтажной плате и подключённое к Arduino выглядит вот так:

Флеш-память на ZIF-панели, подключённая к Arduino Флеш-память на ZIF-панели, подключённая к Arduino

3 Очистка флеш-памяти с помощью Arduino

Перед тем как записывать данные в флеш-память, необходимо стереть тот сектор или страницу, в который мы собираемся записывать. Если записываемых данных немного (в нашем учебном примере это будут всего 16 байт), то достаточно стереть 1 сектор. Из документации на микросхему мы видим, что последовательность стирания такая: выставить разрешение на запись (1 байт), послать команду на стирание (1 байт) и адрес (3 байта), выставить запрет записи (1 байт). Данная последовательность приведена на рисунке ниже:

Диаграмма очистки одного сектора флеш-памяти 25L8005

Именно это и делает приведённый ниже скетч:

#include const int SSPin = 10; const byte WREN = 0x06; const byte WRDI = 0x04; const byte SER = 0x20; const byte ADDR1 = 0; const byte ADDR2 = 0; const byte ADDR3 = 0; void setup() < pinMode(SSPin, OUTPUT); SPI.begin(); SPISettings mySet(100000, MSBFIRST, SPI_MODE0); // Выставление разрешения записи: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(WREN); digitalWrite(SSPin, HIGH); SPI.endTransaction(); // Очистка сектора: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(SER); SPI.transfer(ADDR1); SPI.transfer(ADDR2); SPI.transfer(ADDR3); digitalWrite(SSPin, HIGH); SPI.endTransaction(); // Выставление запрета записи: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(WRDI); digitalWrite(SSPin, HIGH); SPI.endTransaction(); >void loop() < // ничего не делаем в цикле >

Загрузим этот скетч в Arduino с подключённой по приведённой выше схеме микросхемой памяти. После того как он отработал, флешка готова к записи.

4 Запись данных в флеш-память с помощью Arduino

Теперь запишем на неё данные. Для примера возьмём небольшой массив из 16-ти байтов. Как видно из документации, для записи данных во флеш сначала нужно выставить разрешение на запись (1 байт), затем послать команду на запись (1 байт), передать начальный адрес (3 байта) и данные (в нашем примере 16 байт), а в конце выставить запрет записи (1 байт):

Диаграмма записи данных во флеш-память 25L8005

Напишем скетч, который записывает массив из 16-ти байт данных в ПЗУ :

#include const int SSPin = 10; const byte WREN = 0x06; const byte WRDI = 0x04; const byte READ = 0x03; const byte PP = 0x02; const byte ADDR1 = 0; const byte ADDR2 = 0; const byte ADDR3 = 0; void setup() < pinMode(SSPin, OUTPUT); SPI.begin(); SPISettings mySet(100000, MSBFIRST, SPI_MODE0); // Выставление разрешения записи: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(WREN); digitalWrite(SSPin, HIGH); SPI.endTransaction(); // Запись массива данных в ПЗУ: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(PP); SPI.transfer(ADDR1); SPI.transfer(ADDR2); SPI.transfer(ADDR3); byte data[] = ; for (int i=0; i digitalWrite(SSPin, HIGH); SPI.endTransaction(); // Выставление запрета записи: SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(WRDI); digitalWrite(SSPin, HIGH); SPI.endTransaction(); > void loop() < // ничего не делаем в цикле >

Загрузим скетч в Arduino. Кстати, вот так выглядит на логическом анализаторе обмен по SPI между Arduino и ПЗУ 25L8005, когда выполняется данный скетч.

Временная диаграмма записи в ПЗУ массива данных по SPI

После выполнения данного скетча во флеш-память должен был записаться наш тестовый массив. Давайте проверим, так ли это.

4 Чтение данных из флеш-памяти с помощью Arduino

Согласно документации, чтение из флешки выполняется посредством такой последовательности: отправка команды на чтение (1 байт), начальный адрес (3 байта), а далее запрашивается столько байтов, сколько хотим прочитать из ПЗУ . Собственно, мы будем передавать в ПЗУ 16 нулей. Так как SPI – синхронный интерфейс, нам в ответ вернутся 16 записанных в ПЗУ байтов. Вот такая диаграмма приводится в описании к микросхеме:

Диаграмма чтения данных из флеш-памяти 25L8005

Напишем скетч для чтения наших заветных 16-ти байт из микросхемы флеш-памяти 25L8005:

#include const int SSPin = 10; const byte READ = 0x03; const byte ADDR1 = 0; const byte ADDR2 = 0; const byte ADDR3 = 0; void setup() < Serial.begin(9600); pinMode(SSPin, OUTPUT); SPI.begin(); >void loop() < SPISettings mySet(100000, MSBFIRST, SPI_MODE0); SPI.beginTransaction(mySet); digitalWrite(SSPin, LOW); SPI.transfer(READ); SPI.transfer(ADDR1); SPI.transfer(ADDR2); SPI.transfer(ADDR3); for (int i=0; iSerial.println(); digitalWrite(SSPin, HIGH); SPI.endTransaction(); delay(1000); // повторяем чтение каждую секунду >

Загрузим скетч в Arduino и откроем монитор последовательных портов. В мониторе, как и ожидалось, 1 раз в секунду будет выводиться наш массив, считанный из флеш-памяти с помощью Arduino.

Чтение из флеш-памяти с помощью Arduino и вывод в монитор последовательных портов

Вот как выглядит чтение из ПЗУ , если подключиться к линиям SPI логическим анализатором:

Временная диаграмма чтения данных из ПЗУ по SPI

Как видно, байты этого массива соответствуют кодам ASCII строки «HELLO, SOLTAU.RU», которые мы и записали в микросхему памяти 25L8005 🙂

Скачать вложения:

  • Скачать техническое описание (datasheet) на микросхему флеш-памяти 25L8005 (1301 Скачиваний)

Последнее изменениеСреда, 18 Декабрь 2019 18:53 Прочитано 30189 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

Похожие материалы (по тегу)

Последнее от aave

  • Как сохранить пробелы в XAML
  • Как сделать перенос строки в XAML
  • Как использовать тип BitVector32 в .NET
  • WPF: элементы ListBox в виде CheckBox
  • Потокобезопасная наблюдаемая коллекция

Другие материалы в этой категории:

11 комментарии

Гриша 17.12.2019 20:51 Комментировать Спасибо, все понятно написано, благодаря вашей статье быстро разобрался!

aave1 18.12.2019 18:52 Комментировать Гриша, я рад, что смог вам помочь!

Никита 26.04.2020 16:31 Комментировать Доброго времени суток!
Подскажите, инструкция подходит для работы с W25Q64 ?
Пока в наличии нет (жду посылку), ищу инструкцию для работы с указанной flash памятью.
Буду благодарен за помощь!

aave1 26.04.2020 16:57 Комментировать Никита, доброго времени!
Я не изучал подробно вашу ПЗУшку W25Q64, но с первого взгляда она очень похожа на описываемую здесь. По крайней мере, подключение аналогично (если берём в том же корпусе), а на 21-ой странице datasheet приведён набор инструкций SPI, в котором команды чтения, записи, разрешения записи и некоторые другие аналогичны. Надо, конечно, ознакомиться внимательнее, но в целом ничего сложного тут нет. Действуйте согласно документации разработчика. Соберите схему и начните изучать работу с микросхемой с чтения регистров. Хорошие кандидаты для начала — регистры Device ID (0x90), JEDEC ID (0x9F). Если «пощупаете» их, прочитаете значения, которые должны там быть согласно документации, то станет понятно, что вы на верном пути, и это придаст уверенности в дальнейшем изучении.

Никита 29.04.2020 20:12 Комментировать Большое спасибо за ответ!

Сергей 19.11.2020 17:58 Комментировать Доброго времени суток! Прочитал и отработал ваши примеры в данной статье на микросхеме флэш памяти W25Q32FV. Спасибо за материал. Всё работает нормально. Начал экспериментировать с кодом.

В вашем примере адрес передается тремя байтами ADDR1, ADDR2, ADDR3. Разобрался по даташиту со структурой памяти W25Q32FV но всё равно возникли вопросы.

Как записать данные в другой адрес отличного от примера? То есть, как записать и как разбить, например адрес типа 8192 (0x2000h) начального байта сектора 2, на три байта и приписать их переменным ADDR1, ADDR2, ADDR3 . Пробовал по разному. У меня получилось только побитовой передачей в цикле for.

ПРИМЕР:
const byte ADDR[24] = ; //24-битный адрес 0x2000h в двоичном виде и в массиве
for(byte b=0; b = 24; b++) //предаём 24-битный адрес побитно, вставлял его вместо ADDR1. ADDR3

Сергей 19.11.2020 18:03 Комментировать И ещё вопрос не по теме:
В ардуино к сожалению не работает оператор round с указанием количества знаков после запятой.
То есть, выражение:
float number = 1,674938;
float VOLT = round(number,2); //округление до двух знаков после запятой.
НЕ РАБОТАЕТ. Оператор «round» в ардуино умеет округлять только до целых чисел.

Работает следующий вариант:
float number = 1,674938;
int NUM = round(number * 100); //умножаем на 100 и округляем до целых чисел. Получаем 167.
float VOLT = float(NUM / 100); //167 делим на 100 и получаем 1.67

Это я проверял. Это правда или я что-то не так делаю?

aave1 21.11.2020 19:01 Комментировать Сергей, что касается записи ПЗУшек, то в двух словах, ADDR1. ADDR3 — это 24-разрядный адрес, который следует читать как одно большое число. Например, адрес 8192 будет записываться как 0x002000 — теми же 24-мя битами (3 байта). Судя по тому, что я вижу в даташите, в вашем случае адрес передаётся аналогично — 3-мя байтами. Адресное пространство ПЗУшки состоит из 64-х блоков по 64 кб, т.е. в каждом блоке адреса с 0x000000 по 0x00ffff.

aave1 21.11.2020 19:02 Комментировать А что касается округления чисел. В штатной библиотеке ардуино функция round() умеет округлять только до целого числа, так и есть. Ваш вариант с умножением и потом делением рабочий. Можно ещё вот так сделать:

double p = 3.14159265359;

void setup()
Serial.begin(9600);
Serial.println(p, 10); // выводим с точностью до 10 знаков
Serial.println(roundTo(p, 2), 10); // округляем до 2-х знаков и выводим 10 после запятой
Serial.println(roundTo(p, 3), 10); // округляем до 3-х и выводим 10
Serial.println(roundTo(p, 4), 10); // округляем до 4-х и выводим 10
>

double roundTo(double value, int decimal)
double pwr = pow(10, decimal);
return (round(value * pwr) / pwr);
>

Вывод данного скетча будет:
3.1415927410
3.1400003433
3.1420006752
3.1416006088
Если обратите внимание, даже вывод числа с такой большой точностью в первой строчке уже некорректен. Микроконтроллер не очень дружит с точной математикой.

Как записывать информацию на USB-флешку

Флешка — надёжное средство хранения и передачи данных. С помощью USB-устройства удобней всего переносить большие массивы информации с одного компьютера на другой. Скорость записи на современные флешки выше скорости работы винчестеров. Ещё одно преимущество флешек — их высокая надёжность и стабильность работы.

Как записать данные на флешку?

Для этой цели флеш-память подключается к компьютеру. Способ подключения зависит от вида накопителя — USB-флешки, карты памяти или внешнего устройства.

Как записать файлы на USB-флешку?

Подключение флеш-памяти:

 USB-флешка — подсоединяется к стандартному USB-порту компьютера. Для этого достаточно вставить внешний накопитель в разъём. При первом подключении на компьютер автоматически установится драйвер — программа, благодаря которой ПК видит устройство.
 Карта памяти — отличается от USB-флешки отсутствием контроллера памяти. Впрочем, современные карты памяти тоже оснащаются контроллерами. Подключить такой модуль памяти к компьютеру напрямую невозможно. Для этого используется кардридер — он должен быть встроен в компьютер. Если его нет, то его необходимо приобрести отдельно.
 Устройство с флеш-памятью (фотоаппарат, телефон, смартфон). Для подключения используется кабель, который подключается к USB-слоту компьютера. Далее в девайсе выбирается режим накопителя, после чего ПК получит доступ к флешке. Если у вас есть карта памяти, но нет кардридера, её можно вставить в одно из вышеупомянутых устройств и таким образом подключить к компьютеру.

Когда флешка подключена и распознана, в «Моём компьютере» появится соответствующий значок. Теперь она готова для записи данных.

Основные правила работы с USB-флешкой

Копирование информации на флешку осуществляется стандартными инструментами операционной системы Windows:

1. Нажмите правой кнопкой мыши на файле, который необходимо скопировать, и выберите в появившемся меню пункт «Копировать».
2. Зайдите с компьютера на флешку и выберите папку, в которую нужно записать файл. Нажмите в пустом поле папки правой кнопкой мыши и выберите пункт контекстного меню «Вставить». После этого файл скопируется в папку.

Скорость записи на флешку зависит не только от её модели, но и от типа материнской платы компьютера. Учтите, что если файловая система вашего флеш-накопителя FAT32, вы не сможете записать файл размером больше 4 Гб. Чтобы получить такую возможность просто отформатируйте флешку, поставив при этом файловую систему NTFS.

  • ‹ Сколько циклов записи у флешки?
  • Как безопасно извлечь флешку ›

Тема: запись переменной в флеш память плк

alexval2006 вне форума

По умолчаниюзапись переменной в флеш память плк

подскажите как записать переменную в флеш память плк а потом прочитать ее оттуда или может по другому как то может в файл текстовый сохранить а потом оттуда прочитать состояние переменных или как то по другому

04.03.2012, 12:04 #2

nalnik вне форума

Пользователь Регистрация 17.12.2007 Сообщений 108

По умолчанию

Плк 150 запись и чтение.
Создается файл с именем переменной.
Постоянно перезаписывать файл нельзя— упорите флеш.

зап:
dwHandle := SysFileOpen(‘Pr_XX.t’,’

Последний раз редактировалось nalnik; 15.07.2015 в 12:22 .

04.03.2012, 12:12 #3

alexval2006 вне форума

Пользователь Регистрация 23.01.2008 Адрес Белгородская область, Валуйки Сообщений 274

По умолчанию

спасибо попробую

06.03.2012, 12:47 #4

Yegor вне форума

Пользователь Регистрация 13.10.2011 Адрес Златоуст Сообщений 1,021

По умолчанию

См. в справке RETAIN.

13.12.2012, 15:12 #5

mkhm вне форума

Пользователь Регистрация 08.12.2012 Сообщений 26

По умолчанию

ЦитатаСообщение от nalnik Посмотреть сообщение

Плк 150 запись и чтение.
Создается файл с именем переменной.
Постоянно перезаписывать файл нельзя— упорите флеш.

зап:
dwHandle := SysFileOpen(‘Pr_XX.t’,’w’);
SysFileWrite(dwHandle,ADR(Pr_XX),SIZEOF(Pr_XX));
SysFileClose(dwHandle);

Чтение:
dwHandle := SysFileOpen(‘Pr_XX.t’,’r’);
SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)-1);
SysFileClose(dwHandle);

Работает.
Pr_XX — имя переменной
SysLibFile.lib — добавь библиотеку.

SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)); — минус один, видимо, по ошибке

13.12.2012, 21:13 #6

nalnik вне форума

Пользователь Регистрация 17.12.2007 Сообщений 108

По умолчанию

нет это не ошибка!

13.12.2012, 21:47 #7

mkhm вне форума

Пользователь Регистрация 08.12.2012 Сообщений 26

По умолчанию

ЦитатаСообщение от nalnik Посмотреть сообщение

нет это не ошибка!

Сегодня проверял на ПЛК 100. Без -1 — работает, написал список переменных в файл. С -1 например UInt,Word работает до 255, так как из двух записанных байт восстанавливает один (из 4 -3, из 8 -7). Есть варианты когда можно проигнорировать целый байт?

19.12.2012, 23:39 #8

S.A.D. вне форума

Пользователь Регистрация 28.10.2010 Сообщений 277

По умолчанию

объясните тупому, что здесь делает переменная dwHandle? Какая-то индикация то файл открылся? Тогда зачем её пихать в функцию записи?
И еще, может кто подскажет как единоразово при включении ПЛК считать значение переменной из файла? откуда взять индикацию того что ПЛК включился после пропадания питания? Мне нужно примерно раз в 12 часов писать значение наработки двигателей во флеш и в случае пропадания питания или перезаливки проекта\сброса плк (когда RETAIN переменные слетают или могут слететь) восстанавливать это значение в программе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *