EEPROM I2C con STM32F103C8T6

Salve a tutti !!

Sono molto triste poichè non riesco proprio ad uscirne fuori.

Il problema sta nel fatto d’interfacciare una o più eeprom i2c 24LC512 usando la scheda STM32 F103C8T6 denominata Blue Pill.

Questo è il programma funzionante i caricato sulla scheda Arduino Nano :

#include <Wire.h>

//Indirizzo della EEPROM 24LC512
#define EEPROM_I2C_ADDRESS 0x50

void setup() {

  //Settaggio porta solo per STM32
  //Wire.stm32SetInstance(I2C2);
  //Wire.stm32SetSDA(PB11);
  //Wire.stm32SetSCL(PB10);

  Wire.begin();

  Serial.begin(115200);

  writeAddress(0, 34);

  byte readVal = readAddress(0);

  Serial.print("The returned value is ");
  Serial.println(readVal);

}

void loop() {

  delay(1000);
  byte Memoria = readAddress(0);
  Serial.print("The returned value is ");
  Serial.println(Memoria);

}

//Scrive dati nella EEPROM
void writeAddress(int address, byte val) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((int)(address >> 8));   // MSB
  Wire.write((int)(address & 0xFF)); // LSB

  Wire.write(val);
  Wire.endTransmission();

  delay(5);
}

//Riceve dati dalla EEPROM
byte readAddress(int address) {
  byte rData = 0xFF;

  Wire.beginTransmission(EEPROM_I2C_ADDRESS);

  Wire.write((int)(address >> 8));   // MSB
  Wire.write((int)(address & 0xFF)); // LSB
  Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS, 1);

  rData =  Wire.read();

  return rData;
}

Giustamente funziona e nel loop ad ogni secondo legge dalla eeprom e mi restituisce il numero 34 salvato sull’indirizzo 0.

Lo stesso codice lo inserisco sulla scheda STM32 Blue Pill e ci sono un po di differenze di funzionamento:

PS: Allego tutte le immagini come STM32 Blue Pill PinOut…

Lo schema di collegamento è semplice la EEPROM è collegata son SDA e SCL su Arduino Nano sui suoi corrispettivi pin A4, A5

Su STM32 l’ho collegata sui pin PB6 e PB7 ovvero la I2C_1 poichè STM32 Blue Pill
possiede due porte I2C.

Sul mio Arduno IDE ho installatto oggi un nuovo pacchetto che gestisce le schede STM32 denominato
“STM32GENERICS for STM32 board” dal sito:

STM32GENERIC

Come standard in passato ho usato un pacchetto di supporto STM32 chiamato “STM32duino.com

Quindi quando vado a selezionare la scheda per programmare adesso mi ritrovo con due pacchetti uno scaricato in passato e uno nuovo tutti e due hanno la versione F103C8T6 e il pacchetto che ho installato oggi ha la seguente documentazione sull’ I2C :

https://danieleff.github.io/STM32GENERIC/i2c/

Il primo problema sta nel fatto che programmando il codice di test per la EEPROM 24LC512 con il pacchetto “STM32duino.com” non visualizzo niente sulla seriale.

Se invece carico sempre lo stesso programma utilizzando il pacchetto “STM32GENERICS for STM32 board” visualizzo sempre il valore 255 anche senza nessun componente collegato al bus I2C.

La versione dell’ IDE è 1.8.9 sul sito STM32GENERIC
ho letto le procedure d’installazione del pacchetto:

Installazione - Sviluppatori
Scarica l'ultima versione da https://github.com/danieleff/STM32GENERIC
Decomprimilo nella cartella [Arduino] / hardware
Installa Arduino Zero dal gestore della scheda per il compilatore arm-none-eabi-gcc

Da tutto questo ho capito che la libreria Wire non è la stessa se non mi sbaglio.
Cioè è diversa in base al tipo di scheda scelta ?

Ho letto in giro che la libreria Wire usata con altre schede può avere conflitti per quanto riguarda l’indirizzo.

So che la eeprom 24lc512 è formata da 7 bit di cui i primi 4 da sinistra sono “0101” e poi gli ultimi 3 sono i pin d’uscita A0, A1, A3.

Infatti a rigor di logica l’indirizzo minimo “0101000” equivale in esadecimale a “0x50” che usato con l’Arduino Nano funziona perfettamente ma nell’ STM32 no.

Forse usa un formato d’indirizzo diverso ? Tipo a 10 bit o altro ?
In rete ho trovato fonti che citavano tale cosa.

Oltre a questo problema poi dovrò cercare come spiega quì:

https://danieleff.github.io/STM32GENERIC/i2c/

Di utilizzare anche l’altra porta I2C ovvero i pin PB10 e PB11.

PS:

Oltre alle immagni riporto i file .h e ccp. della libreria Wire “Classica” di Arduino
e quelle interna al pacchetto del sito : STM32GENERIC

Così se qualcuno nota qualcosa che mi sfugge e che non mi permette di leggere la EEPROM da STM32


PS: Ho provato a caricare lo sketch che ricerca gli indirizzi sulla porta I2C e sulla seriale non mi trova nessuna periferica collegata > “Unknown error at address 0x…”

Questo è il codice che utilizzo e ottengo risultati sulla seriale solo se programmo la scheda con il pacchetto “STM32GENERCS for STM32”
Se programmo con il pacchetto “STM32duino.com” non visualizzo niente.

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//



/* Example pinmap for Bluepill I2Cs (by Testato)
  I2C-1 standard pins: PB7(sda) PB6(scl)
  Use it by "Wire" without pin declaration
  Wire.begin();
  I2C-1 alternative pins: PB9(sda) PB8(scl)
  Remap the first I2C before call begin()
  Wire.setSDA(PB9);
  Wire.setSCL(PB8);
  Wire.begin();
  I2C-2: PB11(sda) PB10(scl)
  Remap the second I2C before call begin()
  Wire.setSDA(PB11);
  Wire.setSCL(PB10);
  Wire.begin();
  If you want to use the two I2Cs simultaneously, create a new instance for the second I2C
  TwoWire Wire2(PB11,PB10);
  Wire2.begin();

*/


#include <Wire.h>


void setup() {

  Serial.begin(9600);
  Wire.begin();
  Serial.println("\nI2C Scanner");
}


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

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

  nDevices = 0;
  for (address = 1; address < 127; address++) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the 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.println(address, HEX);

      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");
  else
    Serial.println("done");

  delay(5000);           // wait 5 seconds for next scan
}

Alla fine è come se la periferica esterna ovvero la EEPROM 24LC512 non viene letta come se l’indirizzo è diverso.

Se qualcuno conosce un metodo dove viene usato STM32 Blue Pill con la eeprom 24LC512 o anche test di prova per capire se tutto funziona sono ben accetti.

Ringrazio tutti del supporto… ne ho veramente bisogno…

File Wire Arduino e STM32.zip (15.3 KB)

EEPROM_I2C.pdf (673 KB)

Scusa, ma ... cosa c'entra STM con Arduino ? ? ? Rileggi il REGOLAMENTO, al punto 16.11.

Il progetto "stm32duino" sfrutta l'IDE Arduino (essendo open-source) ma se ci sono problemi ... ovviamente devi chiedere sul loro forum: http://www.stm32duino.com/

Guglielmo

Il loro forum non funziona da un po... è per quello che chiedo qua.

>MizzardNet: in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo post duplicato nella sezione Inglese del forum (post per di più scritto in Italiano, cosa NON permessa) è stato cancellato.

Ti prego pertanto, per il futuro, di evitare di aprire più post sullo stesso argomento in sezioni differenti del forum.

Ribadisco inoltre che per questioni STM è bene che tu ti rivolga ai forum di supporto di STM (se uno non funziona ce ne sono altri).

Grazie.

Guglielmo