MaciejZyskowski Napisano Kwiecień 26, 2019 Udostępnij Napisano Kwiecień 26, 2019 (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 Kwiecień 26, 2019 przez MaciejZyskowski Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Kwiecień 26, 2019 Udostępnij Kwiecień 26, 2019 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 2 Cytuj Link do komentarza Share on other sites More sharing options...
Popularny post deshipu Kwiecień 26, 2019 Popularny post Udostępnij Kwiecień 26, 2019 Generalnie to chyba rozpoczęcie transmisji się sygnalizuje stanem niskim na nóżce chip select — wtedy nie musisz szukać żadnych magicznych wartości. 2 1 Cytuj Link do komentarza Share on other sites More sharing options...
MaciejZyskowski Kwiecień 28, 2019 Autor tematu Udostępnij Kwiecień 28, 2019 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! Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
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!