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
Offline
Зарегистрирован: 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 пишет:

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

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

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

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

А нельзя ознакомится с вашим кодом для 4 килобит?

Я прост сейчас развлекаюсь с FM24C04A, и пока не могу понять, как оно работает. За основу взят код подобный тому, что в этой теме. Но скажем если с записью массива типа char у меня вопросов не возникает, то банальная побайтовая работа приводит к сбоям и зависаниям. И логику пока понять не могу. Хоть убей. :(

Увидеть бы гарантированно рабочий код, чтобы было от чего оттолкнуться.

Чип отвечает по адресам 0x50, 0x51 если что. Судя по сканеру. Что меня уже чутка озадачивает, с учетом 8 страниц.

sadman41
Offline
Зарегистрирован: 19.10.2016

К сбоям и зависаниям чего и какого вида?

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

Чечако пишет:

Чип отвечает по адресам 0x50, 0x51 если что. Судя по сканеру. Что меня уже чутка озадачивает, с учетом 8 страниц.

4 мегабита - это 2 страницы, как раз с адресами 0x50, 0x51 если что.

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

Чечако пишет:

Увидеть бы гарантированно рабочий код, чтобы было от чего оттолкнуться.

посмотрите в этой ветке начиная со страницы 4  - там люди в итоге разобрались, что к чему

http://forum.amperka.ru/threads/%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%83%D1%8E-%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D1%8C%D0%BA%D1%83-eeprom-fram.16761/page-4

 

если не поможет - позже поищу свой код, сейчас на работе запарка...

Чечако
Offline
Зарегистрирован: 15.06.2018

sadman41 пишет:
К сбоям и зависаниям чего и какого вида?

Подобная картина обычно бывает, когда ошибаемся в границах массива, например. Т.е. просто шаманские глюки. Или скажем читаем не из того места и не в том количестве, куда писали. И получаем мусор. Я подозреваю, что где-то я косячу по глупому скорее всего. Код покажу сейчас,не весь, но все что связано.

 

//адрес страницы памяти FRAM
#define FM_addr 0x51

char hs_c1[5]="-----";
byte hs_ccc2=0; 

void FM_Write(int addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  Wire.write((byte*)&addr,2);
  Wire.write((byte*)data,len);
  Wire.endTransmission(true);
  delay(1);
}


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

Так вот если я работаю с массивом hs_c1 - все отлично и корректно:

  FM_Read(10,hs_c1,5);
 
  FM_Write(10,hs_c1,5);
 
А когда я начинаю работать с переменной типа byte hs_ccc2, у меня по факту ничего не сохраняется, и на каком-то моменте контроллер начинает дурить:
 
  FM_Read(30,hs_ccc2,1);
 
  FM_Write(30,hs_ccc2,1);
 
Именно дурить, что как я уже сказал обычно бывает, если начать промахиваться по памяти. При этом она не заканчивается, я мониторю.
 
delay знаю что не нужен, вставлял просто на пробу, не удалил.

К краху приводит именно чтение, не запись. Но при этом тоже самое чтение с массивом hs_c1 замечательно работает.

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

Чечако, та же ошибка, что у всех - в строке 10 длина адреса ОДИН байт. а не два.

У микросхем с обьемом памяти до, если правильно помню,  16 кбит - адрес однобайтный, выше - два байта

sadman41
Offline
Зарегистрирован: 19.10.2016

Странно, конечно, что с массивом нормально. Выше inspiritus выяснил, что надо в адресе байты переворачивать.

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

sadman41 пишет:

Странно, конечно, что с массивом нормально. Выше inspiritus выяснил, что надо в адресе байты переворачивать.

для 4 Кбит нечего переворачивать. адрес 1 байт

sadman41
Offline
Зарегистрирован: 19.10.2016

Но для более других-то надо же, как я понимаю. А ошибка присутствует и такая в исходнике. 

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

sadman41 пишет:

Странно, конечно, что с массивом нормально. Выше inspiritus выяснил, что надо в адресе байты переворачивать.

для 4 Кбит нечего переворачивать. адрес 1 байт

Переворачивать я пробовал - пофигу. Как правильно поправить код? Если я тупо 2 поменяю на 1, ничего не меняется. массив работает корректно как и раньше, байт приводит к сбоям.

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

sadman41 пишет:

Но для более других-то надо же, как я понимаю. А ошибка присутствует и такая в исходнике. 

для разных обьемов - разный вид  адреса. Я об этом твержу уже в третьей ветке...

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак я спорю что ли? 

Если не разберетесь - попозжа могу в ящике поискать свою фрамку.

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

Чечако пишет:

Как правильно поправить код?

void FM_Write(uint8_t addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  Wire.write(addr);
  Wire.write((byte*)data,len);
  Wire.endTransmission(true);

}

как-то так. Обратите внимание на тип переменной addr - это ансигнед байт. а не инт

Да, еще, len - максимум 31 байт, как я помню.

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

Чечако пишет:

Как правильно поправить код?

void FM_Write(uint8_t addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  Wire.write(addr);
  Wire.write((byte*)data,len);
  Wire.endTransmission(true);

}

как-то так. Обратите внимание на тип переменной addr - это ансигнед байт. а не инт

Да, еще, len - максимум 32 байта

len у меня 1 в случае байта, я выше показывал код. Ничего не меняется. Массив по прежнему работает корректно, байт по прежнему приводит к сбоям. И по факту или не сохраняется, или не оттуда читается. Ибо я счетчик туда пишу, в текстовый массив преобразую туда и обратно через string. Адрес я исправил в обоих функциях, понятное дело.

Вот код, который крутится в цикле - по сути два счетчика, вызов раз в секунду.

unsigned long hs_ccc1=0; 
byte hs_ccc2=0; 

.... Цикл, раз в секунду примерно


  FM_Read(10,hs_c1,5);
  Serial.print("Read: ");
  Serial.println(FM_Read(30,hs_ccc2,1));

  hs_ccc1=String(hs_c1).toInt();
  hs_ccc1++;
  
  hs_ccc2++;

  if(hs_ccc1>9999)hs_ccc1=0;
  if(hs_ccc2>100)hs_ccc2=0;

  Serial.print("hs_ccc1=");
  Serial.println(hs_ccc1);

  Serial.print("hs_ccc2=");
  Serial.println(hs_ccc2);


  hs_str=String(hs_ccc1);
  hs_str.toCharArray(hs_c1,hs_str.length()+1);

  FM_Write(10,hs_c1,5);
  FM_Write(30,hs_ccc2,1);

Соответственно, счетчик сохраняемый через массив работает корректно, после перезагрузки контроллера продолжает с того же места. Счетчик на byte - где-то на 15-16 цикле приводит к сбоям, ну и всегда начинается с нуля, что говорит о том, что его значение или не сохраняется, или не считывается.

Я понимаю, что это какая-то глупость скорее всего, но глаз видимо замылился.

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

Чечако пишет:

len у меня 1 в случае байта, я выше показывал код.

выше вы показывали код, где адрес был 2 байта.

Извините, что я с вами как с новичком - но, пожалуйста, выложите актуальную версию кода с правильным адресом и правильной длиной....

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

Извините, что я с вами как с новичком - но, пожалуйста, выложите актуальную версию кода с правильным адресом и правильной длиной....

Извиняться не надо, я действительно туплю: Сейчас вот так:

void FM_Write(uint8_t addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  //Wire.write((byte*)&addr,2);
  Wire.write(addr);
  Wire.write((byte*)data,len);
  Wire.endTransmission(true);
  delay(1);
}


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

По len - я про вашу фразу о ограничении длинной буфера по умолчанию в 32 (31). По факту у меня оно или всегда 5 для массива, или всегда 1 для байта. Код вызова функций в посту выше на один. :) Фрагмент вызывается по контролю millis примерно раз в секунду, если это важно.

 

С этим кодом сбой происходит стабильно на 39 секунде примерно с момента перезапуска контроллера по reset

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

в строках 7 и 19 false и true попробуйте убрать.

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

в строках 7 и 19 false и true попробуйте убрать.

Монопенисуально. Вот текущий код - я вообще сделал отдельный скетч, привожу целиком.

#include "Wire.h"


//******************************************************************************************************************************** 
//*** работа с FRAM
//******************************************************************************************************************************** 

unsigned long timer_stat;

char hs_c1[5]="-----";
String hs_str;
unsigned long hs_ccc1=0; 
byte hs_ccc2=0; 

//адрес страницы памяти FRAM
#define FM_addr 0x51


void setup()
{ 
 Wire.begin();
 Serial.begin(19200);
}


void loop()
{

 if (micros()-timer_stat>1000000)
 {

  FM_Read(10,hs_c1,5);
  Serial.print("Read: ");
  Serial.println(FM_Read(110,hs_ccc2,1));

  hs_ccc1=String(hs_c1).toInt();
  hs_ccc1++;
  hs_ccc2++;

  if(hs_ccc1>9999)hs_ccc1=0;
  if(hs_ccc2>100)hs_ccc2=0;

  Serial.print("hs_ccc1=");
  Serial.println(hs_ccc1);

  Serial.print("hs_ccc2=");
  Serial.println(hs_ccc2);


  hs_str=String(hs_ccc1);
  hs_str.toCharArray(hs_c1,hs_str.length()+1);

  FM_Write(10,hs_c1,5);
  FM_Write(110,hs_ccc2,1);
  
  timer_stat=micros();
 }
}

void FM_Write(uint8_t addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  //Wire.write((byte*)&addr,2);
  Wire.write(addr);
  Wire.write((byte*)data,len);
  //Wire.endTransmission(true);
  Wire.endTransmission();
  delay(1);
}


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

На 29 итерации все умирает. Выглядит в сериале вот так:

 

Read: 1
hs_ccc1=2495
hs_ccc2=1
Read: 1
hs_ccc1=2496
hs_ccc2=2
Read: 1
hs_ccc1=2497
hs_ccc2=3
Read: 1
hs_ccc1=2498
hs_ccc2=4
Read: 1
hs_ccc1=2499
hs_ccc2=5
Read: 1
hs_ccc1=2500
hs_ccc2=6
Read: 1
hs_ccc1=2501
hs_ccc2=7
Read: 1
hs_ccc1=2502
hs_ccc2=8
Read: 1
hs_ccc1=2503
hs_ccc2=9
Read: 1
hs_ccc1=2504
hs_ccc2=10
Read: 1
hs_ccc1=2505
hs_ccc2=11
Read: 1
hs_ccc1=2506
hs_ccc2=12
Read: 1
hs_ccc1=2507
hs_ccc2=13
Read: 1
hs_ccc1=2508
hs_ccc2=14
Read: 1
hs_ccc1=2509
hs_ccc2=15
Read: 1
hs_ccc1=2510
hs_ccc2=16
Read: 2
hs_ccc1=2511
hs_ccc2=17
Read: 1
hs_ccc1=2512
hs_ccc2=18
Read: 1
hs_ccc1=2513
hs_ccc2=19
Read: 1
hs_ccc1=2514
hs_ccc2=20
Read: 1
hs_ccc1=2515
hs_ccc2=21
Read: 1
hs_ccc1=2516
hs_ccc2=22
Read: 1
hs_ccc1=2517
hs_ccc2=23
Read: 1
hs_ccc1=2518
hs_ccc2=24
Read: 1
hs_ccc1=2519
hs_ccc2=25
Read: 1
hs_ccc1=2520
hs_ccc2=26
Read: 1
hs_ccc1=2521
hs_ccc2=27
Read: 1
hs_ccc1=2522
hs_ccc2=28
Read: 1
hs_ccc1=2523
hs_ccc2=29
Read: 1
hs_ccc1=1
hs_ccc2=30

При этом сбой идет и при чтении ccc1 из fram - он вероятно возвращает ноль. Далее 30 у ccc2 и привет. Висим до резета. После резета ccc1 2524, значит считал 2523. 

 

Адрес записи байта я поменял на 110 вместо 30 просто ради эксперимента.

Если закомментировать чтение байта с адреса 110, т.е. 34 строку скетча - все работает без проблем.

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

на строку 52 вставьте вывод hs_str в Сериал

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Чечако, в 34 строке добавь & перед hs_ccc2

Чечако
Offline
Зарегистрирован: 15.06.2018

b707 пишет:

на строку 52 вставьте вывод hs_str в Сериал

На первых 30 сбойнула судя по выводу, на вторых повисли - фрагмент сериала прилагаю:

Read ccc1: 5
Read ccc2: 1
hs_ccc1=288
hs_ccc2=1
----------
hs_str=288
Read ccc1: 5
Read ccc2: 1
hs_ccc1=289
hs_ccc2=2
----------
hs_str=289
Read ccc1: 5
Read ccc2: 1
hs_ccc1=290
hs_ccc2=3
----------
hs_str=290
Read ccc1: 5
Read ccc2: 1
hs_ccc1=291
hs_ccc2=4
----------
hs_str=291
Read ccc1: 5
Read ccc2: 1
hs_ccc1=292
hs_ccc2=5
----------
hs_str=292
Read ccc1: 5
Read ccc2: 1
hs_ccc1=293
hs_ccc2=6
----------
hs_str=293
Read ccc1: 5
Read ccc2: 1
hs_ccc1=294
hs_ccc2=7
----------
hs_str=294
Read ccc1: 5
Read ccc2: 1
hs_ccc1=295
hs_ccc2=8
----------
hs_str=295
Read ccc1: 5
Read ccc2: 1
hs_ccc1=296
hs_ccc2=9
----------
hs_str=296
Read ccc1: 5
Read ccc2: 1
hs_ccc1=297
hs_ccc2=10
----------
hs_str=297
Read ccc1: 5
Read ccc2: 1
hs_ccc1=298
hs_ccc2=11
----------
hs_str=298
Read ccc1: 5
Read ccc2: 1
hs_ccc1=299
hs_ccc2=12
----------
hs_str=299
Read ccc1: 5
Read ccc2: 1
hs_ccc1=300
hs_ccc2=13
----------
hs_str=300
Read ccc1: 5
Read ccc2: 1
hs_ccc1=301
hs_ccc2=14
----------
hs_str=301
Read ccc1: 5
Read ccc2: 1
hs_ccc1=302
hs_ccc2=15
----------
hs_str=302
Read ccc1: 5
Read ccc2: 1
hs_ccc1=303
hs_ccc2=16
----------
hs_str=303
Read ccc1: 5
Read ccc2: 2
hs_ccc1=304
hs_ccc2=17
----------
hs_str=304
Read ccc1: 5
Read ccc2: 1
hs_ccc1=305
hs_ccc2=18
----------
hs_str=305
Read ccc1: 5
Read ccc2: 1
hs_ccc1=306
hs_ccc2=19
----------
hs_str=306
Read ccc1: 5
Read ccc2: 1
hs_ccc1=307
hs_ccc2=20
----------
hs_str=307
Read ccc1: 5
Read ccc2: 1
hs_ccc1=308
hs_ccc2=21
----------
hs_str=308
Read ccc1: 5
Read ccc2: 1
hs_ccc1=309
hs_ccc2=22
----------
hs_str=309
Read ccc1: 5
Read ccc2: 1
hs_ccc1=310
hs_ccc2=23
----------
hs_str=310
Read ccc1: 5
Read ccc2: 1
hs_ccc1=311
hs_ccc2=24
----------
hs_str=311
Read ccc1: 5
Read ccc2: 1
hs_ccc1=312
hs_ccc2=25
----------
hs_str=312
Read ccc1: 5
Read ccc2: 1
hs_ccc1=313
hs_ccc2=26
----------
hs_str=313
Read ccc1: 5
Read ccc2: 1
hs_ccc1=314
hs_ccc2=27
----------
hs_str=314
Read ccc1: 5
Read ccc2: 1
hs_ccc1=315
hs_ccc2=28
----------
hs_str=315
Read ccc1: 5
Read ccc2: 1
hs_ccc1=316
hs_ccc2=29
----------
hs_str=316
Read ⸮Read ccc1: 5
Read ccc2: 1
hs_ccc1=317
hs_ccc2=1
----------
hs_str=317
Read ccc1: 5
Read ccc2: 1
hs_ccc1=318
hs_ccc2=2
----------
hs_str=318
Read ccc1: 5
Read ccc2: 1
hs_ccc1=319
hs_ccc2=3
----------
hs_str=319
Read ccc1: 5
Read ccc2: 1
hs_ccc1=320
hs_ccc2=4
----------
hs_str=320
Read ccc1: 5
Read ccc2: 1
hs_ccc1=321
hs_ccc2=5
----------
hs_str=321
Read ccc1: 5
Read ccc2: 1
hs_ccc1=322
hs_ccc2=6
----------
hs_str=322
Read ccc1: 5
Read ccc2: 1
hs_ccc1=323
hs_ccc2=7
----------
hs_str=323
Read ccc1: 5
Read ccc2: 1
hs_ccc1=324
hs_ccc2=8
----------
hs_str=324
Read ccc1: 5
Read ccc2: 1
hs_ccc1=325
hs_ccc2=9
----------
hs_str=325
Read ccc1: 5
Read ccc2: 1
hs_ccc1=326
hs_ccc2=10
----------
hs_str=326
Read ccc1: 5
Read ccc2: 1
hs_ccc1=327
hs_ccc2=11
----------
hs_str=327
Read ccc1: 5
Read ccc2: 1
hs_ccc1=328
hs_ccc2=12
----------
hs_str=328
Read ccc1: 5
Read ccc2: 1
hs_ccc1=329
hs_ccc2=13
----------
hs_str=329
Read ccc1: 5
Read ccc2: 1
hs_ccc1=330
hs_ccc2=14
----------
hs_str=330
Read ccc1: 5
Read ccc2: 1
hs_ccc1=331
hs_ccc2=15
----------
hs_str=331
Read ccc1: 5
Read ccc2: 1
hs_ccc1=332
hs_ccc2=16
----------
hs_str=332
Read ccc1: 5
Read ccc2: 2
hs_ccc1=333
hs_ccc2=17
----------
hs_str=333
Read ccc1: 5
Read ccc2: 1
hs_ccc1=334
hs_ccc2=18
----------
hs_str=334
Read ccc1: 5
Read ccc2: 1
hs_ccc1=335
hs_ccc2=19
----------
hs_str=335
Read ccc1: 5
Read ccc2: 1
hs_ccc1=336
hs_ccc2=20
----------
hs_str=336
Read ccc1: 5
Read ccc2: 1
hs_ccc1=337
hs_ccc2=21
----------
hs_str=337
Read ccc1: 5
Read ccc2: 1
hs_ccc1=338
hs_ccc2=22
----------
hs_str=338
Read ccc1: 5
Read ccc2: 1
hs_ccc1=339
hs_ccc2=23
----------
hs_str=339
Read ccc1: 5
Read ccc2: 1
hs_ccc1=340
hs_ccc2=24
----------
hs_str=340
Read ccc1: 5
Read ccc2: 1
hs_ccc1=341
hs_ccc2=25
----------
hs_str=341
Read ccc1: 5
Read ccc2: 1
hs_ccc1=342
hs_ccc2=26
----------
hs_str=342
Read ccc1: 5
Read ccc2: 1
hs_ccc1=343
hs_ccc2=27
----------
hs_str=343
Read ccc1: 5
Read ccc2: 1
hs_ccc1=344
hs_ccc2=28
----------
hs_str=344
Read ccc1: 5
Read ccc2: 1
hs_ccc1=345
hs_ccc2=29
----------
hs_str=345
Read ccc1: 5
Read ccc2: 1
hs_ccc1=1
hs_ccc2=30
----------

Я добавил вывод количества считанных байт, вот текущий код:

#include "Wire.h"


//******************************************************************************************************************************** 
//*** работа с FRAM
//******************************************************************************************************************************** 

unsigned long timer_stat;

char hs_c1[5]="-----";
String hs_str;
unsigned long hs_ccc1=0; 
byte hs_ccc2=0; 

//адрес страницы памяти FRAM
#define FM_addr 0x51


void setup()
{ 
 Wire.begin();
 Serial.begin(19200);
}


void loop()
{

 if (micros()-timer_stat>1000000)
 {

  Serial.print("Read ccc1: ");
  Serial.println(FM_Read(10,hs_c1,5));
  Serial.print("Read ccc2: ");
  Serial.println(FM_Read(110,hs_ccc2,1));

  hs_ccc1=String(hs_c1).toInt();
  hs_ccc1++;
  hs_ccc2++;

  if(hs_ccc1>9999)hs_ccc1=0;
  if(hs_ccc2>100)hs_ccc2=0;

  Serial.print("hs_ccc1=");
  Serial.println(hs_ccc1);

  Serial.print("hs_ccc2=");
  Serial.println(hs_ccc2);

  Serial.println("----------");

  hs_str=String(hs_ccc1);
  hs_str.toCharArray(hs_c1,hs_str.length()+1);
  Serial.print("hs_str=");
  Serial.println(hs_str);
  
  FM_Write(10,hs_c1,5);
  FM_Write(110,hs_ccc2,1);
  
  timer_stat=micros();
 }
}

void FM_Write(uint8_t addr, void* data, int len) 
{
  Wire.beginTransmission(FM_addr);
  //Wire.write((byte*)&addr,2);
  Wire.write(addr);
  Wire.write((byte*)data,len);
  //Wire.endTransmission(true);
  Wire.endTransmission();
  delay(1);
}


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

 

Чечако
Offline
Зарегистрирован: 15.06.2018

Andy пишет:

Чечако, в 34 строке добавь & перед hs_ccc2

 

Если так сделать - hs_ccc2 обнуляется каждую итерацию.

Но вот если & добавить не только в 34, но и в строку записи тоже - которая 54 в том примере примере, то все работает и не виснет... :-/

Можно объяснить, в чем магия?

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

Чечако пишет:

Можно объяснить, в чем магия?

какая магия? у вас же в процедуразх записи и считывания используется указатель...

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

b707 пишет:

какая магия? 

Как какая? Разве третий закон Кларка уже отменили?

sadman41
Offline
Зарегистрирован: 19.10.2016

Исходник (не сильно красивый):

#include "Wire.h"


//********************************************************************************************************************************
//*** работа с FRAM
//********************************************************************************************************************************

unsigned long timer_stat;

char arrayOne[] = "ABCDEF";
uint8_t varOne = 0;

//адрес страницы памяти FRAM
#define FM_addr 0x51

void i2cScan() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
}

void FM_Write(const uint8_t addr, uint8_t* data, const uint8_t len) {
  Wire.beginTransmission(FM_addr);
  Wire.write(addr);
  Wire.write(data, len);
  Wire.endTransmission(true);
}

int16_t FM_Read(const uint8_t addr, uint8_t* data, const uint8_t len) {
  uint16_t readed;
  Wire.beginTransmission(FM_addr);
  Wire.write(addr);
  Wire.endTransmission(false);
  readed = Wire.requestFrom(FM_addr, len);
  if (len != readed) {
    return -1;
  }
  for (uint8_t i = 0; i < len; i++) {
    *data = Wire.read();
    data++;
  }
  return (readed);
}

void setup() {
  Wire.begin();
  Serial.begin(115200);
  i2cScan();
}


void loop() {

  if (millis() - timer_stat > 1000UL) {
    timer_stat = millis();
    int8_t readed;
    char arrayTwo[sizeof(arrayOne)];
    memset(arrayTwo, 0x00, sizeof(arrayTwo));
    Serial.print("["); Serial.print(timer_stat); Serial.println("]");
    Serial.println("Write array to FRAM");
    FM_Write(10, arrayOne, sizeof(arrayOne));
    Serial.println("Read array from FRAM");
    readed = FM_Read(10, arrayTwo, sizeof(arrayTwo));
    if (0x00 < readed) {
      Serial.println("Report: ");
      for (uint8_t i = 0x00; sizeof(arrayTwo) > i; i++) {
        Serial.print((arrayOne[i] == 0x00) ? (char)0x20 : arrayOne[i]); Serial.print(" => "); Serial.println((arrayTwo[i] == 0x00) ? (char)0x20 : arrayTwo[i]);
      }
    } else {
      Serial.println("Read Error");
    }

    uint8_t varOne = random(255);
    uint8_t varTwo = 0x00;
    Serial.println("Write variable to FRAM");
    FM_Write(1, &varOne, sizeof(varOne));
    Serial.println("Read variable from FRAM");
    readed = FM_Read(1, &varTwo, sizeof(varTwo));
    if (0x00 < readed) {
      Serial.println("Report: ");
      Serial.print(varOne); Serial.print(" => "); Serial.println(varTwo);
    } else {
      Serial.println("Read Error");
    }
  }
}

Лог:

canning...
I2C device found at address 0x50  !
I2C device found at address 0x51  !
done

[1001]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
232 => 232
[2002]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
19 => 19
[3003]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
158 => 158
[4004]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
38 => 38
[5005]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
175 => 175
[6006]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
197 => 197
[7007]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
114 => 114
[8008]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
68 => 68
[9009]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
188 => 188
[10010]
Write array to FRAM
Read array from FRAM
Report: 
A => A
B => B
C => C
D => D
E => E
F => F
  =>  
Write variable to FRAM
Read variable from FRAM
Report: 
109 => 109