logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błąd transmisji danych C++ do Arduino - brakujące 64 bajty w pamięci EEPROM 24LC32

08 Wrz 2020 10:37 1728 51
Najlepsze odpowiedzi

How do I reliably send 4 KB of data from a PC through Arduino to a 24LC32A EEPROM so the last bytes are not lost?

Musisz wysyłać dane do 24LC32A strona po stronie, po 32 bajty, i po każdym zapisie czekać na zakończenie wewnętrznego cyklu zapisu, bo EEPROM potrzebuje do ok. 5 ms i nie przyjmie kolejnej strony od razu [#18913473][#18914286][#18913583] Nie sprawdzałeś też błędów zwracanych przez Wire/extEEPROM, więc warto dodać obsługę returnów i ewentualnie odczyt weryfikacyjny; sama extEEPROM::write() tylko sygnalizuje błąd, nie porównuje danych [#18913919][#18914754] Przy 400 kHz na I2C potrzebne są zewnętrzne rezystory pull-up na SDA/SCL, bo linie są typu open-drain; w wątku padły wartości rzędu 4,7 kΩ albo 3,3 kΩ, a wewnętrzne pull-upy ATmegi są za słabe [#18915164][#18915941][#18916842][#18916025] Dla niezawodności lepiej wysyłać dane w mniejszych porcjach z prostym handshake'em, START-em i sumą kontrolną, żeby nadajnik nie wyprzedzał odbiornika [#18922485][#18923899] Biblioteka extEEPROM upraszcza obsługę pamięci, ale nie zastępuje kontroli czasu zapisu ani błędów magistrali [#18913919][#18914754]
Wygenerowane przez model językowy.
  • #1 18913007
    Konto nie istnieje
    Poziom 1  
  • #2 18913333
    n6210
    Poziom 29  
    Posty: 1000
    Pomógł: 126
    Ocena: 168
    Na początek sprawdź, że jesteś pewny, że zapisujesz wszystkie dane poprawnie, bo ani nie czekasz jakiegoś stałego czasu po zapisie strony ani nie sprawdzasz czy eeprom już skończył (przynajmniej ja nie widzę czegoś takiego), a kolejne zapisy można wykonywać dopiero jak skończy zapis. Błędu zapisu z I2C też jakby nie obsługujesz a na coś trzeba by się zdecydować. To tak na pierwszy rzut oka.

    Dodano po 2 [minuty]:

    te różne prędkości dla odczytu i zapisu to celowo?
  • #3 18913439
    Konto nie istnieje
    Poziom 1  
  • #4 18913473
    Zielonka
    Poziom 22  
    Posty: 363
    Pomógł: 55
    Ocena: 44
    Witam
    Nie możesz wysłać od razu 4kB do EEPROM-a. Pamięć potrzebuje ok. 5~10 ms na zapis jednej strony (256 bajtów). Czyli musisz wysyłać 256 bajtów i czekać aż dane się zapiszą.
    Pozdrawiam
    W.B.
  • #5 18913583
    Konto nie istnieje
    Poziom 1  
  • #6 18913919
    Konto nie istnieje
    Poziom 1  
  • #7 18914286
    Zielonka
    Poziom 22  
    Posty: 363
    Pomógł: 55
    Ocena: 44
    Wstaw po zapisaniu każdej strony opóźnienie minimum 5 ms i zobacz co się stanie.
  • #8 18914573
    Konto nie istnieje
    Poziom 1  
  • #9 18914676
    Konto nie istnieje
    Poziom 1  
  • #10 18914719
    Konto nie istnieje
    Poziom 1  
  • #11 18914736
    Konto nie istnieje
    Poziom 1  
  • #12 18914738
    Konto nie istnieje
    Poziom 1  
  • #13 18914754
    Konto nie istnieje
    Poziom 1  
  • #14 18914782
    Konto nie istnieje
    Poziom 1  
  • #15 18914790
    Konto nie istnieje
    Poziom 1  
  • #16 18915089
    Zielonka
    Poziom 22  
    Posty: 363
    Pomógł: 55
    Ocena: 44
    aj123 napisał:
    Co do tej biblioteki extEEPROM; no fajnie, uprości trochę kod, ale w czym ma mi ona pomóc? Będe mógł zapisać stronę danych np 32B na raz, ale to i tak odbije się na wydajności tego zapisu (a przynajmniej tak zrozumiałem z opisu).

    Po zapianiu jednej strony pamięci EEPROM z I2C musisz czekać, aż dane się zapiszą. Jeżeli chcesz robić to wydajnie to zastosuj w projekcie EEPROM z SPI.
  • #17 18915135
    Konto nie istnieje
    Poziom 1  
  • #18 18915164
    Konto nie istnieje
    Poziom 1  
  • #19 18915202
    Konto nie istnieje
    Poziom 1  
  • #20 18915258
    Konto nie istnieje
    Poziom 1  
  • #21 18915273
    Konto nie istnieje
    Poziom 1  
  • #22 18915281
    Konto nie istnieje
    Poziom 1  
  • #23 18915428
    Konto nie istnieje
    Poziom 1  
  • #24 18915532
    Konto nie istnieje
    Poziom 1  
  • #25 18915859
    Konto nie istnieje
    Poziom 1  
  • #26 18915941
    Konto nie istnieje
    Poziom 1  
  • #27 18916025
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38683
    Pomógł: 3162
    Ocena: 6449
    Tak w skrócie, to drivery linii I2C są driverami typu OD, czyli wymuszać mogą wyłącznie stan niski, a za istnienie stanu wysokiego odpowiada właśnie rezystor podciągający... owszem - można użyć wewnętrznych pull-upów po stronie ATMegi, ale nie są one wystarczające do przełączania z szybkością 400 kHz.
  • #28 18916764
    Konto nie istnieje
    Poziom 1  
  • #29 18916837
    Konto nie istnieje
    Poziom 1  
  • #30 18916842
    tzok
    VIP Zasłużony dla elektroda
    Posty: 38683
    Pomógł: 3162
    Ocena: 6449
    4,7 kΩ, ew. 3,3 kΩ, minimalna dopuszczalna wartość to ok. 1,6 kΩ (przy logice 5 V).

Podsumowanie tematu

✨ W dyskusji poruszono problem przesyłania danych z PC do Arduino, które zapisuje je w pamięci EEPROM 24LC32. Użytkownik zauważył, że podczas odczytu brakuje 64 bajtów. Uczestnicy sugerowali, że problem może wynikać z braku odpowiednich opóźnień między zapisami, ponieważ EEPROM wymaga czasu na zapis każdej strony (256 bajtów). Zasugerowano użycie biblioteki extEEPROM do uproszczenia kodu oraz dodanie mechanizmu weryfikacji poprawności zapisanych danych. Użytkownik dostosował swój kod, aby przesyłać dane w paczkach po 32 bajty, co poprawiło wydajność. Wskazano również na znaczenie rezystorów pull-up w szynie I2C oraz na problemy z komunikacją po odłączeniu zasilania, które mogą wymagać ponownego zaprogramowania Arduino, aby przywrócić funkcjonalność.
Wygenerowane przez model językowy.
REKLAMA