Skocz do zawartości

Sipeed Tang Nano 4k - jak zaprogramować Cortex-m3?


Pomocna odpowiedź

1 godzinę temu, Elvis napisał:

Faktycznie, jest tam więcej przykładów. Chociaż z tego co widzę to są one przeznaczone dla innych płytek:

Ale warto chociaż spróbować, może faktycznie GW1NSR4C ma pamięć zintegrowaną.

Inna sprawa, to nie wiem, czy model użyty w płytkach Sipeed nie ma prędzej HyperRAM niż PSRAM. W dokumentacji jest taki fragment:

2022-05-07-090735_2560x1354_scrot.thumb.png.f703230d9508a177bc8232952cacfa52.png

Wygląda jakby typ pamięci zależał od obudowy. Więc największa szansa, że w modułach Sipeed znajdzie się pamięć HyperRam.

Ale moim zdaniem jedyny sposób na sensowną zabawę GW1NSR4C to kupienie jednej z płytek ewaluacyjnych. Ten wynalazek Sipeed jest delikatnie mówąc nieużywalny. Na DK-START-GW1NSR4C są przełączniki i można bez problemu podłączyć J-Link, Sipeed zaoszczędził i wyszedł im przycisk do papieru.

Ja właśnie przymierzam się do zakupu płytki : "DK_GOAI_GW1NSR-LV4CQN48PC7I6" z Rutronika (Polska) - oni są oficjalnym dystrybutorem Gowin w Polsce.

Jestem podobnego zdania co Ty. Dziękują za pomoc 🙂

Pozdrawiam

 

  • Lubię! 1
Link to post
Share on other sites
(edytowany)

Cześć,

dzisiaj uruchomiłem program (Cortex-M3) testujący pamieć PSRAM na płytce "Tang Nano 4K". Przykład z "MPU SDK" o którym mówiłem wcześniej. Tutaj wynik testu (info z UART0 MCU) - patrz zrzut ekranu:

PSRAM_test_.thumb.png.8824f2dd27600d3cff947a019c87d5f2.png

Jak widać sam system i UART0 zostały zainicjalizowane poprawnie, natomiast informacji o poprawnej inicjalizacji pamieci PSRAM brak. Tutaj kod "main.c" z tego programu:

/*
 * *****************************************************************************************
 *
 * 		Copyright (C) 2014-2021 Gowin Semiconductor Technology Co.,Ltd.
 * 		
 * @file      main.c
 * @author    Embedded Development Team
 * @version   V1.x.x
 * @date      2021-01-01 09:00:00
 * @brief     Main function.
 ******************************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include "psram.h"

/* Includes ------------------------------------------------------------------*/
void UartInit(void);

/* Macros ------------------------------------------------------------------*/
#define TEST_NUM 0x2000

/* Variables ------------------------------------------------------------------*/
uint32_t rec_temp[4];
uint32_t temp[4] = { 0x00};

/* Functions ------------------------------------------------------------------*/
int main()
{
	SystemInit();	//Initializes system
	UartInit();		//Initializes UART0
	
	printf("\r\n---------------------------------------------------------------------\r\n");
	printf("         GowinSemiconductor Gowin_EMPU(GW1NS-4C) PSRAM Application       \r\n");
	printf("---------------------------------------------------------------------\r\n\r\n");
	
	printf("System Initialized Successfully!\r\n");
	printf("UART0 Initialized Successfully!\r\n");
	
	//Check and wait PSRAM initialization finished
	while(PSRAM_Check_Init_Status()!=1);
	
	printf("PSRAM Initialized Successfully!\r\n");
	
	//Write data into PSRAM
	printf("\r\nWrite Data Into PSRAM : \r\n");
	for(uint32_t i = 0; i < TEST_NUM; i = i+8)
	{
		for(uint16_t j = 0; j < 4; j++)
		{
			temp[j] = i;
			
			printf("The Address 0x%x : Write Data %x.\r\n",i,temp[j]);
		}
		
		PSRAM_Write_Data_Buff(temp,i);
	}
	
	//Read Data From PSRAM
	printf("\r\nRead Data From PSRAM : \r\n");
	for(uint32_t i = 0; i < TEST_NUM; i = i+8)
	{
		PSRAM_Read_Data_Buff(rec_temp,i);
		
		for(uint16_t j = 0; j < 4; j++)
		{
			printf("The Address 0x%x : Read Data %x.\r\n",i,rec_temp[j]);
		}
	}
	
	printf("\r\nGowin_EMPU(GW1NS-4C) PSRAM Application Finished!\r\n");

	while(1);
}

//Initializes UART0
void UartInit(void)
{
  UART_InitTypeDef UART_InitStruct;
	
  UART_InitStruct.UART_Mode.UARTMode_Tx = ENABLE;
  UART_InitStruct.UART_Mode.UARTMode_Rx = ENABLE;
  UART_InitStruct.UART_Int.UARTInt_Tx = DISABLE;
  UART_InitStruct.UART_Int.UARTInt_Rx = DISABLE;
  UART_InitStruct.UART_Ovr.UARTOvr_Tx = DISABLE;
  UART_InitStruct.UART_Ovr.UARTOvr_Rx = DISABLE;
  UART_InitStruct.UART_Hstm = DISABLE;
  UART_InitStruct.UART_BaudRate = 115200;//Baud Rate
	
  UART_Init(UART0,&UART_InitStruct);
}

Jak wynika z kodu programu, gdyby inicjalizacja PSRAM się udała w UART'cie powinna być wyswietlona informacja: "PSRAM Initialized Successfully!" jednak jej brak, czyli pamięć nie działa. Dołączam pliki projektów MCU (FPGA) i testu pamieci PSRAM GDM spakowane zipem.

Tang4K_CortexM3_01.zip

cm3_psram.zip

Jako następny planuję uruchomić test HyperRAM.

Update:

Zrobiłem też test pamięci HyperRAM i on również zakończył się porażką. Nie wiem albo adres tej pamięci w define:

//Address definitions
#define HPRAM_BASE        AHB2PERIPH_BASE	/* !< HyperRAM Base Address     		

i dalej w pliku nagłówkowym: gw1nsC4.h jest błędny:

/** @addtogroup Peripheral_memory_map
  * @{
  */

/* Peripheral and SRAM base address */
#define FLASH_BASE        ((uint32_t)0x00000000)   /*!< (FLASH     ) Base Address */
#define SRAM_BASE         ((uint32_t)0x20000000)   /*!< (SRAM      ) Base Address */
#define PERIPH_BASE       ((uint32_t)0x40000000)   /*!< (Peripheral) Base Address */

#define APB1PERIPH_BASE   PERIPH_BASE              /* !< APB1_Peripheral Base Address */
#define APB2PERIPH_BASE   (PERIPH_BASE + 0x02000)  /* !< APB2_Peripheral Base Address */
#define AHB1PERIPH_BASE   (PERIPH_BASE + 0x10000)  /* !< AHB1 Peripheral Base Address */
#define AHB2PERIPH_BASE   ((uint32_t)0xA0000000)   /* !< AHB2 Peripheral Base Address */

/* APB1 Peripheral base address */
#define TIMER0_BASE       (APB1PERIPH_BASE + 0x0000)    /* !< TIMER0 Base Address     */
#define TIMER1_BASE       (APB1PERIPH_BASE + 0x1000)    /* !< TIMER1 Base Address     */
#define UART0_BASE        (APB1PERIPH_BASE + 0x4000)    /* !< UART0  Base Address     */
#define UART1_BASE        (APB1PERIPH_BASE + 0x5000)    /* !< UART1  Base Address     */
#define RTC_BASE          (APB1PERIPH_BASE + 0x6000)    /* !< RTC Base Address        */
#define WDOG_BASE         (APB1PERIPH_BASE + 0x8000)    /* !< WATCHDOG  Base Address  */

/* APB2 Peripheral base address */
#define I2C_BASE          (APB2PERIPH_BASE + 0x0000)    /* !< I2C Base Address         */
#define SPI_BASE          (APB2PERIPH_BASE + 0x0200)    /* !< SPI Base Address         */

/* AHB Peripheral base address */
#define GPIO0_BASE        (AHB1PERIPH_BASE + 0x0000)    /* !< GPIO0 Base Address     */
#define SYSCTRL_BASE      (AHB1PERIPH_BASE + 0xF000)    /* !< SYSCON Base Address    */

, albo magistrala "AHB2 Peripheral" jest nieprawidłowo zainicjowana, albo jak stwierdził @Elvis tych pamięci (PSRAM lub HyperRam) w ogóle nie ma na tej płytce.

Pozdrawiam

Edytowano przez FlyingDutch
Link to post
Share on other sites

Cześć,

temat nie dawał mi spokoju i postanowiłem nadal go "drążyć" - znalazłem blog, którego autor twierdzi, że udało mu się użyć pamięci HyperRAM z płytki "Sipeed Tang Nano 4K". Tutaj link do tego bloga:

https://justanotherelectronicsblog.com/?p=986

Różnica pomiędzy podejściem autora blog'a i moją próbą polegała głównie na tym, że ja użyłem hard-cpu ARM Cortex-M3, a autor bloga użył soft-cpu NEORV32 (odmiana RISC-V). Ja nie dodawałem, żadnego kodu w języku HDL zawierającego kontroler pamięci HyperRAM, a autor bloga tak. Tutaj link do repozytorium Github z tym projektem:

https://github.com/riktw/tang4Kramblings

A tutaj link bezpośrednio do implementacji kontrolera HyperRAM:

https://github.com/riktw/tang4Kramblings/blob/main/NEORV32_HyperRAM/src/wb_hyper.v

Podaję też link do projektu soft-cpu NEORV32:

https://github.com/stnolting/neorv32

A tutaj link do programu w języku C dla tego soft-cpu:

https://github.com/riktw/tang4Kramblings/blob/main/NEORV32_Software/example/HyperRAM/main.c

Z kodu tego programu wynika, że tej pamięci jest dostępne 8 MB.

Dzisiaj już nie mam czasu, ale postaram się uruchomić ten projekt na zestawie FPGA "Tang Nano 4k" w najbliższych dniach.

Pozdrawiam

  • Pomogłeś! 1
Link to post
Share on other sites
(edytowany)

Cześć,

przeczytałem część dokumentacji Gowin'a dot. HypeRAM w FPGA z płytki "Tang nano 4K". Trzeba dodać dodatkowego IP Core (Gowin) z kontrolerem tej pamięci i połączyć go jedną z dostępnych magistral z hard-cpu Cortex-M3 (ja myślałem, że to jest zrobione sprzętowo w Cortex-M3). Wygląda na to, że Chińczycy "dokleili" tą pamięć jako osobny "die" (osobny IC) w jednej obudowie z FPGA (ta HyperRAM jest produkcji firmy Cypress), dlatego ma zewnętrzną magistralę 😅 (gdyby nie było to tragiczne to byłoby nawet śmieszne).  Podobno można właśnie w skrypcie linkera ustawić ta pamięć jako główny RAM dla tego CPU (czyli 8MB).

Update:

Znalazłem na stronie Gowin dokumentację i referencyjny projekt dla: "Gowin HyperRAM Memory Interface embedded" - patrz link:

https://www.gowinsemi.com/en/support/ip_detail/57/

Pobrałem archiwum z "Gowin_HyperRAM_Memory_Interface_embedded_refDesign" i rozpakowałem, a następnie otworzyłem ten projekt w "Gowin EDA". w pliku "user constraint" są wyprowadzone tylko 3 piny:

IO_LOC "clk" 22;

IO_LOC "rst_n" 23;

IO_LOC "init_calib" 33;  //led1

zegar, reset(low) i init_calib na jedyną diodę LED w zestawie (sygnał ten jest ustawiany w stan wysoki, gdy zakończy się faza kalibracji HyperRAM). Chciałem dodać i wyprowadzić sygnał error, który jest ustawiany na High, gdy podczas testów zapisu i odczytu danych wystapi błąd odczytywanej wartości i nie mogę. Dlaczego: otóż w tym projekcie było uzywane do syntezy i implementacji "SymplifyPRO" zamiast "Gowin Synthessis". Jest w projekcie (jaki8ś podmoduł) używana zaszyfrowana "netlist" - patrz kod błędów:

Processing netlist completed
Parsing netlist file "D:\_FPGA_Proj\GOWIN\HyperRAM\project\impl\gao\gao.v" completed
ERROR  (PA2091) : Cannot find object named 'u_test/error_d4'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[14]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[13]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[12]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[11]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[10]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[9]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[8]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[7]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[6]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[5]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[4]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[3]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[2]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[1]'
ERROR  (PA2091) : Cannot find object named 'u_test/check_d_4[0]'
ERROR  (PA2091) : Cannot find object named 'init_calib_c'
NOTE  (PA0005) : Processing netlist completed with errors

i faza implementacji się wywala. Powodem jest używanie do syntezy tego projektu "SimplifyPRO", które było dostarczane z bardzo starą wersją "GowinEDA" (osobna licencja była wymagana). Od dawna ten soft nie jest dostarczany z "GowinEDA". Jest co prawda wygenerowany plik konfiguracyjny FPGA (razem z projektem), ale tam najwyżej zobaczę, że kalibracja HyperRAM zakończyła się poprawnie. nie jestem w stanie zmodyfikować projektu tak, aby dodać obsługę sygnału "error".

Jak usunąłem z projektu plik konfiguracyjny .gao i katalog z szyfrowanym IP Corem w formacie "SymplifyPro", (ten szyfrowany IP Core to był rodzaj wewnętrznego analizatora logicznego, który można było usunąć). Teraz mogę zsyntetyzować ten projekt (faza syntezy i implementacji kończą się bez błędów). Mogłem teraz wyprowadzić na LED na płytce "Tang Nano 4K" sygnał error. Zajrzałem do kodu źródłówego testu i jeśliby byłyby odczytywane niepoprawne dane (po wcześniejszym zapisie do pamięci HyperRAM pod kolejnym adresem) to sygnał error przyjmuje wartość High. Ta dioda się nie zapala więc chyba nie ma błędów. Przełączyłem też na nią sygnał "init_calib" wtedy dioda się świeci (tak jak powinna po udanej kalibracji pamięci) więc chyba ta pamięć HyperRAM jednak działa.

To co zostało "fu..d up" przez firmę Gowin to fakt, że kontroler tej pamięci nie został hardware'wo wkomponowany do hard-cpu ARM Cortex-M3. Podobno można jednak przy odrobinie zachodu spowodować, że będzie ona widoczna jako główna RAM w hard-cpu. Ponieważ taktowanie HyperRAM wynosi max. 160 Mhz i obsługiwany jest burst-mode do długości aż do 128 bajtów, to może wydajność tej pamięci będzie wystarczająca do uzywania jej z hard-cpu do sensownych projektów. To co planuję jako następny krok to podłączenie HyperRAM do ARM Cortex-M3 i przetestowanie wydajności tej pamięci.

Hej @Elvis chyba jednak ta pamięć jest "zintegrowana" z układem FPGA z płytki "Tang Nano 4K". Do postu jest załączony poprawiony projekt dla "GowinEDA" z IPCorem obsługującym HyperRAM (opcje projektu przestawiłem na "Gowin Synthesis").

HyperRAM.zip

Pozdrawiam

Edytowano przez FlyingDutch
update
  • Pomogłeś! 1
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.