Советую детальку (eeprom fram)

Тема в разделе "Посоветуйте детальки", создана пользователем ostrov, 10 ноя 2018.

  1. parovoZZ

    parovoZZ Гуру

    у жены фен возьми, когда она им волосы не сушит тока. А то под хвоста получишь.
     
  2. parovoZZ

    parovoZZ Гуру

    SPI хорош. И быстрее. 20 МГц супротив 1 МГц у атсаси - это хорошо!
    Меня напрягает одно - если закладывать в нее табличные данные, то как это осуществить на производстве?
    Ну и жрет она овердохрена - 1 микроанпер в стандбае при батареечном питалове ни в какие ворота. Т.е. её придеца атключать.
     
  3. ostrov

    ostrov Гуру

    Включил, считал/записал, выключил.
     
    Igor68 нравится это.
  4. Igor68

    Igor68 Гуру

    Извратитесь с кодом Хемминга. Эффективно и очень достойно если раскидаете содержимое (результат кода) по разным местам. Если мало данных самое то!
    https://habr.com/post/140611/
    https://habr.com/post/357666/
    https://habr.com/sandbox/24489/
    http://www.programmersforum.ru/showthread.php?t=147643
     
    parovoZZ нравится это.
  5. ostrov

    ostrov Гуру

    Видел, тоже программный вариант райда первого. Примерно его и слелал, только проще и нагляднее, когда запас емкости есть так нормально.
     
  6. parovoZZ

    parovoZZ Гуру

    я согласна только на элсисоси. У других китайцев могу только что разъем покупать.
     
  7. ИгорьК

    ИгорьК Гуру

    upload_2018-11-15_18-22-51.png
    что-то новенькое...
     
  8. DetSimen

    DetSimen Guest

    Ну я иногда тоже пишу, что "я согласно"
     
    NikitOS нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Ну ты то грущик. И аолбанский знаешь.
     
    issaom и DetSimen нравится это.
  10. ostrov

    ostrov Гуру

    Можно подробностей? Что логиного при записи в ячейку 0x01 обнуление в 0x00?
     
  11. b707

    b707 Гуру

    я вижу. вы свой ошибочный код уже убрали. А без него трудно...
    Насколько я помню, вы же писали так - сначала адрес устройства 0x50. потом два байта адреса, потом байт данных. А поскольку на самом деле в адресе только один байт, то второй уже записывался в ЕЕПРОМ, а после него - данные. Вот и выходило, что первая ячейка обнулялась и только следующая записывалась правильно.

    Если хотите точно разобраться - выложите снова тот ошибочный код, которым вы писали байты - и сравните с правильным. Я думаю, вы сами увидите, какие ячейки обнулялись и почему.
     
  12. ostrov

    ostrov Гуру

    Просто три байта вместо одного, вот и вся разница. Должны были записаться второй и третий. А ноль откуда? А при чтении как обнулялось?
     
  13. b707

    b707 Гуру

    Вы на меня нападаете, как будто я вас в чем-то обманул :)

    Если Вас действительно интересует этот вопрос - давайте разбираться.
    У Вас же сохранился тот код, которым вы пытались писать и читать по три байта?
    Ну вот - делаем так.
    1. Забиваем страницу ЕЕПРОМ нулями или 0xFF(правильным алгоритмом)
    2. Берете тот "неправильный" код, которым вы пользовались, пишете им байт в ЕЕПРОМ.
    3. Потом читаете "правильным кодом" этот и соседние байты до и после записанных ячеек
    4. Потом читаете эти же ячейки "неправильным кодом"

    Все три кода и все три блока данных - записанные и считанные - выкладываете сюда. Хотя я на 95% уверен. что вы и без меня увидите, что там все "логично"
     
    DetSimen нравится это.
  14. ostrov

    ostrov Гуру

    Не нападаю я вовсе, не знаю почему такое впечатление сложилось. Хочу понять почему даташит, фрагмент из которого кто то здесь приводил выше, кстати, вообще не соответствует реальности. Хотя, эта микросхема в нем перечислена. Кому в этом мире верить вообще, если не даташиту? ) Разобраться методом последовательного приближения (тыка), конечно можно рано или поздно, спасибо что сэкономили время.

    А запись и чтение отличаются тем же количеством байт, в записи после адреса идет записываемый, в чтении ничего не идет, а ожидается ответ, потому и порча содержимого.
     
  15. b707

    b707 Гуру

    Даташит,, который обсуждался тут в ветке, "не соответсвует реальности" по простой причине - он относился к памяти FM24CL64, в то время как у вас FM24CL16. Даташит на память 64кбит , очевидно, не очень подходит к памяти 16 Кбит, потому что у них разные принципы адресации.
    Вот ссылка на даташит для 16Кбит
    - вы легко можете убедится, что этот даташит как раз соответвует тому коду, который правильно работает с вашей памятью. В этом даташите используется адресация из двух байт, а не из трех - см схему 6 на странице 6
     
    ostrov нравится это.
  16. ostrov

    ostrov Гуру

    Вот доработал до чтения-записи любых типов данных, включая массивы и структуры.

    Код (C++):
    // пример использования FRAM FM24C16 для длюбых типов данных влючая массивы и структуры
    // завись только по четным адресам
    // проверено на FM24C16BG - 8 страниц 0x50-0x57, в каждой 256 байт,  адресация 0-255 (256==0 и так далее)
    // вопросы и предложения: ostrov http://forum.amperka.ru/

    #include <Wire.h>

    #define disk1 0x50   //страницы FM24C
    #define disk2 0x51
    #define disk3 0x52
    #define disk4 0x53
    #define disk5 0x54
    #define disk6 0x55
    #define disk7 0x56
    #define disk8 0x57

    struct vvv {
      byte a;
      int b;
      long c;
    };
    struct vvv abc;
    struct vvv cab;

    void setup(void) {
      Wire.begin();
      Serial.begin(9600);

      // пишем данные
      int a = -12345;
      FM24C_write(disk1, 0, &a, sizeof(a));
      unsigned long aa = 12345678;
      FM24C_write(disk1, 10, &aa, sizeof(aa));
      abc.a = 10;
      abc.b = 100;
      abc.c = 1000;
      FM24C_write(disk5, 0, &abc, sizeof(abc));

      // читаем данные
      int b;
      FM24C_read(disk1, 0, &b, sizeof(b));
      Serial.println(b);
      unsigned long bb;
      FM24C_read(disk1, 10, &bb, sizeof(bb));
      Serial.println(bb);
      FM24C_read(disk5, 0, &cab, sizeof(cab));
      Serial.println(cab.a);
      Serial.println(cab.b);
      Serial.println(cab.c);


      // пишем массив
      char hello[] = "hello, World!";
      FM24C_write(disk4, 0, &hello, sizeof(hello));

      // читаем массив
      char hhh[20];
      FM24C_read(disk4, 0, &hhh, sizeof(hhh));
      Serial.println(hhh);
    }

    void loop() {}


    // -------------- функции чтение-запись ------------

    void FM24C_write(byte disk, byte startAddress, void *data, unsigned int len) { // disk - 0x50-0x57, startAddress - 0x00 - 0xFF, &data - первый байт данных, len - колво байт данных (sizeof(data))
      Wire.beginTransmission(disk);
      Wire.write(startAddress);
      Wire.write((byte*)data, len);
      Wire.endTransmission();
      delay(1);
    }

    int FM24C_read(byte disk, byte startAddress, void *data, unsigned int len) { // возвращаем кол-во считанных байт
      byte rdata;
      byte *p;
      Wire.beginTransmission(disk);
      Wire.write(startAddress);
      Wire.endTransmission();
      Wire.requestFrom(disk, len);
      for (rdata = 0, p = (byte*)data; Wire.available() && rdata < len; rdata++, p++) {
        *p = Wire.read();
      }
      return (rdata);
    }
     
  17. ostrov

    ostrov Гуру

    Для любителей цифр: массив из 14 элементов пишется примерно 1.8 мс, читается примерно так же.

    Вот запись числа int. Адрес и два байта данных.
    [​IMG]
     
    Последнее редактирование: 18 ноя 2018
    ИгорьК нравится это.
  18. save.l

    save.l Нерд

    еще бы проверку на превышение буфера...
     
  19. UdAvSt

    UdAvSt Нуб

    купил не подумав, теперь не знаю, как её к ESP32 приспособить, она при 3v3 по даташиту не работает, а у меня больше в конструкции и нету (
     
  20. b707

    b707 Гуру

    А вы попробуйте, может и хватит ей 3.3
    Я ее подключал и тестировал с платой СТМ32, там тоже 3.3 в - все работало великолепно
     
    NikitOS нравится это.