Skocz do zawartości

SPI - wykrywanie startu transmisji danych


MaciejZyskowski

Pomocna odpowiedź

Witajcie!

Pracuje obecnie na Nucleo-F746ZG. Chce nawiązać komunikacje przez SPI z FPGA. Moje urządzenie działa jako slave. Obecnie nie jest źle, komunikacja działa poprawnie w obydwie strony.

Problem jest w zasadzie prosty, FPGA wysyła mi 32 liczby 16bitowe, a ja mam je odebrać w odpowiedniej kolejności. Co wiec robie? Ustalam, że ciąg liczb powinien się zaczynać od wartości 0x01. Niestety moje próby zakończyły się niepowodzeniem. Mikrokontroler "łapie" dane w losowym momencie, stąd w moim buforze dane zaczynać się mogą od dowolnej liczby ze zbioru wszystkich 32 liczb. Można to potraktować jako przesuniecie w fazie, lecz najgorsze jest to że po "złapaniu" jest ono stale. Wiec moje ify na niewiele się zdadzą, bo jak 0x01 jest na 7 miejscu w buforze to tak już pozostanie.

Mam nadzieje, że wyraziłem się względnie jasno. Zamieszczam część kodu obsługująca SPI. Używam HAL i w projekcie pomaga mi CubeMX.

Będę wdzięczny za sugestie!

 

#define WORD_LENGTH					32				/* word length */

uint16_t rx_spi5[WORD_LENGTH];						/* Buffer for received data from SPI5 */
uint16_t tx_spi5[WORD_LENGTH];						/* Buffer for sending data from SPI5 */

uint16_t trig = 0x0001;								/* Trigger value */

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi->Instance == hspi5.Instance)
	{
		//HAL_SPI_Receive_IT(&hspi5, &rx_spi5, 1);

		HAL_SPI_TransmitReceive_IT(&hspi5, tx_spi5, rx_spi5, WORD_LENGTH);
	}
}

while(1)
{
  	  if (rx_spi5[0] == trig)
	  {
		  for (int i = 0; i <WORD_LENGTH; ++i)
		  {
			  size = sprintf(data, " %x ; ", rx_spi5[i]);

			  HAL_UART_Transmit(&huart3, data, size, HAL_MAX_DELAY);

			  memset(data, 0, 75);
		  }
		  size = sprintf(data, "\r\n");

		  HAL_UART_Transmit(&huart3, data, size, HAL_MAX_DELAY);

		  memset(data, 0, 75);
	  }

}

 

Edytowano przez MaciejZyskowski
Link do komentarza
Share on other sites

Cześć,

jeśli dobrze zrozumiałem jest to kod odbierający dane od układu FPGA (na mikrokontrolerze Nucleo-F746ZG). Czy mógłbyś zamieścić kod wysyłający dane z układu FPGA?

Nie wiem jak masz to zorganizowane po stronie FPGA, czy jest to twój własny kod w języku HDL (VHDL lub Verilog), czy jakiś IP-Core, lub kod na soft/hard/CPU?

Kod, który przedstawiłeś ma warunek:

 if (rx_spi5[0] == trig)

Obawiam, się że ten warunek będzie spełniony bardzo rzadko (lub nigdy) i wtedy cała zawartość pętli while się nie wykona.

Powinieneś użyć jakiegoś bufora FIFO do wysyłania i odbioru danych.

Pozdrawiam

  • Lubię! 2
Link do komentarza
Share on other sites

Dnia 26.04.2019 o 16:26, deshipu napisał:

Generalnie to chyba rozpoczęcie transmisji się sygnalizuje stanem niskim na nóżce chip select — wtedy nie musisz szukać żadnych magicznych wartości.

Jakim cudem wyleciało mi to z głowy? Ah, dziękuję! 😄

Dnia 26.04.2019 o 14:48, FlyingDutch napisał:

Cześć,

jeśli dobrze zrozumiałem jest to kod odbierający dane od układu FPGA (na mikrokontrolerze Nucleo-F746ZG). Czy mógłbyś zamieścić kod wysyłający dane z układu FPGA?

Nie wiem jak masz to zorganizowane po stronie FPGA, czy jest to twój własny kod w języku HDL (VHDL lub Verilog), czy jakiś IP-Core, lub kod na soft/hard/CPU?

Kod, który przedstawiłeś ma warunek:


 if (rx_spi5[0] == trig)

Obawiam, się że ten warunek będzie spełniony bardzo rzadko (lub nigdy) i wtedy cała zawartość pętli while się nie wykona.

Powinieneś użyć jakiegoś bufora FIFO do wysyłania i odbioru danych.

Pozdrawiam

Niestety i tak nie miałbym jak podesłać teraz kodu. I tak, masz racje, ten warunek właściwie nigdy się nie spełnia.
Dzięki za odpowiedzi!

Link do komentarza
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.