Skocz do zawartości

Kurs STM32L4 – #10 – ekspander portów (SPI), quiz


Pomocna odpowiedź

Kurs STM32L4 – #10 – ekspander portów (SPI), quiz

SPI to szeregowy interfejs komunikacyjny, dzięki któremu do mikrokontrolerów podłącza się wiele przydatnych modułów (np. wyświetlacze TFT). W tej części kursu STM32L4 omówimy podstawy komunikacji przez SPI na przykładzie ekspandera portów. Stworzymy też swoją pierwszą bibliotekę.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

Przypominamy: w komentarzach do kursów rozmawiamy wyłącznie na tematy związane z konkretnym kursem. Mile widziane są również informacje od osób, które korzystały wcześniej z naszych poradników. Wszystko po to, aby kursanci, którzy mają zamiar korzystać z tego kursu nie musieli "przedzierać" się przez dziesiątki postów na inne tematy. Tematy na pytanie, które nie są związane z kursem można zadawać na naszym forum o mikrokontrolerach.

Link do komentarza
Share on other sites

Zachęcam do lektury najnowszej części kursu - tym razem o SPI. Jest to rozgrzewka przed kolejną częścią, w której wykorzystamy tę wiedze do obsługi wyświetlacza graficznego (a to wcale nie jest taki prosty temat). Mamy nadzieję, że ekspander wprowadzi wszystkich łagodnie w ten temat, dzięki czemu w kolejnej części pojawi się trochę trudniejszych tematów (ale spokojnie, każdy na pewno sobie poradzi) 😉

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

@Toomas od strony SPI nie będzie to dużo trudniejsze, ale jeśli nigdy nie próbowałeś komunikować się z wyświetlaczem graficznym to możesz zdziwić się ile trzeba zrobić - szczególnie, że nie ograniczaliśmy się do gotowca. W kolejnej części kursu znajdziesz opis wyświetlacza wraz z kolejnymi krokami, które trzeba przejść, aby stworzyć własną bibliotekę niskopoziomową (do samej komunikacji ze sterownikiem). Później znajdziesz tam kilka etapów optymalizacji kodu, aby uzyskać większą wydajność, a na koniec połączymy całość z biblioteką graficzną, która pozwala na rysowanie figur geometrycznych, wyświetlanie tekstów itd. Jest tego sporo - kolejna część to na 99% najobszerniejsza część jaka pojawi się w ramach tego kursu 🙂

Link do komentarza
Share on other sites

Mam pytanie co do jednego pytania w quizie. Pytanie o przerwania, więc zawahałem się czy nie napisać tego pod tamtym odcinkiem kursu, ale w końcu quiz jest tu, więc chyba też pasuje. Nie wiem czy mogę wprost rzucić pytaniem i odpowiedzią, czy nie będzie to spojler dla tych co nie rozwiązywali 😄 [...]

Edytowano przez Treker
Usunięcie spoilera.
  • Lubię! 1
Link do komentarza
Share on other sites

@Bhoy67 oczywiście masz rację - ukryłem to co napisałeś, aby nie psuć innym zabawy. Faktycznie były tam podane błędne numery pinów (nawet sam podałeś poprawne w swojej wiadomości). Już naniosłem poprawkę do pytania, usunąłem też Twój wynik, więc możesz przez przez quiz raz jeszcze 🙂

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

Doszedłem do 10 części i zaczynam doceniać jakie możliwości dają nam procesory STM32. Faktycznie peryferia rozbudowane praktycznie pod każde rozwiązanie.

Zrobiłem też quiz ale zabrakło mi czasu na dwa ostatnie pytania. Nie wiem jak inni użytkownicy ale przy normalnym czytaniu ze zrozumieniem bez potwornego pędu przydało by się jeszcze dodatkowe 30 sek.

Link do komentarza
Share on other sites

@padus możliwości jest naprawdę sporo, a kurs nie pokazuje ich wszystkich. Dokumentacja licząca kilka tysięcy stron na pewno pokrywa wszystkie pozostałe niuanse 😉 

2 godziny temu, padus napisał:

przy normalnym czytaniu ze zrozumieniem bez potwornego pędu przydało by się jeszcze dodatkowe 30 sek.

Dziękujemy za informacje, weźmiemy to pod uwagę.

Link do komentarza
Share on other sites

Kolejna czesc kursu za mna i mam mala uwage, nie wiem czy kazdy fabrycznie nowy uklad MCP jest tak ustawiony ale moj mial wszystkie bity w rejestrze IPOL "wlaczone" przez co logika dla przykladu z przyciskiem byla u mnie odwrotna.

SPI.thumb.png.e9205e45bd91dfad1037054e6fc2b604.png

Link do komentarza
Share on other sites

@Frantick sprawdziłem to o czym piszesz i nie wiem dlaczego masz tam jedynki, u mnie działa 🙂 W dokumentacji jest wyraźnie napisane co powinno być ustawione po włączeniu zasilania POR i resecie RST:

image.thumb.png.26f8b6a87feb20c5ba6387e408fd347d.png

Cały rejestr powinien być wyzerowany i nie ma tu żadnej fabryczności, bo te układy nie mają pamięci trwałej. Nikt do tej pory nie zgłaszał takich uwag więc może jest to błąd w układzie, lub błąd przy komunikacji albo zasilaniu. Ciężko coś doradzić.

Link do komentarza
Share on other sites

Cześć 🖐️, kolejna część kursu jak zwykle super 🚀. Wszystko przedstawione bardzo jasno i w ciekawy sposób 🙂.

Podczas robienia zadań z pracy domowej napotkałem pewien problem. Zaimplementowałem funkcje do odczytu oraz zapisu dla GPIO oraz dodatkową funkcję pomocniczą. Niestety program nie działa jak należy. Kilkukrotnie podglądałem w debuggerze wartości zmiennych pobranych z rejestrów i poddanych np. przesunięciu bitowemu i wyniki były odmienne od oczekiwanych. Poniżej zamieszam kod: 

// Sprawdzam wartość bitu na danej pozycji
uint8_t check_bit(uint8_t bit_array, uint8_t position){


	if( ((bit_array >> position) & 0x01) == 0x01){

		return 1;
	}
	else{
		return 0;
	}

}


uint8_t MCP_GPIO_ReadPin(uint8_t output_num){

  	// Pobieram konfigurację I/O do sprawdzenia
	uint8_t config = mcp_reg_read(MCP_IODIR);

	if (check_bit(config, output_num) == 0){

		uint8_t reg_val = mcp_reg_read(MCP_GPIO);
		return check_bit(reg_val, output_num);
	}
	else{

		return -1;
	}
}


void MCP_GPIO_WritePin(uint8_t output_num, uint8_t state){

  	// Pobieram dotychczasową wartość rejestru, aby zmodyfikować tylko jeden bit
	uint8_t bit_state = mcp_reg_read(MCP_GPIO);
	
	uint8_t current_output_val = check_bit(bit_state, output_num);


	if (state == 0){
      // Jeżeli chcę ustawić tą samą wartość to nic się nie zmienia
      // Jeżeli chcę zmienić wartość to wykonuję toggle bit na danym bicie
		if(current_output_val == 0){
			
		}
		else{
			bit_state ^= 1 << output_num;
		}

	}
	else if (state == 1){
		if(current_output_val == 1 ){
			
		}
		else{
			bit_state ^= 1 << output_num;
		}

	}

	mcp_reg_write(MCP_OLAT,bit_state);

}

Próbowałem różnych modyfikacji, lecz nie mogłem natrafić na błąd. Mam przeczucie, że może to być kwestia niewłaściwego typu zmiennej, niewłaściwego użycia operatora ">>" lub operacji toggle bit(czy jest to w ogóle właściwy sposób na zmianę bitu, czy może jest inna droga 🤔?)

Czy moje podejście do tego zadania jest poprawne? Będę wdzięczny za wszelką pomoc/uwagi 👌

Link do komentarza
Share on other sites

@Leroy Ciężko jest pomóc jeśli nie napiszesz, co nie działa jak powinno. Opis "Niestety program nie działa jak należy" jest nieco zbyt ogólny.

Ale przyglądając się Twojemu programowi, wydaje mi się, że jeden z błędów może być tutaj:

  	// Pobieram konfigurację I/O do sprawdzenia
	uint8_t config = mcp_reg_read(MCP_IODIR);
	if (check_bit(config, output_num) == 0){

		uint8_t reg_val = mcp_reg_read(MCP_GPIO);
		return check_bit(reg_val, output_num);
	}
	else{
		return -1;
	}

O ile rozumiem, chciałeś odczytywać rejestr MCP_GPIO tylko wówczas, gdy pin działa jako wejście.

W przypadku MCP_IODIR, bit ustawiony na "1" odpowiada wejściu, natomiast "0" wyjściu.

mcp_dir.thumb.png.cd3c24be9ae495019c4e74a1a3db787e.png

W programie sprawdzasz, czy wartość jest 0:

if (check_bit(config, output_num) == 0){

Może dlatego nie działa?

 

Edytowano przez Elvis
dodany fragment datasheet-a
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Elvis bardzo dziękuję za pomoc 👍 To, co napisałeś, było jednym z dwóch błędów, które znalazłem w moim programie. Wszystko już poprawione i biblioteka do ekspandera działa jak należy🙂 

Cytat

Opis "Niestety program nie działa jak należy" jest nieco zbyt ogólny.

Jak przeglądam różne grupy na Facebook'u i widzę właśnie posty typu "Program nie działa. (kropka)" to chciałbym pomóc, ale nie za bardzo wiem jak.  Zastanawiam się, dlaczego ludzie dają taki skąpy opis, który nie daje jakiegokolwiek obrazu sytuacji. A teraz śmieszna sprawa, bo sam zrobiłem dokładnie to samo😂 Tak bardzo skupiłem się na prośbie o pomoc w rozwiązaniu problemu, że aż zapomniałem ten problem opisać😂

Jeszcze raz dzięki wielkie za znalezienie błędu🖐️

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.