-
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
0.net!eternal-september.org!feeder.eternal-september.org!news.eternal-september
.org!.POSTED!not-for-mail
From: "Pszemol" <P...@P...com>
Newsgroups: pl.misc.elektronika
Subject: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
Date: Wed, 8 Feb 2017 08:07:37 -0600
Organization: A noiseless patient Spider
Lines: 1
Message-ID: <o7f8jr$e99$1@dont-email.me>
References: <o7ddno$b28$1@dont-email.me>
Reply-To: "Pszemol" <P...@B...com>
Mime-Version: 1.0
Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=original
Content-Transfer-Encoding: 8bit
Injection-Date: Wed, 8 Feb 2017 14:05:47 -0000 (UTC)
Injection-Info: mx02.eternal-september.org;
posting-host="b5033965d746a09638d249a282baf9fb";
logging-data="14633";
mail-complaints-to="a...@e...org";
posting-account="U2FsdGVkX1/6Ujo2gcJG0jnq7uN3EOmL"
X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416
In-Reply-To: <o7ddno$b28$1@dont-email.me>
X-Newsreader: Microsoft Windows Live Mail 14.0.8117.416
Importance: Normal
Cancel-Lock: sha1:hzd8DBftWYIefDS1YI0r7kqt1Dw=
X-Priority: 3
X-MSMail-Priority: Normal
Xref: news-archive.icm.edu.pl pl.misc.elektronika:712860
[ ukryj nagłówki ]"Pszemol" <P...@P...com> wrote in message
news:o7ddno$b28$1@dont-email.me...
> 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:00 Adam Górski
- 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.
Najnowsze wątki z tej grupy
- Linuks od wer. 6.15 przestanie wspierać procesory 486 i będzie wymagać min. Pentium
- 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
Najnowsze wątki
- 2025-05-21 Wrocław => Konsultant wdrożeniowy Comarch XL (Logistyka, WMS, Produk
- 2025-05-21 Warszawa => Analityk IT (projekty z obszaru telco) <=
- 2025-05-21 Warszawa => IT Business Analyst (projects in the telco sector) <=
- 2025-05-21 Piec hybrydowy
- 2025-05-21 Warszawa => Senior Account Manager <=
- 2025-05-21 Warszawa => Tester Automatyzujący <=
- 2025-05-21 Warszawa => Test Automation Engineer <=
- 2025-05-21 Legitymowanie na granicy
- 2025-05-21 Warszawa => Manual tester <=
- 2025-05-21 Warszawa => Administrator Systemów OSS <=
- 2025-05-21 Warszawa => OSS System Administrator <=
- 2025-05-21 https://stolenhistory.net/threads/19th-century-radium-heating-systems.1452/
- 2025-05-21 https://stolenhistory.net/threads/19th-century-radium-heating-systems.1452/
- 2025-05-20 Pojemnik z radem jako ogrzewacz do stóp
- 2025-05-20 Nowość sprzed lat - Kominki opalane radem