-
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;
> }
>
>
Następne wpisy z tego wątku
- 08.02.17 16:33 Pszemol
- 08.02.17 16:38 Pszemol
- 08.02.17 17:03 Adam Górski
- 08.02.17 17:26 Pszemol
- 08.02.17 19:52 Janusz_k
- 08.02.17 20:31 Pszemol
- 08.02.17 21:33 Pszemol
- 09.02.17 12:13 Pszemol
- 09.02.17 12:58 Adam Górski
- 09.02.17 14:17 Piotrek
- 09.02.17 14:32 Adam Górski
- 09.02.17 14:56 Piotrek
- 09.02.17 17:03 Piotr Dmochowski
- 10.02.17 10:53 J.F.
- 10.02.17 15:55 Pszemol
Najnowsze wątki z tej grupy
- Propagation velocity v/c dla kabli RF
- Jakie natynkowe podwójne gniazdo z bolcem (2P+PE)
- Czujnik nacisku
- Protoków komunikacyjny do urządzenia pomiarowego
- Hiszpania bez pradu
- amperomierz w plusie
- 3G-nadal działa
- Historia pewnego miernika kalibratora
- Ustym 4k Pro i wyświetlacz
- Czemu rozwaliło celę?
- Wojna w portfelu
- Jaki trojfazowy licznik tuya lub podobny?
- Problem z dekoderem adresów
- Intel się wyprzedaje: po 10latach pchnęli pakiet kontrolny Altery za 1/4 kwoty zakupu
- Korekcja perspektywy
Najnowsze wątki
- 2025-05-10 Szczecin => Key Account Manager IT <=
- 2025-05-10 Rudno => Administrator sieci IT <=
- 2025-05-10 Wrocław => Controlling systems Consultant <=
- 2025-05-10 Rudno => IT network administrator <=
- 2025-05-10 Warszawa => Customer Service with Spanish + translation <=
- 2025-05-10 Warszawa => Senior Account Manager <=
- 2025-05-10 Trójmiasto => Head of Social Media <=
- 2025-05-10 Warszawa => C Programmer <=
- 2025-05-10 Warszawa => Java Developer <=
- 2025-05-10 powąchaj instrybutor
- 2025-05-10 Prawomocny wyrok. Rowerzysta nie ma pierwszeństwa, dojeżdżając do przejazdu
- 2025-05-09 Propagation velocity v/c dla kabli RF
- 2025-05-09 Warszawa => Senior Node.js Developer (doświadczenie z framework Nest.
- 2025-05-09 Patrolowanie kampusów
- 2025-05-09 Faktyczne opodatkowanie medianowej płacy w Polsce wyniosło 39,4% w lis. 2024r.