LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Obsługa interfejsu pamięci zewnętrznej FlexBus w mikrokontrolerach Kinetis

Transfer pakietowy


Interfejs FlexBus może zostać skonfigurowany w taki sposób, aby inicjalizować cykle przesyłania pakietowego. Interfejs wyrównuje dane przenoszone przez grupy bajtów za pomocą liczby grup, zależnej od szerokości portu danych. Na rysunku 2 przedstawiono grupy bajtów, do których podłączona jest pamięć zewnętrzna, a także sekwencyjne 32-bitowe transfery obsługiwanych rozmiarów portów w przypadkach, gdy przełączenia toru bajtów jest aktywne lub nieaktywne.


 


Rys. 2. Sekwencyjne 32-bitowe transfery, różne konfiguracje torów bajtów

Rys. 2. Sekwencyjne 32-bitowe transfery, różne konfiguracje torów bajtów


 


Typowe mapowanie zewnętrznych pamięci za pomocą interfejsu FlexBus przedstawiono na rysunku 3. Zakres adresów 0x6000_0000…0xA000_0000 jest przestrzenią FlexBus przeznaczoną do przechowywania programów, a 0xA000_0000…0xE000_0000 może być wykorzystywana jedynie do przechowywania danych.


 


Rys. 3. Obszary pamięci zewnętrznych, dostępnych za pośrednictwem interfejsu FlexBus

Rys. 3. Obszary pamięci zewnętrznych, dostępnych za pośrednictwem interfejsu FlexBus


 


Na rysunku 4 przedstawiono schemat blokowy systemu taktującego interfejs FlexBus. Maksymalna częstotliwość taktowania FlexBus wynosi do 50 MHz.


 


Rys. 4. Schemat blokowy systemu taktującego

Rys. 4. Schemat blokowy systemu taktującego


 


Przykład obsługi interfejsu


Oprogramowanie mikrokontrolera musi skonfigurować stabilny sygnał zegarowy taktujący interfejs FlexBus (rejestr MCGOUTCLK). W poniższym przykładzie założono wartość częstotliwości sygnału taktującego CPU wynoszącą 96 MHz.


 

/* Fragment kodu. */
int MRAM_START_ADDRESS = 0x60000000;
uint8 wdata8 = 0x00;
uint8 rdata8 = 0x00;
uint16 wdata16 = 0x00;
uint16 rdata16 = 0x00;
uint32 wdata32 = 0x00;
uint32 rdata32 = 0x00;
/* Ustawienie adresu bazowego. */
FB_CSAR0 = MRAM_START_ADDRESS ;
/* Włączenie sygnału CS. */
FB_CSMR0 |= FB_CSMR_V_MASK;
FB_CSCR0 |= FB_CSCR_BLS_MASK // Tryb right justified
| FB_CSCR_PS(1) // 8-bitowy port.
| FB_CSCR_AA_MASK // Auto-potwierdzanie.
| FB_CSCR_ASET(0x1) // Pojawienie się sygnału wyboru struktury pamięci przy drugim // zboczu sygnału zegarowego po wykryciu adresu.
// | FB_CSCR_WS(0x1) // 1 stan oczekiwania – może wymagać stanu oczekiwania zależnego // od szybkości magistrali.
;
/* Ustatawienia maski adresu bazowego dla 512 kB przestrzeni adresowej. */
FB_CSMR0 |= FB_CSMR_BAM(0x7);
/* Ustawienie BE0/1 na MRAM. */
FB_CSPMCR |= 0x02200000;
/* Zegar referencyjny dzielony przez 3. */
SIM_CLKDIV1 &= ~SIM_CLKDIV1_OUTDIV3(0xF);
SIM_CLKDIV1 |= SIM_CLKDIV1_OUTDIV3(0x3);
/* Konfiguracja wyprowadzeń potrzebnych do funkcjonowania FlexBus (Alt 5). */
/* W przykładzie tym wykorzystano ustawienia niskiej siły sygnału sterującego transferem. */
//Adresy/dane.
PORTA_PCR7=PORT_PCR_MUX(5); //fb_ad[18] PORTA_PCR8=PORT_PCR_MUX(5); //fb_ad[17] PORTA_PCR9=PORT_PCR_MUX(5); //fb_ad[16] PORTA_PCR10=PORT_PCR_MUX(5); //fb_ad[15] PORTA_PCR24=PORT_PCR_MUX(5); //fb_ad[14] PORTA_PCR25=PORT_PCR_MUX(5); //fb_ad[13] PORTA_PCR26=PORT_PCR_MUX(5); //fb_ad[12] PORTA_PCR27=PORT_PCR_MUX(5); //fb_ad[11] PORTA_PCR28=PORT_PCR_MUX(5); //fb_ad[10] PORTD_PCR10=PORT_PCR_MUX(5); //fb_ad[9] PORTD_PCR11=PORT_PCR_MUX(5); //fb_ad[8] PORTD_PCR12=PORT_PCR_MUX(5); //fb_ad[7] PORTD_PCR13=PORT_PCR_MUX(5); //fb_ad[6] PORTD_PCR14=PORT_PCR_MUX(5); //fb_ad[5] PORTE_PCR8=PORT_PCR_MUX(5); //fb_ad[4] PORTE_PCR9=PORT_PCR_MUX(5); //fb_ad[3] PORTE_PCR10=PORT_PCR_MUX(5); //fb_ad[2] PORTE_PCR11=PORT_PCR_MUX(5); //fb_ad[1] PORTE_PCR12=PORT_PCR_MUX(5); //fb_ad[0] //Sygnały kontrolne.
PORTA_PCR11=PORT_PCR_MUX(5); //fb_oe_b
PORTD_PCR15=PORT_PCR_MUX(5); //fb_rw_b
PORTE_PCR7=PORT_PCR_MUX(5); //fb_cs0_b
PORTE_PCR6=PORT_PCR_MUX(5); //fb_ale
/* 8-bitowy odczyt. */
*(vuint8*)(MRAM_START_ADDRESS + n) = 0xAC; // n=offset
/* 8-bitowy odczyt. */
rdata8=(*(vuint8*)(&MRAM_START_ADDRESS + n)); // n = offset
/* 16-bitowy zapis. */
*(vuint16*)(MRAM_START_ADDRESS + n) = 0x1234; // n=offset
/* 16-bitowy odczyt. */
rdata16=(*(vuint16*)(&MRAM_START_ADDRESS + n)); // n = offset
/* 32-bitowy zapis. */
*(vuint32*)(MRAM_START_ADDRESS + n) = 0x87654321; // n = offset
/* 32-bitowy odczyt. */
rdata32=(*(vuint32*)(&MRAM_START_ADDRESS + n)); // n = offset