eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaprogramowanie i kasowanie dwu kostek flash na jednej magistraliRe: programowanie i kasowanie dwu kostek flash na jednej magistrali
  • Data: 2017-02-08 16:00:24
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Adam Górski <gorskiamalpawpkropkapeel_@xx> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Gdybyś tak zrobił jedno miejsce przez które przechodzą wszystkie zapisy
    i odczyty z printfem jakie zapisy idą do pamięci, to by pewnie było już
    po problemie.
    Do sprawdzenia:
    1. Reprezentacja danych w pamięci. Czy aby na pewno bajty/słowa nie są
    zamienione.
    2. Czy w Twoim przypadku rozmiar sektora jest 0x20000 ? A może 0x40000 ?
    Masz przesunięty adres.
    3. Jak nie jesteś pewny to oscyloskop do łapy i sprawdź czy jest to co
    Ci się wydaje.

    Adam

    >> Czy mial ktos z Was do czynienia z konfiguarcją hardware polegającą na
    >> 32-bitowym procku (Arm Cortex M4) obsługującym dwie zewnętrzne pamięci
    >> flash 16-bitowe (ST:M29W640GL)?
    >>
    >> Wydawałoby się, że zadanie trywialne, a jednak kostki nie chcą
    >> współpracować... :-)
    >>
    >> Obie kostki pamięci mają wspólne sygnały Cs, Oe, We i A0..Axx a
    >> magistrala
    >> danych po połowie 0..15 i 16..31 przydzielona odpowiednio do 0..15 każdej
    >> kostki.
    >>
    >> Procek ustawiony na 32bit i aby używał "address shift mode" (EMC Shift
    >> Control bit w SCS registrze jest 0) więc "nie wie" ze sa dwi kostki w
    >> żaden
    >> inny sposob jak tylko to, że zamiast do kasowania sektora wysylac
    >> 16-bitowo
    >> 0x00AA i 0x0055 a potem 0x0080 wysylam 32-bitowo 0x00AA00AA, 0x00550055 i
    >> 0x00800080.
    >>
    >> I do tego problem jest ze czasem to dziala a czasem nie dziala. Jak nie
    >> dziala to albo przy zmieniajacym sie bicie 2 jest ustawiony bit 5
    >> (error) a
    >> czasem juz na samym koncu przy sprawdzeniu odczytu skasowanej lokacji
    >> jest
    >> jedna kostka skasowana a druga nieskasowana (na szynie jest np
    >> 0xFFFF0000).
    >>
    >> Czy do takiej konfiguracji pamieci podchodzi sie jakos inaczej do
    >> kasowania/programowania? Ktos sie podzieli doswiadczeniem?
    >
    > A może ktoś zechce popatrzeć na kod programu i znaleźć "słabe" jego strony?
    > Zachęcam gorąco... :-)
    >
    > // returns 1 if success
    > int STFlashEraseSector32(unsigned int SectorAddress)
    > {
    > U32 Status1, Status2;
    > volatile U32 *pSector = (volatile U32 *)(SectorAddress -
    > (SectorAddress % 0x20000));
    > volatile U32 *pStatus = pSector;
    >
    > // EMCSC bit in System Controls and Status register is cleared in
    > Flash_Init().
    > // It controls how addresses are output on the EMC address pins.
    > // For 32 bit bus the address is shifted so A2 is on A0 pin.
    > U32 *pA1 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x555 << 2)); //555
    > 16bit mode
    > U32 *pA2 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x2AA << 2)); //2AA
    > 16bit mode
    >
    > // Reset
    > *pA1 = 0x00AA00AA;
    > *pA2 = 0x00550055;
    > *pSector = 0x00F000F0;
    > //
    > *pA1 = 0x00AA00AA;
    > *pA2 = 0x00550055;
    > *pA1 = 0x00800080; //erase
    > *pA1 = 0x00AA00AA;
    > *pA2 = 0x00550055;
    > *pSector = 0x00300030; //erase sector
    >
    > //check toggle bit2 indicating erase operation pending
    > while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1
    > << 2))
    > {
    > if(Status1 & (1 << 5)) // check error bit on one chip
    > {
    > LEDFRed();
    > return 0;
    > }
    > }
    > while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1
    > << (16+2)))
    > {
    > if(Status1 & (1 << (16+5))) // check error bit on second chip
    > {
    > LEDFRed();
    > return 0;
    > }
    > }
    >
    > // Reset
    > // *pA1 = 0x00AA00AA;
    > // *pA2 = 0x00550055;
    > // *pSector = 0x00F000F0;
    > // Check the erase
    > if(*pSector != 0xffffffff)
    > {
    > LEDFRed();
    > return 0;
    > }
    > else
    > return 1;
    > }
    >
    > // returns 1 if success
    > int STFlashWrite32(unsigned int Address, unsigned char *pSource,
    > unsigned int Size)
    > {
    > int Timeout;
    > U32 Status1, Status2;
    > volatile U32 *pDest = (volatile U32 *)Address;
    > U32 *pData = (U32 *)pSource;
    >
    > // EMCSC bit in System Controls and Status register is cleared in
    > Flash_Init().
    > // It controls how addresses are output on the EMC address pins.
    > // For 32 bit bus the address is shifted so A2 is on A0 pin.
    > U32 *pA1 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x555 << 2)); //555
    > 16bit mode
    > U32 *pA2 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x2AA << 2)); //2AA
    > 16bit mode
    >
    > if((Address & 0x01) != 0x00 || (Address & 0x02) != 0x00)
    > return 0;
    > if(((U32)pSource & 0x01) != 0x00 || ((U32)pSource & 0x02) != 0x00)
    > return 0;
    >
    > for(unsigned int i = 0; i < Size/4; i++)
    > {
    > Timeout = 0;
    > // Reset
    > *pA1 = 0x00AA00AA;
    > *pA2 = 0x00550055;
    > *pDest = 0x00F000F0;
    > //
    > *pA1 = 0x00AA00AA;
    > *pA2 = 0x00550055;
    > *pA1 = 0x00A000A0; //program
    > *pDest = *pData; //data word
    > //check toggle bit for each chip separatelly
    > while(Status1 = *pDest, Status2 = *pDest, (Status1 ^ Status2) & (1
    > << 6))
    > {
    > if(Status1 & (1 << 5)) // check error bit on one chip
    > {
    > LEDEYellow();
    > return 0;
    > }
    > if(++Timeout > 10000)
    > {
    > LEDDGreen();
    > return 0;
    > }
    > }
    > while(Status1 = *pDest, Status2 = *pDest, (Status1 ^ Status2) & (1
    > << (16+6)))
    > {
    > if(Status1 & (1 << (16+5))) // check error bit on second chip
    > {
    > LEDEYellow();
    > return 0;
    > }
    > if(++Timeout > 10000)
    > {
    > LEDDGreen();
    > return 0;
    > }
    > }
    > // Reset
    > // *pA1 = 0x00AA00AA;
    > // *pA2 = 0x00550055;
    > // *pDest = 0x00F000F0;
    > // check write
    > if(*pDest != *pData)
    > {
    > LEDDGreen();
    > LEDEYellow();
    > return 0;
    > }
    > ++pDest;
    > ++pData;
    > }
    >
    >

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: