Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Problem sa direktnim upisom u flash
#1
Radio sam sve sto mi je palo na pamet ali PIC24FJ256GB106 nece da upise sadrzaj u interni flash preko adrese 0x200F8.
Dakle, do nje sve radi OK, upise i u nju ali vec u 0x200FA nece da mu das cokoloadu.

Evo slike kako izgledaju memorijske lokacije nakon upisa.

Evo i najglupljeg moguceg koda kojim sam testirao. Ima li neko ideju?


Code:
#include <p24Fxxxx.h>
#include "GenericTypeDefs.h"


   _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx2)
   _CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_ON & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV3 & IOL1WAY_ON)
   _CONFIG3( WPDIS_WPDIS )
           
void WriteLatch(WORD page, WORD addrLo, WORD dataHi, WORD dataLo);
void WriteFlash(DWORD_VAL addr, unsigned char data);


int main(void)
{
  //init LED's
   LATG &= 0xFC3F; TRISG &= 0xFC3F; LATF &= 0xFFCF; TRISF &= 0xFFCF; //G6,7,8,9 and F4,5
   TRISF |= 0x0030;
   TRISG |= 0x0300;
   TRISG &= 0x00C0;

unsigned char data;
DWORD_VAL sourceAddr;

   data = 'P';
   sourceAddr.Val = 0x200F0;
   WriteFlash(sourceAddr, data);

   data = 'I';
   sourceAddr.Val = 0x200F2;
   WriteFlash(sourceAddr, data);
   
   data = 'C';
   sourceAddr.Val = 0x200F4;
   WriteFlash(sourceAddr, data);

   data = '2';
   sourceAddr.Val = 0x200F6;
   WriteFlash(sourceAddr, data);

   data = '4';
   sourceAddr.Val = 0x200F8;
   WriteFlash(sourceAddr, data);

   data = 'F';
   sourceAddr.Val = 0x200FA;
   WriteFlash(sourceAddr, data);

   data = 'J';
   sourceAddr.Val = 0x200FC;
   WriteFlash(sourceAddr, data);
 
   TRISF ^= 0x0030;
   while(1)
   {
   }

   return 0;
       
}

void WriteLatch(WORD page, WORD addrLo, WORD dataHi, WORD dataLo)
{
TBLPAG = page;

__builtin_tblwtl(addrLo, dataLo);
__builtin_tblwth(addrLo, dataHi);

}


void WriteFlash(DWORD_VAL addr, unsigned char data)
{
unsigned char i = 0;
DWORD_VAL tmp;

NVMCON = 0x4003;

   asm("clrwdt");

tmp.v[0] = data;
tmp.v[1] = 0;
tmp.v[2] = 0;
tmp.v[3] = 0;

//write data into latches
   WriteLatch(addr.word.HW, addr.word.LW, tmp.word.HW, tmp.word.LW);

//execute write sequence
   __builtin_disi(5);
   __builtin_write_NVM();
   while(NVMCONbits.WR == 1);
   
NVMCONbits.WREN = 0;

}
Dakle, kod treba da upise: "PIC24FJ" a vidi se samo "PIC24"
'F' treba da bude na lokaciji 0x200FA a 'J' na lokaciji 0x200FC


Attached Files Thumbnail(s)

Reply
#2
Brzinski, da li si prethodno obrisao Page? Kod FLASH memorije, moraš obavezno prvo brisanje celog PAGE-a (proveri koliki je SECTOR/PAGE kod tog MCU) pa onda tek upis...
Reply
#3
Obrisan je flash. Nije to problem.
On pise do adrese 0x200F8 (ukljucujuci i nju) ali preko nece. Ta adresa nije cak ni neka granica (page ili slicno) vec obicna adresa.
Ja cak mogu da smestim neki kod iznad te adrese, mogu da smestim konstante ali kad pokrenem proceduru za upis u flash preko:


Code:
__builtin_tblwtl(addrLo, dataLo);
__builtin_tblwth(addrLo, dataHi);

To nece da radi. Kao da ovo adresiranje ima fizicki limit a po datasheet/u nije tako.
Reply
#4
Da ti nije zaključan taj deo FLASH-a za upis, Config Fuses, pogledaj stranicu 291 u ovom datasheet-u:
http://ww1.microchip.com/downloads/en/de...39897c.pdf
Reply
#5
Nije ni to proveravao sam vec. Menjao sam konfiguracione bitove. Bio bi problem vezan za adresu koja oznacava pocetak nekog bloka. Ova adresa je skroz bezveze. Ne predstavlja nista samo od nje pa nadalje upis ne radi. Trazio sam i po errata ali nista se ne spominje. Mozda ovaj PIC koji je na Starter Kitu ima neki problem a ja sad treba da porucim drugi pa da cekam....
Reply
#6
Upravo sa kolegom imao sastanak oko STM32 i pokazivao sam mu interne funkcije od FRAM drajvera ...
Jel vam treba drajver? Smile
Batalite FLASH, FRAM je buducnost ...
Texas to ima u svojim kontrolerima inace ...
Reply
#7
Mislim, taj Flash prvo ima PAGES, joj, pa sto, sto ne moze lepo jedna lokacija da se upise? Ima Clear, aman cemu sluzi Clear? Smile Smile
Flash ima delay kod upisa, kolioo bese milisekundi, amaaaan ... Smile
FRAM je za takvu vrstu storiga svetlosnu godinu napredniji i trajniji, tu nema diskusije, plus SW integracija sa HW SPI je odlicna, to radi kao sat do zadnjeg specificiranog MHz!
Ljudi, prvo izaberete MCU, izaberete FRAM pa onda sve ostalo od periferija Smile Svaki pokusaj da se to zaobidje vodi u neke probleme ...
Reply
#8
Evo konkretan drajver, malo je vise komentarisan bas da bude pokazan primer sta svaka linija tog programa radi.

Funkcija FR_SPI2_8_transfer() je tu u sustini glavna, ona se obraca direktno periferiji, sve ostalo je izvedeno iz te funkcije, read/write lokacija, kod mene su podaci (parametri) organizovani kao 32bit tako da zauzimaju 4bytes.

Drajver za FRAM bukvalno ima samo ovo da obradi kroz FR_SPI2_8_transfer():

//FRAM commands
#define FR_WREN 6
#define FR_WRDI 4
#define FR_RDSR 5
#define FR_WRSR 1
#define FR_READ 3
#define FR_WRITE 2

Code jeste blocking ali za takve stvari ne moze drugacije i zato je tu SPI komunikacija koja moze da se podigne na 20+MHz.
Samo upisivanje u memorisku lokaciju je prakticno zavrsen proces, nema vise nista dalje da se ceka, imaju komande za single i burst read/write i to je sve sto treba da ima takva periferija koja cuva neke bitne podatke masine.


Attached Files
.c   FRAM_spi.c (Size: 13,37 KB / Downloads: 2)
.h   FRAM_spi.h (Size: 1,55 KB / Downloads: 2)
Reply
#9
Na komad-dva mozes da biras na vise hiljada sve je vec odabrano. Ne zamaram se ja previse oko toga o tome misli neko drugi.
Moj je firmware a nervira me ako nesto ne radi a treba da radi.
Reply
#10
Znam sve, samo sto sam ja to tako u startu postavio, taj FRAM tek onda daje jos neke nove funkcije koje pre toga nismo mogli da imamo tako da je on tu super-mega koristan, ne isplati se stavljati nista drugo, taj sto je odlucivao ocigledno nje dobro istrazio sve opcije, nije ovaj FRAM od juce, odavno se to koristi, mislim da je vec 10+ godina u upotrebi.
Reply
#11
Vidi prvo je interesatno pitanje da li koristis tu fizicki USB na tom PIC24FJ256GB110, dodatno uz to se oslanjas na interni Flash i da li je low-power uredjaj u pitanju?
Prvo USB i low-power ne ide mnogo zajedno tako da recimo Texas Instruments ima kontrolere sa FRAM ali ni jedan nema USB na sebi, pitali ljudi na TI forumu i tako im odgovorili Smile
Reply
#12
FRAM je super stvar, ali nije neophodna za sve namene... jednostavno postoji potreba da se u mnogim uređajima upišu neka korisnička podešavanja, tipa adresa uređaja, GSM broj telefona, vrednost zadatog parametra itd... i to se radi jednom ili svega nekoliko puta u toku eskploatacije uređaja. Spor je upis, ali to nije bitno.

Tome jako dobro može poslužiti interni FLASH u mikrokontroleru. Evo primera da se ovo ozbiljno shvata, su ljudi iz ST-a napravili optimalnu biblioteku za rad sa FLASH momorijama koja simulira EEPROM, sa osvrtom na:
- Wear leveling algorithm to increase emulated EEPROM cycling capability
- Increased EEPROM memory endurance versus Flash memory endurance
- Robust against asynchronous resets and power failures.

https://www.st.com/en/embedded-software/...eprom.html
Reply
#13
Da ali ja opet navodim user case gde trebam nesto da logujem i to relativno cesto i relativno dosta podataka, sta ce da se desi sa tim Flash ako logujem recimo samo 10 parametra svaki 32bit duzine svakih jedan minut? Koliko ce da pozivi taj Flash?
Zelim da logujem na primer broj radnih minuta masine, zelim da logujem CRC greske, da logujem noise i parity flagove od seriske komunikacije, ukupan broj RX/TX paketa, ukuban broj bytova posto su paketi razlicite duzine i tako dalje i to svakih minut ili cesce i ne zelim da se izgube kada uredjaj ostane bez struje, zelim da stoje tu gde jesu od sad pa nadlje dok iz programa ne kazem drugacije Smile
Reply
#14
Miki,

nisam radio nikada sa FRAM-om. Pitanje jedno ako znas. Koja je trenutno najveca FRAM memorija u pogledu memorije kByte, Mbyte ili Gbyte?
Reply
#15
Cypress, Futjitsu, Texas Instruments i verovatno jos neko ima u ponudi memorije i kontolere sa FRAM memorijom, drugacije ih nazivaju ali to je to u sustini.
Trenutno se krece u okvirima od nekoliko MBit, zadnji koji sam koristio je bio 8Kbyte i to je meni puna kapa bila, imao sam 2x backup lokacije jer nisam potrosio sve za ove moje male STM32 potrebe ...

https://www.fujitsu.com/global/products/...mory/fram/
https://www.fujitsu.com/global/documents...-1v0-E.pdf
Reply
#16
@mikikg Naravno da FLASH nije za tako dinamične loger namene Smile Tu je neprikosnovena FRAM. Ali za user case smeštaja parametara rada uređaja, po meni, nije loše rešenje interni FLASH današnjih mikrokontrolera. 

@vojinilic Ja sam skoro nešto tražio, mislim da ih ima 4 ili 8MBy i cena je nešto oko 20 Eura
Reply
#17
(04-17-2019, 12:46 PM)mikikg Wrote: Da ali ja opet navodim user case gde trebam nesto da logujem i to relativno cesto i relativno dosta podataka, sta ce da se desi sa tim Flash ako logujem recimo samo 10 parametra svaki 32bit duzine svakih jedan minut? Koliko ce da pozivi taj Flash?
Zelim da logujem na primer broj radnih minuta masine, zelim da logujem CRC greske, da logujem noise i parity flagove od seriske komunikacije, ukupan broj RX/TX paketa, ukuban broj bytova posto su paketi razlicite duzine i tako dalje i to svakih minut ili cesce i ne zelim da se izgube kada uredjaj ostane bez struje, zelim da stoje tu gde jesu od sad pa nadlje dok iz programa ne kazem drugacije Smile

Nece da se desi nista, jer niko kome treba da loguje tako nesto nece koristiti flash za logovanje to je valjda jasno i stvar opste kulture i informisanosti sta moze flash, koliko upisa, brzina upisa itd.
Previse karikiras stvari i nameces neka resenja pocev od frama preko stm i ostalo, po sistemu to i nista drugo Smile
Da me ne shvatis pogresno, niko ovde ne spori napisano, da je to nemerljivo bolje resenje ali sve ima svoje zasto se nesto koristi.
Reply
#18
Sve ok, Mikija u potpunosti razumem, oduševljenje FRAMom je veliko i lično smatram da je veliko otkriće u odnosu na EEPROM i FLASH. Meni još uvek smeta visoka cena inače bih ga uveliko koristio u svojim komercijalnim projektima koje radimo kao firma.

Inače za potrebe logera sporopromenljivih parametara kao što su temperatura i vlažnost vazduha (konkretno u MTIV09 koristimo SST25VF032) nema tu nikakvih problema ni sa 100000 upisa koliko FLASH mem dozvoljava jer se ne upisuje uvek u jednu flash lokaciju.
Reply
#19
FRAM je inače pravi biser kad treba nešto upisati za vreme dok ti pada napajanje MCU :-)
Iskoristi se detekcija negde ispred stabilizatora za jezgro i dok padne do granice BOR može se upisati priično toga...

(04-16-2019, 05:27 PM)gorankg Wrote: Nije ni to proveravao sam vec. Menjao sam konfiguracione bitove. Bio bi problem vezan za adresu koja oznacava pocetak nekog bloka. Ova adresa je skroz bezveze. Ne predstavlja nista samo od nje pa nadalje upis ne radi. Trazio sam i po errata ali nista se ne spominje. Mozda ovaj PIC koji je na Starter Kitu ima neki problem a ja sad treba da porucim drugi pa da cekam....

Jesi li probao neki drugi PIC iz slične serije?
Ako ti samo taj baguje iznad te adrese, verovatno je do njega i možda nisu još napravili errata za to jer se možda niko nije žalio.

Probaj da se obratiš upravo firmi Microchip. Izneseš im svoja zapažanja i možda uoče problem koji nisu otkrili i isprave ga.

Errata dokumenti se inače i pišu na osnovi žalbi korisnika. Neki fidbek im je neophodan za to.
Reply
#20
Sve vas razumem i potpuno je tacno sve sto pricate, zna se zasta se koristi FLASH i zasta FRAM, zato npr moj robot sa RPi ima i jedno i drugo i sutra kad mi se cefne mogu da odkacim RPi i stavim nesto drugo i da mi sve moje bitne stvari i dalje tu stoje na gomili tolno nevezane za glavni procesor i to ostavljen u onom stanju gde je zadnji put bio pre iskljucivanja tako da mogu da upgrejdujem sistem i ceo kontroler i nastavim dalje sa radom masine, svi statusi mi stoje tu i tako dalje, to je fenomenalan pristup za par USD koliko kosta IC a sto je na ukupnu cenu robota smesno.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)