Skocz do zawartości

Zmiana STM32F4 na H7 - problem z SPI


Xandersky

Pomocna odpowiedź

Witajcie,

Po calym dniu prób i błędów poddaje sie i zmuszony jestem poprosić Was o pomoc. 

Dotychczas posiadałem Nucleo f446re .. połaczylem z kilkoma czujnikami, wyświetlaczem tft ,irdą, eepromem, rs232 etc etc .. wszystko działało pięknie. 

Pomyślałem sobie przesiąde sie na wydajniejszy egzemplarz.. 

Zakupiłem Nucleo h723zg no i zaczałem od podstawowej rzeczy czyli przeniesienia biblioteki wyświetlacza - 

Problem zaczął się juz w momencie gdy zauważyłem że zniknął z SPI_TypeDef rejest DR.. 

__HAL_SPI_ENABLE(&hspi1);
    SPI1->CR2 |= (1) << 12;

    while((SPI1->SR & (1 << 1)) == 0)
        ;

    *((__IO uint8_t *)(&SPI1->DR)) = value;

    while(SPI1->SR & (1 << 7)) ; 

    while((SPI1->SR & (1 << 0)) == 0) ; 

    return *((__IO uint8_t *)(&SPI1->DR));
}

 

W h7 pojawił sie za to TXDR.. podmiana DR na TXDR nic mi nie pomogła.  Wisi w poniższej pętli:

while((SPI1->SR & (1 << 0)) == 0) ; 

Zamiast rejestrów przerobiłem funkcje żeby wysyłała dane poprzez Hala. 

HAL_SPI_TransmitReceive

Hal_SPI_Transmit

Obie bez rezultatu.

 

uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
    uint8_t Rxdata;
    HAL_SPI_TransmitReceive(&hspi6,&TxData,&Rxdata,1, 1000);
 	return Rxdata;
}

Wróciłem do poczatku i odpaliłem f446.. 

Przerobiłem kod jeszcze raz tak aby korzystał z Hala do przesyłu danych po SPI.. wgrałem i działa.. wolno strasznie ale działa... 

Wróciłem na h723 ten sam kod, te same ustawienia.. wyświetlacz tylko migocze na biało.. komunikacja jest poprawna - wydaje mi się ze błąd jest gdzie indziej ale już głowę mam spuchniętą.. Gdzieś cos przegapiam .. pomożecie?

 

W zasadzie wszystko po stronie samego programu działa... Na F446 jest wszystko poprawnie zarówno w pierwszej opcji jak również gdy wysyłam dane poprzez HAL_TransmitReceive.. Problem leży gdzieś pewnie w ustawieniu zegarów...

Edytowano przez Xandersky
Link do komentarza
Share on other sites

 

#define LOOP_VARS()
#define LOOP_WAIT(v,n,d) while(v)
  
int8_t spiWrite(const struct spiDevInfo *pParams, uint8_t *out, uint16_t len)
{
	LOOP_VARS();
	ATOMIC_BLOCK(ATOMIC_RESTORESTATE) 
	{
		SPI_TypeDef *pSPI = getSpiBus(pParams->bus);
		
		if (!(pSPI->CR1 & SPI_CR1_SPE))
		{
			return KSPI_ERROR;
		}

		spiSetParams(pParams, len);
		
		pSPI->IFCR = SPI_IFCR_SUSPC | SPI_IFCR_TXTFC;
		pSPI->CR1 |= SPI_CR1_CSTART;
		for (int i = 0; i < len; ++i)
		{
			LOOP_WAIT(
				!(pSPI->SR & SPI_SR_TXP) ,
				"spiWrite", SPI_STATE("spiWrite(TxP)"));
			*((volatile uint8_t *)(&pSPI->TXDR)) = out[i];
			LOOP_WAIT(
				!(pSPI->SR & SPI_SR_RXP) ,
				"spiWrite", SPI_STATE("spiWrite(RxP-W)"));
			(volatile void)*((volatile uint8_t *)(&pSPI->RXDR));
		}
		
		while( !(pSPI->SR & SPI_SR_EOT) );
	}
	return KSPI_OK;
}

Taka procedura wysyłki z pewnością działa na H750, testowane. 😉

Edytowano przez kaworu
RXDR nie TXDR w odczycie,
Link do komentarza
Share on other sites

Miałem podobny problem gdy przesiadłem się z stm32f103 na stm32f401.Co prawda nie dotyczył spi ale może ta myśl coś pomoże.W moim przypadku wystarczyło doinstalować pakiety oprogramowania,które znajdują się w software packs w pliku konfiguracyjnym ioc w stm32cubeide.Być może czegoś brakuje i stąd ten problem.

Link do komentarza
Share on other sites

Z drugiej strony relacje spi kontrolera i urządzenia końcowego  potrzebują trzech lub czterech pinów.Załóżmy,że trzeba czterech pinów.Musisz zatem skonfigurować w spi  hardware spi signal tak samo(input albo ouput) jak w stm32f4 ale w bibliotece zapewne na sztywno jest przypisany pin w związku z tym albo zmienisz w bibliotece  zapis dotyczący pinu hardware spi signal albo zrezygnujesz z zakładki  hardwere  spi signal i przypiszesz pin taki jak w stmf4 i przypiszesz odpowiedni poziom na wyjściu.Chodzi o to by kontroler wykrył  lub urządzenie  wykryło,że moduły są podłączone.Weźmy zatem ten Twój moduł h723 i przypiszmy spi1 .Pytanie czy PA15 w h723 to ten sam pin PA15 w stm32f4

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

Cube IDE pobuera paczke softu w przypadku nowej płytki takze to raczej nie braki tego typu.

Jakby poswieciłem cały dlugi długi weekend na walke z h7.. to nie jest Szymon problem połączeniowy. Próbowałem wszystkie 6 spi które są dostępne. Na różnych pinach w różnych konfiguracjach. Ze sterowaniem NSS i bez sterowania z przypisanym na sztywno pinem CS i obslugą w bibliotece. 

Napisałem na szybko funkcje korzystającą z softwerowego SPI czyli piny CLK i MOSI deklarowałem sam na sztywno w funkcjach i połaczylem sie w 8bitach z wyswietlaczem bez problemu na h7.. Natomiast nijak to optymalne, nijak rozwojowe i nijak prawidłowe. 

Nie wiem gdzie popełniam błąd z tym h7... Spróbuje jeszcze dostosować funkcje którą podał kolega wyżej 😞

H7 ponoć jest dosć problemowe.. i cos czuje ze to dopiero początek problemów.... 

Link do komentarza
Share on other sites

Jeśli użyłeś st7735.h to w tej bibliotece masz definicje spi

#define ST7735_SPI_PORT hspi1
extern SPI_HandleTypeDef ST7735_SPI_PORT;

#define ST7735_RES_Pin       GPIO_PIN_7
#define ST7735_RES_GPIO_Port GPIOC
#define ST7735_CS_Pin        GPIO_PIN_6
#define ST7735_CS_GPIO_Port  GPIOB
#define ST7735_DC_Pin        GPIO_PIN_9
#define ST7735_DC_GPIO_Port  GPIOA

A jak jest w h723?Jeżeli nie chcesz nic zmieniać w bibliotece to musisz użyć tych portów z h723.Czyli w pliku konfiguracyjnym musisz użyć tych portów.Dobrze jest to wytłumaczone krok po kroku na stronie

https://controllerstech.com/st7735-1-8-tft-display-with-stm32/

Jeśli użyłeś innej biblioteki to działanie będzie analogiczne.

spi723.thumb.png.f3328d81a2e01664fe9bef4699a6415d.png

 

spi-2.thumb.png.2f8c7367b4cf1fdc548b21b571188c4a.png

spi-3.thumb.png.36aef0ede138cc35926d9ce59a5737cd.png

Czy tak masz skonfigurowany h723.

Nie wierzę by STM wypuścił na rynek coś co nie działa chociaż parę razy zwątpiłem ale zawsze okazywało się,że błąd był po mojej stronie.Nikt nie mówi,że stmcube jest bezbłędnym oprogramowaniem.Ma swoje wady.Warto jednak zajrzeć(można powiedzieć bezwzględnie przejrzeć pliki)  do plików gpio,spi i zobaczyć czy prawidłowo są przypisane porty.Jeśli nie są trzeba  to ręcznie zmienić w tych plikach.

Link do komentarza
Share on other sites

1 godzinę temu, szymonw napisał:

Nie wierzę by STM wypuścił na rynek coś co nie działa

Mało widziałeś. *Szczególnie* jeśli używasz DMA, CubeMX uwielbia generować złą sekwencję inicjalizacji w wypadku niektórych urządzeń przez co no, nie działa. Żeby było zabawniej błąd znany od paru lat i prosty do poprawienia, a patrząc po internetach, to 5 miesięcy temu dalej tam był (i pewnie dalej jest znając ST). Albo jak kod HAL używa alokacji pamięci w przerwaniach w co najmniej kodzie drivera USB.

Link do komentarza
Share on other sites

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

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.