FMC sběrnice mezi STM a FPGA

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

FMC sběrnice mezi STM a FPGA

Príspevok od používateľa jirka.jirka. » 07 Dec 2018, 13:23

Zdravím.

Narazil jsem na FMC sběrnici. Snažil jsem se o tom dozvědět nějaké info, ale nic jsem pořádně nenašel. Není zde někdo, kdo by měl nějaké čitelné podklady? Jazyk ideálně CZ/SK, ale nepohrdnu ani ENG.

Co přesně hledám:
1. K čemu se to používá/dá využít
2. Nějaké ukázky

Díky moc
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa Radus » 08 Dec 2018, 20:10

Ahoj Jirka, neviem popravde ako funguje FMC medzi STM a FPGA, ale štandartne sa využáva na namapovanie externaj pamati, prípadne sa to dá využiť (aj sa využíva) aj na riadenie displeja, keď sa ten vlastne namapuje ako externá pamať. To su asi tak moje chabé znalosti, ale určite ich upresní niekto znalejší.
Ak si vygoogliš STM32 FMC dostaneš kopu materiálov, aj celkom použiteľných. V STDlibs nájdeš na to knižnicu.
0

Používateľov profilový obrázok
daqq
Power user
Power user
Príspevky: 2528
Dátum registrácie: 10 Jún 2008, 00:00
Bydlisko: Bratislava
Vek: 36
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa daqq » 09 Dec 2018, 10:22

1. K čemu se to používá/dá využít?
FMC rozhranie ti umoznuje namapovat zariadenia priamo do casti pamatoveho priestoru ARM procesora prostrednictvom rychleho paralelneho rozhrania. Vyhoda oproti inym pripojeniam je rychlost a to, ze na to mozes postvat DMA. Dalsou vyhodou oproti bit bang mas to, ze tento modul sa ti stara o vsetko casovanie a roznu reziu. Klasicky sa to pouziva na pripojenie velkej externej RAM/FLASH pamate. Kedze spominas FPGAcko tak mozes si napriklad v FPGAcku spravit taketo rozhranie a budez z FPGA vytahovat data velkou rychlostou, alebo budes FPGAcko krmit datami.

www.e4ds.com/webinar_tech_dn.asp?idx=178
2. Nějaké ukázky
Stiahni si pre tvoj konkretny procesor Cube package, je tam dost ukazok pre vsetko.
0
Outsource your thinking: Get religious!
Zistenie: Ked robite sucasne v C, C++, C#, Matlabe, trocha pokukujete po VHDL, sialenstvo nemoze byt daleko...este stastie, ze som lietadlo a nemam tieto problemy.

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa Tribec Zacks » 09 Dec 2018, 14:57

zdar jirka,
ako ti uz chalani napisali, FMC/FSMC su rozhrania na mapovanie externych zariadeni, pamati, lcd (s kontrolermi), cohokolvek co ma adresny priestor. ked sa pozres na blok diagram FMC/FSMC tak na nom ti ukazuje set signalov ako PSRAM/NOR/NAND/SDR atd, nepozeraj na ne ako na tieto konkretne zariadenia ako mozne pripojitelne, ale skor ako na casovanie/protokol zbernice ktore je FMC/FSMC schopne obsluzit, konfiguraciou FMC vies upravit casovanie pre konkretne pripojene zariadenie. vo vysledku ti to bude cele transparentne a do zariadenia budes len zapisovat/citat z adresy ktora je mapnuta na ten ktory FMC bank a jeho systemovy offset.
na FPGA si budes muset urobit rozhranie ktore vie komunikovat s tym ktore si na FMC vyberes na pouzivanie a ktore ti najviac vyhovuje pre tvoju aplikaciu. mrkni v M4/F7 datashitoch "External memory interface signals" to ti ako prve napovie ako ma to ktore rozhranie vypadat, zbytok je otazka nastavenia casovania, vybratia ktora banka na to musi byt pouzita atd. detailne info pre FMC najdes v AN4570.
ak by si potreboval nejake specificke nastavenie tak mozem prihodit pre nor/sram, klasika address, data, chip select, write/read (pouzite pre lcd), alebo mam aj pre sdr co momentalne pouzivam na stm32f7disco.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa jirka.jirka. » 02 Máj 2019, 12:58

Zdravíčko pánové a dámy.

opět se vracím. Namapoval jsem si FMC sběrnici na STM32F427. Takt: 168MHz.

Nyní rozjíždím zápis. Protistranu mi dělá FPGA.

Inicializace FMC na STM32

Kód: Vybrať všetko

void initFMC(void)
{
	FMC_pins();

	(RCC->AHB3ENR |= (RCC_AHB3ENR_FMCEN));
	//LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_FMC);

	FMC_NORSRAM_InitTypeDef Init;
	FMC_NORSRAM_TimingTypeDef Timing;

	FMC_NORSRAM_TypeDef *Instance;
	FMC_NORSRAM_EXTENDED_TypeDef *Extended;

	Instance = FMC_NORSRAM_DEVICE;
	Extended = FMC_NORSRAM_EXTENDED_DEVICE;

	Init.NSBank = FMC_NORSRAM_BANK2;
	Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_ENABLE;
	Init.MemoryType = FMC_MEMORY_TYPE_PSRAM;
	Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
	Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
	Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
	Init.WrapMode = FMC_WRAP_MODE_DISABLE;
	Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
	Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
	Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
	Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
	Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
	Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
	Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;

	/* Timing */
	//rozliseni dle frek jadra pri 168Mhz je to cca 6ns
	Timing.AddressSetupTime = 7; //11;
	Timing.AddressHoldTime = 1; //2;
	Timing.DataSetupTime = 10; //16;
	Timing.BusTurnAroundDuration = 6;
	Timing.CLKDivision = 16;
	Timing.DataLatency = 17;
	Timing.AccessMode = FMC_ACCESS_MODE_A;

	FMC_NORSRAM_Init(Instance, &Init);
	FMC_NORSRAM_Timing_Init(Instance, &Timing, Init.NSBank);
	FMC_NORSRAM_Extended_Timing_Init(Extended, NULL, Init.NSBank, Init.ExtendedMode);

	__FMC_NORSRAM_ENABLE(Instance, Init.NSBank);
}
Podpůrné funkce.

Kód: Vybrať všetko

rrorStatus FMC_NORSRAM_Init(FMC_NORSRAM_TypeDef *Device, FMC_NORSRAM_InitTypeDef* Init) {

	uint32_t tmpr = 0U;

	/* Get the BTCR register value */
	tmpr = Device->BTCR[Init->NSBank];

	/* Clear MBKEN, MUXEN, MTYP, MWID, FACCEN, BURSTEN, WAITPOL, WRAPMOD, WAITCFG, WREN,
	 	 	 WAITEN, EXTMOD, ASYNCWAIT, CPSIZE, CBURSTRW and CCLKEN bits */
	tmpr &= ((uint32_t)~(FMC_BCR1_MBKEN     | FMC_BCR1_MUXEN    | FMC_BCR1_MTYP     | \
	                     FMC_BCR1_MWID      | FMC_BCR1_FACCEN   | FMC_BCR1_BURSTEN  | \
						 FMC_BCR1_WAITPOL   | FMC_BCR1_WRAPMOD  | FMC_BCR1_WAITCFG  | \
						 FMC_BCR1_WREN      | FMC_BCR1_WAITEN   | FMC_BCR1_EXTMOD   | \
						 FMC_BCR1_ASYNCWAIT | FMC_BCR1_CPSIZE   | FMC_BCR1_CBURSTRW | \
						 FMC_BCR1_CCLKEN));

	/* Set NORSRAM device control parameters */
	  tmpr |= (uint32_t)(Init->DataAddressMux      |\
	                    Init->MemoryType           |\
	                    Init->MemoryDataWidth      |\
	                    Init->BurstAccessMode      |\
	                    Init->WaitSignalPolarity   |\
	                    Init->WrapMode             |\
	                    Init->WaitSignalActive     |\
	                    Init->WriteOperation       |\
	                    Init->WaitSignal           |\
	                    Init->ExtendedMode         |\
	                    Init->AsynchronousWait     |\
	                    Init->PageSize             |\
	                    Init->WriteBurst           |\
	                    Init->ContinuousClock);

	if (Init->MemoryType == FMC_MEMORY_TYPE_NOR) {
		tmpr |= (uint32_t) FMC_NORSRAM_FLASH_ACCESS_ENABLE;
	}

	Device->BTCR[Init->NSBank] = tmpr;

	/* Configure synchronous mode when Continuous clock is enabled for bank2..4 */
	if ((Init->ContinuousClock == FMC_CONTINUOUS_CLOCK_SYNC_ASYNC) && (Init->NSBank != FMC_NORSRAM_BANK1)) {
		Device->BTCR[FMC_NORSRAM_BANK1] |= (uint32_t) (Init->ContinuousClock);
	}

	return 0;
}

ErrorStatus FMC_NORSRAM_DeInit(FMC_NORSRAM_TypeDef *Device, FMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank) {
	/* Disable the FMC_NORSRAM device */
	__FMC_NORSRAM_DISABLE(Device, Bank);

	/* De-initialize the FMC_NORSRAM device */
	/* FMC_NORSRAM_BANK1 */
	if (Bank == FMC_NORSRAM_BANK1) {
		Device->BTCR[Bank] = 0x000030DB;
	}
	/* FMC_NORSRAM_BANK2, FMC_NORSRAM_BANK3 or FMC_NORSRAM_BANK4 */
	else {
		Device->BTCR[Bank] = 0x000030D2;
	}

	Device->BTCR[Bank + 1] = 0x0FFFFFFF;
	ExDevice->BWTR[Bank] = 0x0FFFFFFF;

	return 0;
}

ErrorStatus FMC_NORSRAM_Timing_Init(FMC_NORSRAM_TypeDef *Device, FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank) {
	uint32_t tmpr = 0U;

	/* Get the BTCR register value */
	tmpr = Device->BTCR[Bank + 1U];

	/* Clear ADDSET, ADDHLD, DATAST, BUSTURN, CLKDIV, DATLAT and ACCMOD bits */
	tmpr &= ((uint32_t) ~(FMC_BTR1_ADDSET | FMC_BTR1_ADDHLD | FMC_BTR1_DATAST |
	FMC_BTR1_BUSTURN | FMC_BTR1_CLKDIV | FMC_BTR1_DATLAT |
	FMC_BTR1_ACCMOD));

	/* Set FMC_NORSRAM device timing parameters */
	tmpr |= (uint32_t) (Timing->AddressSetupTime 				|\
					  ((Timing->AddressHoldTime) << 4U) 		|\
					  ((Timing->DataSetupTime) << 8U) 			|\
					  ((Timing->BusTurnAroundDuration) << 16U) 	|\
					 (((Timing->CLKDivision) - 1U) << 20U) 		|\
					 (((Timing->DataLatency) - 2U) << 24U) 		|\
					   (Timing->AccessMode));

	Device->BTCR[Bank + 1U] = tmpr;

	/* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */
	if (FMC_IS_BIT_SET(Device->BTCR[FMC_NORSRAM_BANK1], FMC_BCR1_CCLKEN)) {
		tmpr = (uint32_t) (Device->BTCR[FMC_NORSRAM_BANK1 + 1U] & ~(0x0FU << 20U));
		tmpr |= (uint32_t) (((Timing->CLKDivision) - 1U) << 20U);
		Device->BTCR[FMC_NORSRAM_BANK1 + 1U] = tmpr;
	}

	return 0;
}

ErrorStatus  FMC_NORSRAM_Extended_Timing_Init(FMC_NORSRAM_EXTENDED_TypeDef *Device, FMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode)
{
	uint32_t tmpr = 0U;

	/* Set NORSRAM device timing register for write configuration, if extended mode is used */
	if (ExtendedMode == FMC_EXTENDED_MODE_ENABLE) {
		/* Get the BWTR register value */
		tmpr = Device->BWTR[Bank];

		/* Clear ADDSET, ADDHLD, DATAST, BUSTURN and ACCMOD bits */
		tmpr &= ((uint32_t)~(FMC_BWTR1_ADDSET  | FMC_BWTR1_ADDHLD | FMC_BWTR1_DATAST | FMC_BWTR1_BUSTURN | FMC_BWTR1_ACCMOD));

		tmpr |= (uint32_t)(Timing->AddressSetupTime                 |\
		                 ((Timing->AddressHoldTime) << 4U)          |\
						 ((Timing->DataSetupTime) << 8U)            |\
						 ((Timing->BusTurnAroundDuration) << 16U)   |\
						  (Timing->AccessMode));

		Device->BWTR[Bank] = tmpr;
	} else {
		Device->BWTR[Bank] = 0x0FFFFFFFU;
	}

	return 0;
}
O zápis se mi stará staré dobré makro:

Kód: Vybrať všetko

#define BANKA2((uint32_t)0x64000000)
#define WriteFPGA(uAdr,ucVal)\
		*(__IO uint16_t *) (BANKA2+ (uAdr))=(ucVal)
A teď k problému.

Zatím pouze zapisuji (tzn. fpga na FMC skoro nic nedělá), pouze mi pár pinů vyhazuje jako bridge na jiné, abych mohl kontrolovat tuto periferii, např. zrovna osciloskopem.

A zjistil jsem, že když odešlu například :

Kód: Vybrať všetko

addr: 0x21 a data 0x12
tak se mi příkaz provede 2x. A ještě adresu mám posunutou o 1 doprava. Tzn. 0x21 je potom 0x10.

Ale když odešlu například:

Kód: Vybrať všetko

addr: 0x12 a data 0x21
tak se mi příkaz provede 1x. Ale opět adresu mám posunutou je 1 doprava. Tzn. 0x12 je potom 0x09.

Data už ale sedí v obou případech. Jenom jsou tam občas 2x. :rolleyes:

A teď babo raď, co mám nastaveno špatně v MCU. Nesetkal se s tím někdo?
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa jirka.jirka. » 02 Máj 2019, 14:19

Hotovo...

Někdy to chce vypít kafíčko, kouknout na pěkné baby z okna a řešení vyběhne samo.

Kód: Vybrať všetko

#define BANK2((uint32_t)0x64000000)
#define ADDR_SHIFT(Address) (BANK2+ (2 * (Address)))

#define WriteFMC(Address, Data)  (*(__IO uint16_t *)(Address) = (Data))
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa Tribec Zacks » 02 Máj 2019, 17:43

Gratz jirka, aspon zo zvedavosti co bude bezat na fpga? Teda ak to neni pracovne a mozes prezradit.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa jirka.jirka. » 02 Máj 2019, 19:48

Fpga bude lepit k příchozím datům (odkud a jakých nemůžu říct) datum, čas atp. a tyto data následně posílat po 1Gb lan do PC.

Arm je zde pro povelování, jako nalejvárna programu pro FPGA, a jiné věci, které jsou pro FPGA nepodstatné.
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: FMC sběrnice mezi STM a FPGA

Príspevok od používateľa Tribec Zacks » 02 Máj 2019, 20:47

:rolleyes: keep it up.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok