FRAM

inspiritus
Offline
Зарегистрирован: 17.12.2012

Здравствуйте.

первоисточник https://github.com/nw-wind/FM24I2C    https://habr.com/ru/post/319336/

библиотеки

#include "Wire.h"

#if ARDUINO >= 100
 #include <Arduino.h>
#else
 #include <WProgram.h>
#endif

#ifndef _FM24I2C_H_
#define _FM24I2C_H_

class FM24I2C {
  private:
    int id;
  public:
    FM24I2C(int id_addr);
    ~FM24I2C();
    void pack(int addr, void* data, int len);     // Pack data into FRAM
    int unpack(int addr, void* data, int len);    // Unpack data from FRAM. Returns number of bytes read.
    void inline writeUnsignedLong(int addr, unsigned long data) {
      pack(addr, (void*)&data, sizeof(unsigned long));
    } 
    unsigned long inline readUnsignedLong(int addr) {
      unsigned long data;
      return unpack(addr, (void*)&data, sizeof(unsigned long)) == sizeof(unsigned long) ? data : 0UL;
    }
};

#endif
int#include "FM24I2C.h"

FM24I2C::FM24I2C(int id_addr) {
  id=id_addr;
}

FM24I2C::~FM24I2C() {}

void FM24I2C::pack(int addr, void* data, int len) {
  Wire.beginTransmission(id);
  Wire.write((byte*)&addr,2);
  Wire.write((byte*)data,len);
  Wire.endTransmission(true);
}

int FM24I2C::unpack(int addr, void* data, int len) {
  int rc;
  byte *p;
  Wire.beginTransmission(id);
  Wire.write((byte*)&addr,2);
  Wire.endTransmission(false);
  Wire.requestFrom(id,len);
  for (rc=0, p=(byte*)data; Wire.available() && rc < len; rc++, p++) {
    *p=Wire.read();
  }
  return(rc);
}

Продолжу во втором топике.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Начну с того, что приложенный пример неправилен, там вытряхивается в сериал не буфер, а исходные массивы.

Если вытряхивать буфер, то там ничто.

писал разные тесты, чтобы вытряхивать элементы массива структур.

#include "FM24I2C.h"
#define arr 27

FM24I2C fm(0x50);
struct condition
{
  uint32_t counter;
  float duration;
  float average;
  uint8_t avail;
  uint8_t mod_reset; 
};

condition tpa_status[arr];
condition buff ;

unsigned long rc =0;

void setup() {
  
    Serial.begin(115200);

uint32_t size_my = sizeof(struct condition);
    Serial.print("size of structure = "); Serial.println(size_my); 
    Serial.println(" -----------------Filling array----------------");  
    
for (int i =0; i<arr; i++){
  tpa_status[i].counter   = i+500;
  tpa_status[i].duration  = i+400;
  tpa_status[i].average   = i+300;
  tpa_status[i].avail     = i+100;
  tpa_status[i].mod_reset = i; 

                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();

}
    Serial.println(" -----------------Writing fram from array-------------------");  
    
  Wire.begin();
unsigned int adress=0;
/*
for (int i =0; i<arr; i++){
  fm.pack(adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;
}
*/
/*for (int i =0; i<arr; i++){
  buff.counter   = tpa_status[i].counter;
  buff.duration  = tpa_status[i].duration;
  buff.average   = tpa_status[i].average;
  buff.avail     = tpa_status[i].avail;
  buff.mod_reset = tpa_status[i].mod_reset; 
Serial.print(adress);Serial.print("-->");  
  fm.pack(adress,(void*)&buff,size_my);
  adress=adress+size_my; 
}*/
  fm.pack(0,(void*)&tpa_status[0],size_my);
  fm.pack(14,(void*)&tpa_status[1],size_my);
  fm.pack(28,(void*)&tpa_status[2],size_my);
  fm.pack(42,(void*)&tpa_status[3],size_my);
  fm.pack(56,(void*)&tpa_status[4],size_my);

  Serial.println("");
  delay(5);
    Serial.println(" -----------------Filling array by zero-------------------");  

for (int i =0; i<arr; i++){
  tpa_status[i].counter   = 0;
  tpa_status[i].duration  = 0;
  tpa_status[i].average   = 0;
  tpa_status[i].avail     = 0;
  tpa_status[i].mod_reset = 0; 

                      Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();
} 
    Serial.println(" -----------------Reading fram to array-------------------");  

adress=0;
/*
//так не работает
for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;       
}
*/

//так не работает тоже с теми же симптомами
/*for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&buff,size_my);
  adress=adress+size_my;
  
  tpa_status[i].counter   = buff.counter;
  tpa_status[i].duration  = buff.duration;
  tpa_status[i].average   = buff.average;
  tpa_status[i].avail     = buff.avail;
  tpa_status[i].mod_reset = buff.mod_reset;          
}*/
  rc = rc + fm.unpack(0,(void*)&tpa_status[0],size_my);   // так нормально пишется эта запись
  rc = rc + fm.unpack(14,(void*)&tpa_status[1],size_my);
  rc = rc + fm.unpack(28,(void*)&tpa_status[2],size_my);
  rc = rc + fm.unpack(42,(void*)&tpa_status[3],size_my);   // и почему то эта 
  rc = rc + fm.unpack(56,(void*)&tpa_status[4],size_my);

   
for (int i =0; i<arr; i++){
                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" ");
                    Serial.println(); 
}
    Serial.println(" ------------------alles------------------------");  
    Serial.print("rc = "); Serial.println(rc);  
    
}

void loop() {
  // put your main code here, to run repeatedly:

}
size of structure = 14
 -----------------Filling array----------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 301.00 101 1 
2-->502 402.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->504 404.00 304.00 104 4 
5-->505 405.00 305.00 105 5 
6-->506 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
 -----------------Writing fram from array-------------------

 -----------------Filling array by zero-------------------
0-->0 0.00 0.00 0 0 
1-->0 0.00 0.00 0 0 
2-->0 0.00 0.00 0 0 
3-->0 0.00 0.00 0 0 
4-->0 0.00 0.00 0 0 
5-->0 0.00 0.00 0 0 
6-->0 0.00 0.00 0 0 
7-->0 0.00 0.00 0 0 
8-->0 0.00 0.00 0 0 
9-->0 0.00 0.00 0 0 
10-->0 0.00 0.00 0 0 
11-->0 0.00 0.00 0 0 
12-->0 0.00 0.00 0 0 
13-->0 0.00 0.00 0 0 
14-->0 0.00 0.00 0 0 
15-->0 0.00 0.00 0 0 
16-->0 0.00 0.00 0 0 
17-->0 0.00 0.00 0 0 
18-->0 0.00 0.00 0 0 
19-->0 0.00 0.00 0 0 
20-->0 0.00 0.00 0 0 
21-->0 0.00 0.00 0 0 
22-->0 0.00 0.00 0 0 
23-->0 0.00 0.00 0 0 
24-->0 0.00 0.00 0 0 
25-->0 0.00 0.00 0 0 
26-->0 0.00 0.00 0 0 
 -----------------Reading fram to array-------------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 293.00 101 1 
2-->6 386.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->0 404.00 304.00 96 4 
5-->0 0.00 0.00 0 0 
6-->0 0.00 0.00 0 0 
7-->0 0.00 0.00 0 0 
8-->0 0.00 0.00 0 0 
9-->0 0.00 0.00 0 0 
10-->0 0.00 0.00 0 0 
11-->0 0.00 0.00 0 0 
12-->0 0.00 0.00 0 0 
13-->0 0.00 0.00 0 0 
14-->0 0.00 0.00 0 0 
15-->0 0.00 0.00 0 0 
16-->0 0.00 0.00 0 0 
17-->0 0.00 0.00 0 0 
18-->0 0.00 0.00 0 0 
19-->0 0.00 0.00 0 0 
20-->0 0.00 0.00 0 0 
21-->0 0.00 0.00 0 0 
22-->0 0.00 0.00 0 0 
23-->0 0.00 0.00 0 0 
24-->0 0.00 0.00 0 0 
25-->0 0.00 0.00 0 0 
26-->0 0.00 0.00 0 0 
 ------------------alles------------------------
rc = 70

 

уже от отчаяния стал закидывать по одной структуре (лимит 32 байта для Wire). все равно какая то хрень.

такое ощущение, что неправильно адресуется сама микросхема FRAM, лопатил библиотеку по принципу EEPROMовских, все равно не пашить.

это вроде что то делает , но делает и за пределами адресного пространства 8192

/*
 * \brief Check consistency of I2C EEPROM
 *
 * It will write test values in the entire EEPROM and try to read them.
 * All errors will be displayed.
 *
 * \author Quentin Comte-Gaz <quentin@comte-gaz.com>
 * \date 29 June 2016
 * \license MIT License (contact me if too restrictive)
 * \copyright Copyright (c) 2016 Quentin Comte-Gaz
 * \version 1.0
 */

#include <I2CEEPROM.h>

#define CHIP_ADDRESS 0x50 // Address of EEPROM chip (24LC256->0x50)
#define EEPROM_BYTES 8191 // Number of bytes in EEPROM chip

I2CEEPROM i2c_eeprom(CHIP_ADDRESS); // Create I2C EEPROM instance

void setup(void)
{
  Serial.begin(115200);

  // Variables
  Serial.print("CHIP_ADDRESS=0x");
  Serial.print(CHIP_ADDRESS, HEX);
  Serial.print("\n");

  Serial.print("EEPROM_BYTES=");
  Serial.print(EEPROM_BYTES, DEC);
  Serial.print("\n\n");

  Serial.print("This test will: \n -Write all the EEPROM\n -Read all the EEPROM and check consistency\n\n");
  // For even more extended test, you may write values ("writeTest()"), reboot and read values ("readTest()")
  // This would ensure that the EEPROM is holding values even after a reboot.

  Serial.print("Beginning EEPROM check-up...\n");

  writeTest();

  Serial.print("EEPROM check-up done\n");
}

void loop()
{
}

/*!
 * \brief Write all bytes in I2C EEPROM for test scenario
 */
void writeTest(void)
{
  unsigned int data = 0;
  unsigned int errors = 0;
    
  Serial.print("Writing test values in EEPROM...\n");
  for (unsigned int address = 0; address < EEPROM_BYTES; address++) {
//    i2c_eeprom.write(address, address & 0xFF);

    data = i2c_eeprom.read(address);
      Serial.print(data , HEX);         Serial.print(" "); 
    if ((data%256) == 0) Serial.print("\n");
    if ((address%1024) == 0) {
      Serial.print(address, HEX);
      Serial.print("/");
      Serial.print(EEPROM_BYTES, HEX);
      Serial.print(" bytes done\n");
    }

/*        if (data != address & 0xFF) {
      errors++;
      Serial.print("Error on address ");
      Serial.print(address, HEX);
      Serial.print(" : data in EEPROM is ");
      Serial.print(data, HEX);
      Serial.print(" while it should be ");
      Serial.print(address & 0xFF, HEX);
      Serial.print("\n");
    }*/

    if ((address%1024) == 0) {
      Serial.print(address, HEX);
      Serial.print("/");
      Serial.print(EEPROM_BYTES, HEX);
      Serial.print(" bytes done\n");
    }
  }
}

памажите чем можите :) сильно хочется писать состояние много много раз, не думая о ресурсе записей

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Может просто микроскхема нерабочая? И вообще что именно и как подключено?

ВН
Онлайн
Зарегистрирован: 25.02.2016

как писал первоисточник, "Протокол i2c для FRAM сильно проще, чем для EEPROM"

так попробуйте как для EEPROM, поскольку под видом фрам часто продают перемаркер 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Подключена обычно , i2c- 5 и 6 ноги, 1,2,3,4 ноги вместе дабы 50 адрес, 8 нога питание.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вроде в чипдипе покупал, не должен быть перемаркер.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Еепром библиотеку попробовал , выше написано.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

inspiritus пишет:

Подключена обычно , i2c- 5 и 6 ноги, 1,2,3,4 ноги вместе дабы 50 адрес, 8 нога питание.

Ну, пин 1 вообще-то лучше никуда не подключать. Пины адреса (2 и 3) pulled down,  так что их можно к земле и не подключать. А как это все к ардуине подключено и есть pull-up резисторы на линиях I2C?

b707
Онлайн
Зарегистрирован: 26.05.2017

inspiritus -  какого обьема микросхема?

Адресация на ФРАМках разного обьема делается по разному - похоже пейсатели библиотек этого не подозревают...

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

8kх8

конечно же i2c подтянуты.

эта библиотека вообще ея не видит

b707
Онлайн
Зарегистрирован: 26.05.2017

посмотрел даташит - похоже что библиотека правильная.

Есть подозрение, что у вас проблемы с выравниванием данных в структуре. Попробуйте для начала писать и читать однородный массив. скажем

uint16_t data[8]

Если ошибки пропадут - значит делов том, что ваша структура на самом деле не 14 байт

b707
Онлайн
Зарегистрирован: 26.05.2017

Добавлю - с год назад мы с sadman41 тестировали FRAM на число перезаписей. Никаких библиотек не использовали, писали напрямую через Wire. Сейчас посмотрел свой тогдашний код - он практически совпадает с кодом библиотеки в первом сообщении. Думаю, должен работать

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

#137

Ух ты!

А что на этом модуле fram стоит? Или eeprom?

inspiritus
Offline
Зарегистрирован: 17.12.2012

eeprom

inspiritus
Offline
Зарегистрирован: 17.12.2012

b707 пишет:

посмотрел даташит - похоже что библиотека правильная.

Есть подозрение, что у вас проблемы с выравниванием данных в структуре. Попробуйте для начала писать и читать однородный массив. скажем

uint16_t data[8]

Если ошибки пропадут - значит делов том, что ваша структура на самом деле не 14 байт

Хм.. странно

  uint32_t counter;                   =4
  float duration;                        =4
  float average;                        =4
  uint8_t avail;                         =1
  uint8_t mod_reset;                 =1
----------------------------------------
итого                                       14
inspiritus
Offline
Зарегистрирован: 17.12.2012

какая то мистика

увеличил вычисленную длину записи на 1, тк. у автора библы strlen(sabj)+1,

при этом если писать по одной записи в адреса 0, 14,28... но с увеличенной длиной, все ок,

а в автомате лажа

#include "FM24I2C.h"
#define arr 27

FM24I2C fm(0x50);
struct condition
{
  uint32_t counter;
  float duration;
  float average;
  uint8_t avail;
  uint8_t mod_reset; 
};

condition tpa_status[arr];
condition buff ;

unsigned long rc =0;

void setup() {
  
    Serial.begin(115200);
unsigned int adress=0;
uint32_t size_my = sizeof(struct condition)+1;

    Serial.print("size of structure = "); Serial.println(size_my); 
    Serial.println(" -----------------Filling array----------------");  
    
for (int i =0; i<arr; i++){
  tpa_status[i].counter   = i+500;
  tpa_status[i].duration  = i+400;
  tpa_status[i].average   = i+300;
  tpa_status[i].avail     = i+100;
  tpa_status[i].mod_reset = i; 

                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();

}
    Serial.println(" -----------------Writing fram from array-------------------");  
    
  Wire.begin();

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  fm.pack(adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;
}

/*for (int i =0; i<arr; i++){
  buff.counter   = tpa_status[i].counter;
  buff.duration  = tpa_status[i].duration;
  buff.average   = tpa_status[i].average;
  buff.avail     = tpa_status[i].avail;
  buff.mod_reset = tpa_status[i].mod_reset; 
Serial.print(adress);Serial.print("-->");  
  fm.pack(adress,(void*)&buff,size_my);
  adress=adress+size_my; 
}*/
/*  fm.pack(0,(void*)&tpa_status[0],size_my);
  fm.pack(14,(void*)&tpa_status[1],size_my);
  fm.pack(28,(void*)&tpa_status[2],size_my);
  fm.pack(42,(void*)&tpa_status[3],size_my);
  fm.pack(56,(void*)&tpa_status[4],size_my);
  fm.pack(70,(void*)&tpa_status[5],size_my);*/

  Serial.println("");
  delay(5);
    Serial.println(" -----------------Filling array by zero-------------------");  

for (int i =0; i<arr; i++){
  tpa_status[i].counter   = 0;
  tpa_status[i].duration  = 0;
  tpa_status[i].average   = 0;
  tpa_status[i].avail     = 0;
  tpa_status[i].mod_reset = 0; 

                      Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();
} 
    Serial.println(" -----------------Reading fram to array-------------------");  

adress=0;

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;       
}


//так не работает тоже с теми же симптомами
/*for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&buff,size_my);
  adress=adress+size_my;
  
  tpa_status[i].counter   = buff.counter;
  tpa_status[i].duration  = buff.duration;
  tpa_status[i].average   = buff.average;
  tpa_status[i].avail     = buff.avail;
  tpa_status[i].mod_reset = buff.mod_reset;          
}*/
  rc = rc + fm.unpack(0,(void*)&tpa_status[0],size_my);   // так нормально пишется эта запись
  rc = rc + fm.unpack(14,(void*)&tpa_status[1],size_my);
  rc = rc + fm.unpack(28,(void*)&tpa_status[2],size_my);
  rc = rc + fm.unpack(42,(void*)&tpa_status[3],size_my);   // и почему то эта 
  rc = rc + fm.unpack(56,(void*)&tpa_status[4],size_my);
  rc = rc + fm.unpack(70,(void*)&tpa_status[5],size_my);

   
for (int i =0; i<arr; i++){
                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" ");
                    Serial.println(); 
}
    Serial.println(" ------------------alles------------------------");  
    Serial.print("rc = "); Serial.println(rc);  
    
}

void loop() {
  // put your main code here, to run repeatedly:

}

но только до 7 элемента, далее ок

size of structure = 15
 -----------------Filling array----------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 301.00 101 1 
2-->502 402.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->504 404.00 304.00 104 4 
5-->505 405.00 305.00 105 5 
6-->506 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
 -----------------Writing fram from array-------------------

 -----------------Filling array by zero-------------------
0-->0 0.00 0.00 0 0 
1-->0 0.00 0.00 0 0 
2-->0 0.00 0.00 0 0 
3-->0 0.00 0.00 0 0 
4-->0 0.00 0.00 0 0 
5-->0 0.00 0.00 0 0 
6-->0 0.00 0.00 0 0 
7-->0 0.00 0.00 0 0 
8-->0 0.00 0.00 0 0 
9-->0 0.00 0.00 0 0 
10-->0 0.00 0.00 0 0 
11-->0 0.00 0.00 0 0 
12-->0 0.00 0.00 0 0 
13-->0 0.00 0.00 0 0 
14-->0 0.00 0.00 0 0 
15-->0 0.00 0.00 0 0 
16-->0 0.00 0.00 0 0 
17-->0 0.00 0.00 0 0 
18-->0 0.00 0.00 0 0 
19-->0 0.00 0.00 0 0 
20-->0 0.00 0.00 0 0 
21-->0 0.00 0.00 0 0 
22-->0 0.00 0.00 0 0 
23-->0 0.00 0.00 0 0 
24-->0 0.00 0.00 0 0 
25-->0 0.00 0.00 0 0 
26-->0 0.00 0.00 0 0 
 -----------------Reading fram to array-------------------
0-->500 400.00 300.00 100 0 
1-->132853 ovf -0.00 67 118 
2-->504 404.00 304.00 104 4 
3-->133879 ovf -0.00 67 122 
4-->508 408.00 308.00 108 8 
5-->134905 ovf -0.00 67 126 
6-->282 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
 ------------------alles------------------------
rc = 495

чуть исправил, но все равно странно - сначала криво, потом как надо.

#include "FM24I2C.h"
#define arr 27

FM24I2C fm(0x50);
struct condition
{
  uint32_t counter;
  float duration;
  float average;
  uint8_t avail;
  uint8_t mod_reset; 
};

condition tpa_status[arr];
condition buff ;

unsigned long rc =0;

void setup() {
  
    Serial.begin(115200);
unsigned int adress=0;
uint32_t size_my = sizeof(struct condition);

    Serial.print("size of structure = "); Serial.println(size_my); 
    Serial.println(" -----------------Filling array----------------");  
    
for (int i =0; i<arr; i++){
  tpa_status[i].counter   = i+500;
  tpa_status[i].duration  = i+400;
  tpa_status[i].average   = i+300;
  tpa_status[i].avail     = i+100;
  tpa_status[i].mod_reset = i; 

                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();

}
    Serial.println(" -----------------Writing fram from array-------------------");  
    
  Wire.begin();

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  fm.pack(adress,(void*)&tpa_status[i],size_my+1);
  adress=adress+size_my;
}

/*for (int i =0; i<arr; i++){
  buff.counter   = tpa_status[i].counter;
  buff.duration  = tpa_status[i].duration;
  buff.average   = tpa_status[i].average;
  buff.avail     = tpa_status[i].avail;
  buff.mod_reset = tpa_status[i].mod_reset; 
Serial.print(adress);Serial.print("-->");  
  fm.pack(adress,(void*)&buff,size_my);
  adress=adress+size_my; 
}*/
/*  fm.pack(0,(void*)&tpa_status[0],size_my);
  fm.pack(14,(void*)&tpa_status[1],size_my);
  fm.pack(28,(void*)&tpa_status[2],size_my);
  fm.pack(42,(void*)&tpa_status[3],size_my);
  fm.pack(56,(void*)&tpa_status[4],size_my);
  fm.pack(70,(void*)&tpa_status[5],size_my);*/

  Serial.println("");
  delay(5);
    Serial.println(" -----------------Filling array by zero-------------------");  

for (int i =0; i<arr; i++){
  tpa_status[i].counter   = 0;
  tpa_status[i].duration  = 0;
  tpa_status[i].average   = 0;
  tpa_status[i].avail     = 0;
  tpa_status[i].mod_reset = 0; 

                      Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();
} 
    Serial.println(" -----------------Reading fram to array-------------------");  

adress=0;

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&tpa_status[i],size_my+1);
  adress=adress+size_my;       
}


//так не работает тоже с теми же симптомами
/*for (int i =0; i<arr; i++){
  rc = rc + fm.unpack(adress,(void*)&buff,size_my);
  adress=adress+size_my;
  
  tpa_status[i].counter   = buff.counter;
  tpa_status[i].duration  = buff.duration;
  tpa_status[i].average   = buff.average;
  tpa_status[i].avail     = buff.avail;
  tpa_status[i].mod_reset = buff.mod_reset;          
}*/
  rc = rc + fm.unpack(0,(void*)&tpa_status[0],size_my);   // так нормально пишется эта запись
  rc = rc + fm.unpack(14,(void*)&tpa_status[1],size_my);
  rc = rc + fm.unpack(28,(void*)&tpa_status[2],size_my);
  rc = rc + fm.unpack(42,(void*)&tpa_status[3],size_my);   // и почему то эта 
  rc = rc + fm.unpack(56,(void*)&tpa_status[4],size_my);
  rc = rc + fm.unpack(70,(void*)&tpa_status[5],size_my);

   
for (int i =0; i<arr; i++){
                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" ");
                    Serial.println(); 
}
    Serial.println(" ------------------alles------------------------");  
    Serial.print("rc = "); Serial.println(rc);  
    
}

void loop() {
  // put your main code here, to run repeatedly:

}
size of structure = 14
 -----------------Filling array----------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 301.00 101 1 
2-->502 402.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->504 404.00 304.00 104 4 
5-->505 405.00 305.00 105 5 
6-->506 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
 -----------------Writing fram from array-------------------

 -----------------Filling array by zero-------------------
0-->0 0.00 0.00 0 0 
1-->0 0.00 0.00 0 0 
2-->0 0.00 0.00 0 0 
3-->0 0.00 0.00 0 0 
4-->0 0.00 0.00 0 0 
5-->0 0.00 0.00 0 0 
6-->0 0.00 0.00 0 0 
7-->0 0.00 0.00 0 0 
8-->0 0.00 0.00 0 0 
9-->0 0.00 0.00 0 0 
10-->0 0.00 0.00 0 0 
11-->0 0.00 0.00 0 0 
12-->0 0.00 0.00 0 0 
13-->0 0.00 0.00 0 0 
14-->0 0.00 0.00 0 0 
15-->0 0.00 0.00 0 0 
16-->0 0.00 0.00 0 0 
17-->0 0.00 0.00 0 0 
18-->0 0.00 0.00 0 0 
19-->0 0.00 0.00 0 0 
20-->0 0.00 0.00 0 0 
21-->0 0.00 0.00 0 0 
22-->0 0.00 0.00 0 0 
23-->0 0.00 0.00 0 0 
24-->0 0.00 0.00 0 0 
25-->0 0.00 0.00 0 0 
26-->0 0.00 0.00 0 0 
 -----------------Reading fram to array-------------------
0-->516 416.00 316.00 116 16 
1-->517 417.00 317.00 117 17 
2-->518 418.00 318.00 118 18 
3-->133111 ovf -0.00 67 119 
4-->133368 ovf -0.00 67 120 
5-->133625 ovf -0.00 67 121 
6-->133882 ovf -0.00 67 122 
7-->134139 ovf -0.00 67 123 
8-->134396 ovf -0.00 67 124 
9-->134653 ovf -0.00 67 125 
10-->134910 ovf -0.00 67 126 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
 ------------------alles------------------------
rc = 489

 

b707
Онлайн
Зарегистрирован: 26.05.2017

хм, а кто вас учил вот так вот ссылку на элемент массива записывать?

(void*)&tpa_status[i]

Компилятор не ругается, случаем?

inspiritus
Offline
Зарегистрирован: 17.12.2012

чуть исправленный пример автора


#include "FM24I2C.h"

FM24I2C fm(0x50);

void setup() {
  Wire.begin();
  Serial.begin(115200);
  char str1[]="12345678901234567890";
  char str2[]="qwertyuiopasdfghjklzxcvbnm";
  int a1=0x00;
  int a2=0x40;
  fm.pack(a1,str1,strlen(str1)+1);
  delay(5);
  fm.pack(a2,str2,strlen(str2)+1);
  delay(5);
  char buf[80];
  fm.unpack(a1,buf,strlen(str1)+1);
  Serial.println(buf);
  fm.unpack(a2,buf,strlen(str2)+1);
  Serial.println(buf);
}

void loop() {
  // put your main code here, to run repeatedly:

}

тоже показывает кривизну в адресации

qwertyuiopasdfghjklzxcvbnm
qwertyuiopasdfghjklzxcvbnm

кстати автор ответил, что есть непофикшенный баг в адресации, проблему он нашел, но некогда

и более на связь не выходил

такой способ обращения взял из примера для структуры с авторского поста с гитхаба, тоже удивился.

компилятор вообще молчок, даже если сообщения все включены











C:\Program Files (x86)\arduino-1.8.8\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\arduino-1.8.8\hardware -hardware C:\Users\main\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\arduino-1.8.8\tools-builder -tools C:\Program Files (x86)\arduino-1.8.8\hardware\tools\avr -tools C:\Users\main\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\arduino-1.8.8\libraries -libraries D:\For_WIN\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10808 -build-path C:\Users\main\TMP\arduino_build_64004 -warnings=all -build-cache C:\Users\main\TMP\arduino_cache_358927 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2 -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2 -prefs=runtime.tools.arduinoOTA.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.2.1 -prefs=runtime.tools.arduinoOTA-1.2.1.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.2.1 -prefs=runtime.tools.avrdude.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14 -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14 -verbose C:\Users\main\TMP\arduino_modified_sketch_45570\FRAM_test3.ino
C:\Program Files (x86)\arduino-1.8.8\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\arduino-1.8.8\hardware -hardware C:\Users\main\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\arduino-1.8.8\tools-builder -tools C:\Program Files (x86)\arduino-1.8.8\hardware\tools\avr -tools C:\Users\main\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\arduino-1.8.8\libraries -libraries D:\For_WIN\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10808 -build-path C:\Users\main\TMP\arduino_build_64004 -warnings=all -build-cache C:\Users\main\TMP\arduino_cache_358927 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2 -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2 -prefs=runtime.tools.arduinoOTA.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.2.1 -prefs=runtime.tools.arduinoOTA-1.2.1.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.2.1 -prefs=runtime.tools.avrdude.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14 -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=C:\Users\main\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14 -verbose C:\Users\main\TMP\arduino_modified_sketch_45570\FRAM_test3.ino
Using board 'nano' from platform in folder: C:\Users\main\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23
Using core 'arduino' from platform in folder: C:\Users\main\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23
Detecting libraries used...
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10808 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\cores\\arduino" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\variants\\eightanaloginputs" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp" -o nul
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10808 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\cores\\arduino" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\variants\\eightanaloginputs" "-IC:\\Program Files (x86)\\arduino-1.8.8\\libraries\\FM24I2C-master" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp" -o nul
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10808 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\cores\\arduino" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\variants\\eightanaloginputs" "-IC:\\Program Files (x86)\\arduino-1.8.8\\libraries\\FM24I2C-master" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\libraries\\Wire\\src" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp" -o nul
Using cached library dependencies for file: C:\Program Files (x86)\arduino-1.8.8\libraries\FM24I2C-master\FM24I2C.cpp
Using cached library dependencies for file: C:\Users\main\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23\libraries\Wire\src\Wire.cpp
Using cached library dependencies for file: C:\Users\main\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23\libraries\Wire\src\utility\twi.c
Generating function prototypes...
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10808 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\cores\\arduino" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\variants\\eightanaloginputs" "-IC:\\Program Files (x86)\\arduino-1.8.8\\libraries\\FM24I2C-master" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\libraries\\Wire\\src" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp" -o "C:\\Users\\main\\TMP\\arduino_build_64004\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"C:\\Program Files (x86)\\arduino-1.8.8\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\main\\TMP\\arduino_build_64004\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Компиляция скетча...
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10808 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\cores\\arduino" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\variants\\eightanaloginputs" "-IC:\\Program Files (x86)\\arduino-1.8.8\\libraries\\FM24I2C-master" "-IC:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.23\\libraries\\Wire\\src" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp" -o "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp.o"
Compiling libraries...
Compiling library "FM24I2C-master"
Используем предварительно скомпилированный файл: C:\Users\main\TMP\arduino_build_64004\libraries\FM24I2C-master\FM24I2C.cpp.o
Compiling library "Wire"
Используем предварительно скомпилированный файл: C:\Users\main\TMP\arduino_build_64004\libraries\Wire\Wire.cpp.o
Используем предварительно скомпилированный файл: C:\Users\main\TMP\arduino_build_64004\libraries\Wire\utility\twi.c.o
Compiling core...
Using precompiled core: C:\Users\main\TMP\arduino_cache_358927\core\core_arduino_avr_nano_cpu_atmega328_1f539d0fe5f7630e625194039f66e88f.a
Linking everything together...
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.elf" "C:\\Users\\main\\TMP\\arduino_build_64004\\sketch\\FRAM_test3.ino.cpp.o" "C:\\Users\\main\\TMP\\arduino_build_64004\\libraries\\FM24I2C-master\\FM24I2C.cpp.o" "C:\\Users\\main\\TMP\\arduino_build_64004\\libraries\\Wire\\Wire.cpp.o" "C:\\Users\\main\\TMP\\arduino_build_64004\\libraries\\Wire\\utility\\twi.c.o" "C:\\Users\\main\\TMP\\arduino_build_64004/..\\arduino_cache_358927\\core\\core_arduino_avr_nano_cpu_atmega328_1f539d0fe5f7630e625194039f66e88f.a" "-LC:\\Users\\main\\TMP\\arduino_build_64004" -lm
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.elf" "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.eep"
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-objcopy" -O ihex -R .eeprom "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.elf" "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.hex"
Используем библиотеку FM24I2C-master в папке: C:\Program Files (x86)\arduino-1.8.8\libraries\FM24I2C-master (legacy)
Используем библиотеку Wire версии 1.0 из папки: C:\Users\main\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23\libraries\Wire 
"C:\\Users\\main\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\5.4.0-atmel3.6.1-arduino2/bin/avr-size" -A "C:\\Users\\main\\TMP\\arduino_build_64004/FRAM_test3.ino.elf"
Скетч использует 5030 байт (16%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 926 байт (45%) динамической памяти, оставляя 1122 байт для локальных переменных. Максимум: 2048 байт.

баг в адресации может быть двух видов

- формирование адреса для обращения к чипу

- передача сформированного адреса чипу

эти направления и ковыряю уже два дня.

b707
Онлайн
Зарегистрирован: 26.05.2017

inspiritus - зачем вам эта кривая библиотека? Добро бы там было что-то сложное - а то вся либа - это буквально 10 строк.

есть же даташит, возьмите да напишите прямо по нему. Жалко у меня FRAM на 4к бита - там принцип адресации чуть другой, а то я бы сам написал

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

нашел полезное обсуждение по теме

http://forum.amperka.ru/threads/Советую-детальку-eeprom-fram.16761/page-2

astwo
Offline
Зарегистрирован: 10.07.2019

Ну разумеется лучше организовать жёсткий диск с файлами, именами и расширением.

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

#include <Wire.h>
#define arr 80
#define fm_addr 0x50

struct condition
{
  uint32_t counter;
  float duration;
  float average;
  uint8_t avail;
  uint8_t mod_reset; 
};

condition tpa_status[arr];
condition buff ;

unsigned long rc =0;

void setup() {
    Wire.begin(); 
    Serial.begin(115200);
unsigned int adress=0;
uint32_t size_my = sizeof(struct condition);

    Serial.print("size of structure = "); Serial.println(size_my); 
    Serial.println(" -----------------Filling array----------------");  
    
for (int i =0; i<arr; i++){
  tpa_status[i].counter   = i+500;
  tpa_status[i].duration  = i+400;
  tpa_status[i].average   = i+300;
  tpa_status[i].avail     = i+100;
  tpa_status[i].mod_reset = i; 

                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                      Serial.println();

}
    Serial.println(" -----------------Writing fram from array-------------------");  
    
  Wire.begin();

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  fram_pack(fm_addr, adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;
}

  Serial.println("");
  delay(5);
    Serial.println(" -----------------Filling array by zero-------------------");  

for (int i =0; i<arr; i++){
  tpa_status[i].counter   = 0;
  tpa_status[i].duration  = 0;
  tpa_status[i].average   = 0;
  tpa_status[i].avail     = 0;
  tpa_status[i].mod_reset = 0; 

                      Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" "); 
                    Serial.println();
} 
    Serial.println(" -----------------Reading fram to array-------------------");  

adress=0;

//так заработало, но с 7 элемента
for (int i =0; i<arr; i++){
  rc = rc + fram_unpack(fm_addr, adress,(void*)&tpa_status[i],size_my);
  adress=adress+size_my;       
}
   
for (int i =0; i<arr; i++){
                    Serial.print(i);Serial.print("-->");
                    Serial.print(tpa_status[i].counter);Serial.print(" ");
                    Serial.print(tpa_status[i].duration);Serial.print(" ");
                    Serial.print(tpa_status[i].average);Serial.print(" ");
                    Serial.print(tpa_status[i].avail);Serial.print(" ");
                    Serial.print(tpa_status[i].mod_reset);Serial.print(" ");
                    Serial.println(); 
}
    Serial.println(" ------------------alles------------------------");  
    Serial.print("rc = "); Serial.println(rc);  
    
}

void loop() { }

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

int fram_unpack(byte disk, uint16_t startAddress, void *data, uint16_t len) { // возвращаем кол-во считанных байт
  byte rdata;
  byte *p;
  Wire.beginTransmission(disk);
  Wire.write(startAddress >> 8);
  Wire.write(startAddress & 0xFF);
  Wire.endTransmission();
  Wire.requestFrom(disk, len);
  for (rdata = 0, p = (byte*)data; Wire.available() && rdata < len; rdata++, p++) {
    *p = Wire.read();
  }
  return (rdata);
}
size of structure = 14
 -----------------Filling array----------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 301.00 101 1 
2-->502 402.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->504 404.00 304.00 104 4 
5-->505 405.00 305.00 105 5 
6-->506 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
27-->527 427.00 327.00 127 27 
28-->528 428.00 328.00 128 28 
29-->529 429.00 329.00 129 29 
30-->530 430.00 330.00 130 30 
31-->531 431.00 331.00 131 31 
32-->532 432.00 332.00 132 32 
33-->533 433.00 333.00 133 33 
34-->534 434.00 334.00 134 34 
35-->535 435.00 335.00 135 35 
36-->536 436.00 336.00 136 36 
37-->537 437.00 337.00 137 37 
38-->538 438.00 338.00 138 38 
39-->539 439.00 339.00 139 39 
40-->540 440.00 340.00 140 40 
41-->541 441.00 341.00 141 41 
42-->542 442.00 342.00 142 42 
43-->543 443.00 343.00 143 43 
44-->544 444.00 344.00 144 44 
45-->545 445.00 345.00 145 45 
46-->546 446.00 346.00 146 46 
47-->547 447.00 347.00 147 47 
48-->548 448.00 348.00 148 48 
49-->549 449.00 349.00 149 49 
50-->550 450.00 350.00 150 50 
51-->551 451.00 351.00 151 51 
52-->552 452.00 352.00 152 52 
53-->553 453.00 353.00 153 53 
54-->554 454.00 354.00 154 54 
55-->555 455.00 355.00 155 55 
56-->556 456.00 356.00 156 56 
57-->557 457.00 357.00 157 57 
58-->558 458.00 358.00 158 58 
59-->559 459.00 359.00 159 59 
60-->560 460.00 360.00 160 60 
61-->561 461.00 361.00 161 61 
62-->562 462.00 362.00 162 62 
63-->563 463.00 363.00 163 63 
64-->564 464.00 364.00 164 64 
65-->565 465.00 365.00 165 65 
66-->566 466.00 366.00 166 66 
67-->567 467.00 367.00 167 67 
68-->568 468.00 368.00 168 68 
69-->569 469.00 369.00 169 69 
70-->570 470.00 370.00 170 70 
71-->571 471.00 371.00 171 71 
72-->572 472.00 372.00 172 72 
73-->573 473.00 373.00 173 73 
74-->574 474.00 374.00 174 74 
75-->575 475.00 375.00 175 75 
76-->576 476.00 376.00 176 76 
77-->577 477.00 377.00 177 77 
78-->578 478.00 378.00 178 78 
79-->579 479.00 379.00 179 79 
 -----------------Writing fram from array-------------------

 -----------------Filling array by zero-------------------
0-->0 0.00 0.00 0 0 
1-->0 0.00 0.00 0 0 
2-->0 0.00 0.00 0 0 
3-->0 0.00 0.00 0 0 
4-->0 0.00 0.00 0 0 
5-->0 0.00 0.00 0 0 
6-->0 0.00 0.00 0 0 
7-->0 0.00 0.00 0 0 
8-->0 0.00 0.00 0 0 
9-->0 0.00 0.00 0 0 
10-->0 0.00 0.00 0 0 
11-->0 0.00 0.00 0 0 
12-->0 0.00 0.00 0 0 
13-->0 0.00 0.00 0 0 
14-->0 0.00 0.00 0 0 
15-->0 0.00 0.00 0 0 
16-->0 0.00 0.00 0 0 
17-->0 0.00 0.00 0 0 
18-->0 0.00 0.00 0 0 
19-->0 0.00 0.00 0 0 
20-->0 0.00 0.00 0 0 
21-->0 0.00 0.00 0 0 
22-->0 0.00 0.00 0 0 
23-->0 0.00 0.00 0 0 
24-->0 0.00 0.00 0 0 
25-->0 0.00 0.00 0 0 
26-->0 0.00 0.00 0 0 
27-->0 0.00 0.00 0 0 
28-->0 0.00 0.00 0 0 
29-->0 0.00 0.00 0 0 
30-->0 0.00 0.00 0 0 
31-->0 0.00 0.00 0 0 
32-->0 0.00 0.00 0 0 
33-->0 0.00 0.00 0 0 
34-->0 0.00 0.00 0 0 
35-->0 0.00 0.00 0 0 
36-->0 0.00 0.00 0 0 
37-->0 0.00 0.00 0 0 
38-->0 0.00 0.00 0 0 
39-->0 0.00 0.00 0 0 
40-->0 0.00 0.00 0 0 
41-->0 0.00 0.00 0 0 
42-->0 0.00 0.00 0 0 
43-->0 0.00 0.00 0 0 
44-->0 0.00 0.00 0 0 
45-->0 0.00 0.00 0 0 
46-->0 0.00 0.00 0 0 
47-->0 0.00 0.00 0 0 
48-->0 0.00 0.00 0 0 
49-->0 0.00 0.00 0 0 
50-->0 0.00 0.00 0 0 
51-->0 0.00 0.00 0 0 
52-->0 0.00 0.00 0 0 
53-->0 0.00 0.00 0 0 
54-->0 0.00 0.00 0 0 
55-->0 0.00 0.00 0 0 
56-->0 0.00 0.00 0 0 
57-->0 0.00 0.00 0 0 
58-->0 0.00 0.00 0 0 
59-->0 0.00 0.00 0 0 
60-->0 0.00 0.00 0 0 
61-->0 0.00 0.00 0 0 
62-->0 0.00 0.00 0 0 
63-->0 0.00 0.00 0 0 
64-->0 0.00 0.00 0 0 
65-->0 0.00 0.00 0 0 
66-->0 0.00 0.00 0 0 
67-->0 0.00 0.00 0 0 
68-->0 0.00 0.00 0 0 
69-->0 0.00 0.00 0 0 
70-->0 0.00 0.00 0 0 
71-->0 0.00 0.00 0 0 
72-->0 0.00 0.00 0 0 
73-->0 0.00 0.00 0 0 
74-->0 0.00 0.00 0 0 
75-->0 0.00 0.00 0 0 
76-->0 0.00 0.00 0 0 
77-->0 0.00 0.00 0 0 
78-->0 0.00 0.00 0 0 
79-->0 0.00 0.00 0 0 
 -----------------Reading fram to array-------------------
0-->500 400.00 300.00 100 0 
1-->501 401.00 301.00 101 1 
2-->502 402.00 302.00 102 2 
3-->503 403.00 303.00 103 3 
4-->504 404.00 304.00 104 4 
5-->505 405.00 305.00 105 5 
6-->506 406.00 306.00 106 6 
7-->507 407.00 307.00 107 7 
8-->508 408.00 308.00 108 8 
9-->509 409.00 309.00 109 9 
10-->510 410.00 310.00 110 10 
11-->511 411.00 311.00 111 11 
12-->512 412.00 312.00 112 12 
13-->513 413.00 313.00 113 13 
14-->514 414.00 314.00 114 14 
15-->515 415.00 315.00 115 15 
16-->516 416.00 316.00 116 16 
17-->517 417.00 317.00 117 17 
18-->518 418.00 318.00 118 18 
19-->519 419.00 319.00 119 19 
20-->520 420.00 320.00 120 20 
21-->521 421.00 321.00 121 21 
22-->522 422.00 322.00 122 22 
23-->523 423.00 323.00 123 23 
24-->524 424.00 324.00 124 24 
25-->525 425.00 325.00 125 25 
26-->526 426.00 326.00 126 26 
27-->527 427.00 327.00 127 27 
28-->528 428.00 328.00 128 28 
29-->529 429.00 329.00 129 29 
30-->530 430.00 330.00 130 30 
31-->531 431.00 331.00 131 31 
32-->532 432.00 332.00 132 32 
33-->533 433.00 333.00 133 33 
34-->534 434.00 334.00 134 34 
35-->535 435.00 335.00 135 35 
36-->536 436.00 336.00 136 36 
37-->537 437.00 337.00 137 37 
38-->538 438.00 338.00 138 38 
39-->539 439.00 339.00 139 39 
40-->540 440.00 340.00 140 40 
41-->541 441.00 341.00 141 41 
42-->542 442.00 342.00 142 42 
43-->543 443.00 343.00 143 43 
44-->544 444.00 344.00 144 44 
45-->545 445.00 345.00 145 45 
46-->546 446.00 346.00 146 46 
47-->547 447.00 347.00 147 47 
48-->548 448.00 348.00 148 48 
49-->549 449.00 349.00 149 49 
50-->550 450.00 350.00 150 50 
51-->551 451.00 351.00 151 51 
52-->552 452.00 352.00 152 52 
53-->553 453.00 353.00 153 53 
54-->554 454.00 354.00 154 54 
55-->555 455.00 355.00 155 55 
56-->556 456.00 356.00 156 56 
57-->557 457.00 357.00 157 57 
58-->558 458.00 358.00 158 58 
59-->559 459.00 359.00 159 59 
60-->560 460.00 360.00 160 60 
61-->561 461.00 361.00 161 61 
62-->562 462.00 362.00 162 62 
63-->563 463.00 363.00 163 63 
64-->564 464.00 364.00 164 64 
65-->565 465.00 365.00 165 65 
66-->566 466.00 366.00 166 66 
67-->567 467.00 367.00 167 67 
68-->568 468.00 368.00 168 68 
69-->569 469.00 369.00 169 69 
70-->570 470.00 370.00 170 70 
71-->571 471.00 371.00 171 71 
72-->572 472.00 372.00 172 72 
73-->573 473.00 373.00 173 73 
74-->574 474.00 374.00 174 74 
75-->575 475.00 375.00 175 75 
76-->576 476.00 376.00 176 76 
77-->577 477.00 377.00 177 77 
78-->578 478.00 378.00 178 78 
79-->579 479.00 379.00 179 79 
 ------------------alles------------------------
rc = 1200

то есть две функции - читающую и пишущую во FRAM FM24LC64 массив структур

микросхема куплена в чипдипе за 84 рубля и предполагается к применению в модуле мониторинга состояния станка для постоянной записи статусов на случай отказа питания вместо eeprom, системы поддержания питания на аккумуляторе и детектирования перехода на него.

по возможности запакую в виде библиотеки и выложу.

еще раз благодарность b707 за волшебное побуждение к творчеству и sadman41 за помощь.

b707
Онлайн
Зарегистрирован: 26.05.2017

ну и отлично

Верно я понял, что вся разница заключается в очередности передачи байтов адреса?

было

Wire.write((byte*)&addr,2);

стало

 Wire.write(startAddress >> 8);
 Wire.write(startAddress & 0xFF);

 

ЗЫ а что более конкретно не помог - извиняйте, болею....

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Некоторые правки, которые бы сделал я, оставаясь в авторской концепции:

...
  for (uint8_t i = 0; i < arr; i++) {
    // sizeof() will calculated on compile stage
    fram_pack(fm_addr, adress, (uint8_t*)&tpa_status[i], sizeof(condition));
    adress = adress + size_my;
  }

...

for (uint8_t i = 0; i < arr; i++) {
    uint16_t recieved = fram_unpack(fm_addr, adress, (uint8_t*)&tpa_status[i], sizeof(condition));
    if (recieved != sizeof(condition)) {
      Serial.println(F("Read errrrror!!!111"));
    }
    rc = rc + recieved;
    adress = adress + size_my;
  }

...

uint16_t fram_pack(uint8_t disk, uint16_t startAddress, uint8_t* data, uint16_t len) {
  Wire.beginTransmission(disk);
  Wire.write(startAddress >> 8);
  Wire.write(startAddress & 0xFF);
  uint16_t written = Wire.write(data, len);
  Wire.endTransmission();
  // delay(1); // no delay really need for FRAM
  return written;
}

uint16_t fram_unpack(uint8_t disk, uint16_t startAddress, uint8_t* data, uint16_t len) {
  Wire.beginTransmission(disk);
  Wire.write(startAddress >> 8);
  Wire.write(startAddress & 0xFF);
  Wire.endTransmission();
  uint16_t recieved = Wire.requestFrom(disk, len);
  // Read error detected
  if (recieved != len) {
    return 0x00;
  }
  for (recieved = 0x00; recieved < len; recieved++) {
    *data = Wire.read();
    data++;
  }
  return (recieved);
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ага, согласен :) спасибо sadman41!

b707 пишет:

в очередности передачи байтов адреса?

видимо да, сейчас в отъезде, доеду до дома, скорректирую библиотеку из хабра, наверно заработает.