Arduino Polska Forum

Pełna wersja: Arduino/ Wemos nie widzi fram
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Witam
Szukam pomocy nie mam pojęcia dlaczego procki nie widzą framu.
Używam fram mb85rs64 zasilanie 2.7-3.6V
Poniże schmemat i przykład z biblioteki adafruit i ciągle mam błąd  No SPI FRAM found ... check your connections
Panowie co jest nie tak?

Kod:
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

/* Example code for the Adafruit SPI FRAM breakout */
uint8_t FRAM_CS = 15;

//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware SPI

uint8_t FRAM_SCK= 14;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 13;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);

uint16_t          addr = 0;

void setup(void) {
  Serial.begin(9600);
  while (!Serial) delay(10);    // will pause Zero, Leonardo, etc until serial console opens
 
  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }
 
  // Read the first byte
  uint8_t test = fram.read8(0x0);
  Serial.print("Restarted "); Serial.print(test); Serial.println(" times");

  // Test write ++
  fram.writeEnable(true);
  fram.write8(0x0, test+1);
  fram.writeEnable(false);

  fram.writeEnable(true);
  fram.write(0x1, (uint8_t *)"FTW!", 5);
  fram.writeEnable(false);

  // dump the entire 8K of memory!
  uint8_t value;
  for (uint16_t a = 0; a < 8192; a++) {
    value = fram.read8(a);
    if ((a % 32) == 0) {
      Serial.print("\n 0x"); Serial.print(a, HEX); Serial.print(": ");
    }
    Serial.print("0x");
    if (value < 0x1)
      Serial.print('0');
    Serial.print(value, HEX); Serial.print(" ");
  }
}

void loop(void) {

}
Podczas uruchamiania sprawdzany jest producent, jeśli jest inny, nie ujęty w bibliotece to też jest taki komunikat:
check_supported_device(manufID, prodID); (wewnątrz biblioteki w pliku .cpp).
To jest przykład dla chipów, które oni sprzedają.
Spróbuj inne biblioteki, albo zmodyfikuj tą od Adafruit.
Mogą być też inne przyczyny, ale na pewno miałem nie halo, choć fram ostatecznie zadziałał.
Edit:
Sprawdziłem swoje szkice i u mnie chodziło o FRAM I2C, ale potem i tak skorzystałem z innej biblioteki. Niestety ta moja jest tylko do I2C, więc i tak Ci się nie przyda.
Ale wierzę, że znajdziesz, do Arduino jest wszystkiego na pęczki.
Kurcze to faktycznie lipa. Pewnie to jest u mnie przyczyną spr połączenia wiele razy nie ma innej opcji. Zostaje kupić oryginał adafruit albo szukać biblioteki, a ja wczoraj się zastanawiałem cały dzień dlaczego sypie tym błędem...
kaczakat bardzo ci dziękuję za konkretną odp.
A weź zobacz czy zmiana pinu CS na inny wolny niż 15 (5/4 D1/D2), da coś bo ten pin jest podciągnięty do masy w związku z botowaniem ESP.

I zamiast programowego SPI wykorzystaj sprzętowe SPI...
Oki jak wrócę jutro to spr spróbuję zmienić pin CS.
Tylko nie bardzo wiem jak zmienić na sprzętowe SPI.
masz przecież opisane

Kod:
/* Example code for the Adafruit SPI FRAM breakout */
uint8_t FRAM_CS = 15;

Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware SPI

//uint8_t FRAM_SCK= 14;
//uint8_t FRAM_MISO = 12;
//uint8_t FRAM_MOSI = 13;
//Or use software SPI, any pins!
//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);

Oczywiście jak zmienisz pin CS to i kabel tam zmień też..

14,12,13 bez zmian bo sprzętowy ma tak samo..
Jarewa0606 zrobiłem jak zaleciłeś. Zmieniłem pin CS w programie i przepiąłem kabel probowałem na programowym i sprzętowym ni cholery nie chce zagadać cały czas  No SPI fram...

Zaglądałem do bilioteki pliku cpp jak pisał kaczakat i są tam takie nazy

Kod:
} _supported_devices[] = {
    // Sorted in numerical order
    // Fujitsu
    {0x04, 0x0101, 2 * 1024UL},  // MB85RS16
    {0x04, 0x0302, 8 * 1024UL},  // MB85RS64V
    {0x04, 0x2303, 8 * 1024UL},  // MB85RS64T
    {0x04, 0x2503, 32 * 1024UL},  // MB85RS256TY
    {0x04, 0x4803, 256 * 1024UL}, // MB85RS2MTA
    {0x04, 0x4903, 512 * 1024UL}, // MB85RS4MT
Mój chip ma MB85RS64 pewnie dlatego go wywala?
Daj linka gdzie kupiłeś te pamięci. Znalazłem jakiegoś PDF takiej pamięci, gdzie jest wpisane max 20MHz.
Na początek i tak trzeba sprawdzić czy ta pamięć w ogóle coś odpowiada. Na każdym etapie można grzebnąć w bibliotece i wyrzucić na UART pozyskane informacje, albo też da to informacje w którym momencie program się sypie. Tu się przydaje też analizator logiczny, który podsłucha komunikację na magistrali SPI.
Są nawet takie teksty w bibliotece wystarczy odkomentować, np.:
//Serial.print("Unexpected Manufacturer ID: 0x"); Serial.println(manufID, HEX);
Te dane w supported devices to tak na prawdę adresy początku i końca pamięci do wykorzystania, można sobie dodać kolejne pozycje, ewentualnie można dodać kolejna z tym ID wyrzuconym przez bibliotekę.
Można też użyć Arduino NANO 3.3V, są takie na 8MHz, SPI będzie działać tu oczywiście wolniej, max 4MHz, to testów bez znaczenia, może domyślne ustawienie w ESP8266 jest o tyle szybsze (procek jest x10), że pamięć faktycznie nic nie odpowiada. W przykładzie biblioteki są dzielniki dla SAM =9, to procek około 100MHz, ESP jest 160MHz. Można też przy kompilacji w menu ustawić zegar ESP na 80MHz, choć to wiele nie pomoże. Funkcje do ustawienia prędkości SPI też są inne w ESP, dla starszych płytek w przykładzie jest ten dzielnik, a dla ESP jest wprost podanie częstotliwości. Max prędkość dla UNO to 8MHz, dla ESP 80Mhz.
Ten blok:
SPI.begin();

#ifdef __SAM3X8E__
SPI.setClockDivider (9); // 9.3 MHz
#elif defined(STM32F2XX)
// Is seems the photon SPI0 clock runs at 60MHz, but SPI1 runs at
// 30MHz, so the DIV will need to change if this is ever extended
// to cover SPI1
SPI.setClockDivider (SPI_CLOCK_DIV4); // Particle Photon SPI @ 15MHz
#else
SPI.setClockDivider (SPI_CLOCK_DIV2); // 8 MHz
#endif
Sugeruje braku obsługi ESP, gdzie prędkość SPI to SPI.setFrequency(40000000); dla 40MHz

Wszystko to tak na czuja sugeruje, że głównym problemem jest ESP.

Można spróbować dodać przed ostatnim #else
#elif defined ESP8266
SPI.setFrequency(10000000);//10MHz

Choć znalazłem też przykłady, gdzie ESP gada jako Master do UNO SLAVE i nie ma w kodzie żadnych ustawień prędkości, a UNO nie dałoby rady odpowiadać na domyślnej prędkości ESP 40MHz. Więc i tak bym podłączył analizator by sprawdzić, co się faktycznie dzieje na linii zegara, IN i OUT, ale może to setFrequency zadziała.
28,59 zł 5%OFF | 1-10 sztuk MB85RS64 MB85RS64PNF-G-JNERE1 RS64
https://a.aliexpress.com/_vkSJyf

Ten chip to jakaś lipa na pro mini 3.3V też nie ma komunikacji.
Kupiłem oryginalny adafruit tam jest kość MB85RS64V a ja mam bez litery V i z adafruit odrazu działa podłączyłem go pod Esp32 z supla i ładnie pamięta stan przekaźnika po resecie.
Może trzeba zamówić z alli sama kość MB85RS64V czyli taki jak jest w adafruit i pójdzie od strzała?
W między czasie zamówiłem takie kości, jak przyjdą, pewnie za 4-6 tygodni, to spróbuję je odpalić. Jak kupiłem je tu: https://www.aliexpress.com/item/10050016...1802zIgCii tańsze x3, ale oznaczenia te same.
Do pamiętania stanu przekaźnika FRAM nie jest taki niezbędny, można emlować EEPROM we flash, jest też RAM w RTC który zachowuje dane przy resecie. FLASH ma jakoś 512B dla EEPROM, zapis 100k x, jak zapiszesz 0 lub 1, potem przy kolejnym obiegu 2 lub 3, itd., tak by prostym algorytmem oczytać/odgadnąć, która komórka zawiera ostatni zapis, to można je zapisać 51200000 x, tak co 1s = 38 lat.
Tak samo wykorzystując pamięć FRAM 8kB dla zapisu stanu 1 przekaźnika wystarczy na połowę czasu istnienia układu słonecznego, a tyle Ziemia już nie przetrwa, bo Słońce zamieni się w czerwonego olbrzyma i spali wszystko. Zapisuj chociaż 2 komórki, to styknie "tylko" na 3mld lat. No ale w sumie to przecież nie klepiesz przekaźnikiem co 1s, a tylko jak się stan zmieni to zapisujesz, więc jednak wszystko się zdąży zamienić w czarne dziury i potem odparować w fotony, czas przestanie istnieć, a FRAM dalej będzie zapamiętywał ostatni stan przekaźnika.
Stron: 1 2 3