Skocz do zawartości

SPI - wykrywanie startu transmisji danych


Pomocna odpowiedź

Napisano (edytowany)

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...