Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • FMC sběrnice mezi STM a FPGA

FMC sběrnice mezi STM a FPGA

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

Moderátori: psichac, Moderátori

FMC sběrnice mezi STM a FPGA

Odoslaťod jirka.jirka. » 07 Dec 2018, 14: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
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1134
Založený: 17.10.2008
Bydlisko: Zlín
Karma: 12

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod Radus » 08 Dec 2018, 21: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.
Radus
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 977
Vek: 37.22
Založený: 27.10.2009
Bydlisko: Prešov
Karma: 6

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod daqq » 09 Dec 2018, 11: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.
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.
daqq
Obrázok používateľa
Power user
Power user
Príspevky: 2395
Vek: 31.35
Založený: 10.06.2008
Bydlisko: Bratislava
Karma: 4

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod Tribec Zacks » 09 Dec 2018, 15: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.
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Tribec Zacks
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 613
Vek: 36.73
Založený: 26.06.2010
Bydlisko: Levice / Cork IRL
Karma: 21

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod 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?
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1134
Založený: 17.10.2008
Bydlisko: Zlín
Karma: 12

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod 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))
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1134
Založený: 17.10.2008
Bydlisko: Zlín
Karma: 12

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod 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.
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Tribec Zacks
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 613
Vek: 36.73
Založený: 26.06.2010
Bydlisko: Levice / Cork IRL
Karma: 21

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod 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é.
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1134
Založený: 17.10.2008
Bydlisko: Zlín
Karma: 12

Re: FMC sběrnice mezi STM a FPGA

Odoslaťod Tribec Zacks » 02 Máj 2019, 20:47

:rolleyes: keep it up.
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Tribec Zacks
Obrázok používateľa
Pokročilý člen
Pokročilý člen
Príspevky: 613
Vek: 36.73
Založený: 26.06.2010
Bydlisko: Levice / Cork IRL
Karma: 21


Naspäť na Mikropočítače

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.36 sekúnd