Jump to content
Sign in to follow this  
sys

FM24С64 и FM24С04, запись- чтение

Recommended Posts

        Потребовалась в проекте простая и долгоживущая память для вобщем- то небольшого количества данных, на случай сбоя по питанию. Работа ограничивалась записью текущих изменяющихся значений и восстановлением при включении. При неспешной записи несколько раз в минуту, ресурс ATMEGA328 выбирался за 2 года гарантированной записи её родной EEPROM, происходившей по кольцу, что не очень радовало.

        Отступление небольшое, в нете читал статью где этот чип подвергался повышенным напряжением в 7- 9В и при снижении опять начинал работать, так это правда, случайно проверил. Ещё тестили количество циклов чтения- записи, реально намного превышает количество заявленное производителем, но у меня не тот случай где можно на это надеяться.

Присутствовал на борту модуль с Алиекспресса с DS3231,  на нём имелась память 24С32. Ввиду чрезвычайного удобства (модуль два в одном, и часы и память, общая шина IIC/TWI) эта микросхема использовалась для вышеуказанных целей очень долгое время. А потом всё устройство обрастало свистелками- перделками многочисленными датчиками  и подвергалось давлению перфекционизма. Времени для записи, по даташиту  10ms, стало слишком много и в обрез оставалось для основной работы программы. Я посмотрел в сторону FRAM.

       Были заказаны на том же Али FM24С64 и 04. Частота работы до 1 Мгц,  выпускаются в вариантах 5 и 3,3В, объёма, учитывая количество циклов записи- чтения 10 в 12-й степени хватало. Перепробовав безуспешно адаптировать несколько библиотек, для обычных 24СХХ, решил написать подпрограммы, напрямую работая со встроенной библиотекой Wire Arduino IDE (https://www.arduino.cc/en/Reference/Wire). Этими скетчами проверял присланные микросхемы.

Для FM24C04:

#include <Wire.h>
byte iich = 0x50;// адрес устройства
unsigned int address = 0;
byte datawrite = 0x77;// чем заполнить ячейки памяти

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock (400000);// скорость шины, от 3,3В через конвертер уровней TXS0108 тоже работают

  for (address = 0; address < 512; address ++ ) {  // цикл для записи в память
    iic_write (address, datawrite);    
  }
  for (address = 0; address < 512; address ++ ) { // цикл для чтения из памяти

    Serial.println ();
    Serial.print (address);
    Serial.print ("--");
   Serial.print (iic_read (address),HEX);
    Serial.print ("--");   
  }
}
/////////////////////////////////////////////////////
  void loop() {
  }
/////////////////////////////////////////////////////
  
unsigned int iic_read (unsigned int adrd) {
    Wire.beginTransmission(iich);
    Wire.write(adrd);
    Wire.requestFrom(iich, 1);
    return  Wire.read();
    Wire.endTransmission();
  }
 void iic_write ( unsigned int adwr, byte dat) {
    Wire.beginTransmission(iich);
    Wire.write(adwr);
    Wire.write(dat);
    Wire.endTransmission();
  }

 

Для  FM24С64 меня ждали несколько шикарных, испытанных временем граблей.

Перерыт инет, перечитан даташит. Внутренний подтягивающий к земле резистор  internally pulled down достаточно велик для уровня наводки, воспринимаемой как логический "0" или "1". Поэтому вывод WP- обязательно к земле наикратчайшим  проводом, тем более если это "сопли" на разъёмах на столе. То- же о выводах А0-А2, висящие в воздухе они давали несколько несуществующих адресов. Почему- то это не касается FM24C04 и я попался на этом чипе.

Подпрограммы изменились, для чтения:

unsigned int iic_read (unsigned int adrd) {
  Wire.beginTransmission(iich);
  Wire.write(adrd >> 8);// старший байт
  Wire.write(adrd & 0xFF);//младший байт
  Wire.requestFrom(iich, 1);
  if (Wire.available()) {
    return  Wire.read();
  }
  Wire.endTransmission();
}


для записи:

void iic_write ( unsigned int adwr, byte dat) {
  Wire.beginTransmission(iich);
  Wire.write(adwr >> 8);
  Wire.write(adwr & 0xFF);
  Wire.write(dat);
  Wire.endTransmission();
}

Работа 5В версии (FM24C64-G) при питании 3,3В и скорости шины 400000 стабильна, что рекомендовать к работе конечно нельзя.

По поводу  FM24C64 (подозреваю что и С32 ,  С128,  С256) коротко и ясно написано на https://forum.arduino.cc/index.php?topic=18946.0 пользователь alicemirror объясняет как работает чтение у этих микросхем, а поскольку они прямая замена для, например, АТ24С64, то и для них это справедливо.  Дело в том, что данные из микросхемы "выстреливаются" далее без указания адреса с его автоинкрементом самой микросхемой после подтверждения от ведущего. Эту прыть и надо останавливать при получении байта :-)  и способ адресации отличается от младших, с меньшим объёмом.

   Интересных всем проектов!

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

  • Similar Content

    • By jonytvester
      Есть у меня два блока питания один на 35kV второй на 65kV, у обоих присутствует порт аналогового программирования 0-10 v (смотрите  прикрепленный мануал ), я ищу умельца который сможет выполнить описанную ниже задачу. возможно есть уже готовое решение ? 
      Задача состоит из двух частей 
      Железо которое должно подключатся с одной стороны  к блоку питания FUG(мануал во вложении ) выдавая от 0-10V , а с другой стороны к ПК через юсб Программа , в которой будет возможно калибровать выходное напряжение блока питания  в зависимости от подключенного БП, возможность повышать/понижать  напряжение постепенно , таймер на выключение/ включение блока питания  .  Analog_programming.pdf
    • By Gor_Th
      Доброго времени суток.

      Есть ли здесь знатоки, кто мог бы на пальцах объяснить работу минут в часах с видео? а еще лучше подсказать, где можно найти схему и код на подобное. (Имеются часы: плоская дощечка длинною в 30см на которой зажигаются минуты. То есть нужна схема, при которой индикаторы зажигаются поочередно.)
      Я в этом деле полный профан и начал копаться в "ардуинах" с неделю назад. Если я правильно понимаю можно получить данный эффект с помощью часов реального времени (например DS 3231) подключенных к arduino и 60 светодиодов подключенных через сдвиговые резисторы плюс, разумеется, должен быть будильник и кнопки которые этим всем оркестром будут управлять, так?
      Реально ли найти готовые схему подключения и сам код работы подобных часов?
      PS: Если кто даст буду крайне благодарен (мало ли у кого-то завалялось).

      lineclock1.mp4
    • Guest Игорь
      By Guest Игорь
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Антон Знаенок
      Доброго времени суток, уважаемые!
      Собираю реле на оптопара с симисторным выходом moc3063 и семисторе bt136-600e.
      В оригинальной схеме используется вместо bt136, bt138 но такого семистора под рукой нет.
      (оригинальная схема во вложении)
      Помогите пожалуйста понять, как нужно расчитывать сопротивления от оптопары идущие к семистору.
      С сопротивлениями указанными в схеме bt136 не открывается.

    • By deniszhur
      Добрый день, уважаемые знатоки, обращаюсь за помощью, поскольку сам уже в отчаянии найти причину, просто бьюсь головой об стену
      проект у меня предельно простой: беспроводной термометр с дисплеем на Arduino
      Для беспроводной передачи использовал имеющиеся дешевые модули на частоте 434 MhZ (https://www.sparkfun.com/products/10532,  https://www.sparkfun.com/products/retired/8946)
      Схема работы следующая:
      передатчик забирает показания температуры с 2х датчиков и передает их раз в 5 минут приемник ловит и выводит показания на 2 7-сегментных дисплея, драйвером для которых используется MAX-7219 Проблема следующая: включаю приемник и передатчик, пока дисплеи не работают, первый прием показаний происходит без проблем, на большой дистанции
      Когда начинают работать дисплеи, дальность приёма ЗНАЧИТЕЛЬНО сокращается, т.е. на той необходимой дистанции, на которой сработал первый прием, второй и последующие уже не проходят. При этом, если расположить устройства поблизости, прием нормально работает и обновляет значения на дисплеях.
      В чем может быть проблема? В недостаточной мощности питания? Но у меня БП на 500ма, и я запитал приемник напрямую от разъема питания (5в).
      Возможно, я упускаю что-то очевидное для более опытных радиолюбителей? Если необходима схема, я выложу
      Очень прошу помочь, у меня уже опускаются руки, а ведь я уже перевел всю схему на печатную плату и запаял, жалко выбрасывать проект, в который вложено так много усилий
×
×
  • Create New...