Skocz do zawartości
MaciejZyskowski

SPI - wykrywanie startu transmisji danych

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
Share on other sites

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...