Skocz do zawartości

Pomocna odpowiedź

Napisano

Witam. Używam sprzętowego SPI w m32 ale zaszła potrzeba użycia nóżki MISO jako SS (sygnał zatrzaskujący - CS). Czy jest to możliwe?

Oto prościutki, liniowy program napisany z przykładów zawartywch w nocie:

#include <avr/io.h>
#include <util/delay.h>

#define MOSI PB5
#define SCK PB7
#define CS PB4

void InitSpi(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<CS);SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR1);}
void SendSpi(uint8_t bajt){SPDR = bajt;while(!(SPSR & (1<<SPIF)));}

int main(void)
{
DDRD |= (1<<PD7);
InitSpi();
while(1)
{SendSpi(165);PORTB |=(1<<CS);_delay_ms(10);PORTB &= ~(1<<CS);
_delay_ms(1000);PORTD ^= (1<<PD7);
}
}

Program co sekundę miga diodą na pinie PD7 (służy do debugowania) i co sekundę wysyła bajt 165 (działa poprawnie). Problem polega na tym że gdy podmienię w definicjach preprocesora CS z PB4 na PB6 (MISO) i przeniosę ustawianie CS jako wyjście na koniec funkcji InitSpi lub tuż przed wywoływaniem funkcji SendSpi. Program się zawiesza (z migania diody wynika że ostatnia linia pętli while wykonuje się raz lub wcale.

Czy jest jakiś sposób aby użyć sprzętowego MISO jako sygnał zatzraskujący ?

Jeśli masz takie wątpliwości to:

1. Otwórz dane katalogowe mega32 na rysunku "Figure 26. Alternate Port Functions". Jest tam uniwersalny schemat pokazujący jak wygląda struktura każdego bitu portu. Po lewej stronie jest pin procesora a po prawej mnóstwo sygnałów nim sterujących. Jedne właczają pull-up, inne otwierają bufor trójstanowy na wyjście a inne wpisują dane do przerzutnika DDR itp. Po minucie przyglądania się sprawa staje się jasna albo przynajmniej zaczyna coś świtać..

2. Znajdź drogę sygnału na której Ci zależy, np. co musi być spełnione by dany pin był wyjściem i abyś mógł nim sterować programowo z rejestru PORT.

3. Poszukaj w następnych rozdziałach opisu dokładnie tego portu, np. w tym przypadku portu B i odpowiedniej tabelki opisującej jak wyglądają sygnały sterujące pinami tego portu. Tutaj będzie to tabelka "Table 26. Overriding Signals for Alternate Functions in PB7..PB4" - leży kilka stron dalej niż schemat ogólny.

4. Podstaw sobie sygnały które znasz (np. SPI załączone w trybie MASTER) i sprawdź czy pin działa tak jak chciałeś. Moim zdaniem gdy SPI działa jako MASTER, pin MISO nie może być wyjściem.

5. Jeśli czegoś dalej nie rozumiesz, pytaj 🙂

Widziałem jedną tabelkę w nocie (przed przeczytaniem twojego postu) z której kategorycznie wynikało że nie może być wyjściem.

No nic, poeksperymentuje bo od biedy mogę jako SS używać zupełnie innego pinu a MISO wykorzystać jako wejście do jakiegoś innego celu (np. do badania stanu przycisku) , ciekawe tylko czy będzie można normalnie badać stan na MISO (gdy SPI sprzętowe jest włączone) w rejstrze PIN , czy też będe musiał odczytywać dane z bufora wejściowego (przerost formy nad treścią ale jak nie będzie innego wyjścia to trudno).

Wojtek, jeśli to dla Ciebie jest naprawdę takie ciekawe, to weź jeszcze raz przeczytaj mój poprzedni post. Dotarło? To znów bierzesz schemat, tabelkę i patrzysz. To żadna magia ani wróżenie z fusów, skup się: linia sygnału poprowadzona do rejestru PIN, który chcesz czytać nazywa się DIxn - widzisz to? Co jest między nią a rzeczywistym pinem procesora? Bufor odcinający zrobiony z dwóch kluczy MOSFET plus mały tranzystor wymuszający stan niski gdy bufor jest odcięty, tak? Bufor jest sterowany multiplekserem przełączanym sygnałem DIEOExn - jego też widzisz? Jaki jest sygnał sterujący multiplekserem w przypadku pinu PB6? Tabelka mówi, że stałe zero a to znaczy, że bierzesz pod uwagę tylko zerowe wejście multipleksera. Tam jest doczepiony (schemat!) sygnał SLEEP tak więc jeśli tylko procesor nie jest uśpiony, to niezależnie od załączenia SPI możesz czytać pin PB6/MISO przez rejestr PINB. Koniec kropka.

spokojnie, nie oczekiwałem odpowiedzi bo mam to sprawdzić doświadczalnie jak już zlutuje płytkę 😉 (był gdzieś pytajnik w moim poście ? <- jakby co to jest pytanie retoryczne)W każdym razie dziękuje bo niektóre z twoich postów są bardzo cenne i nie raz decydowały o powodzeniu moich "projektów".

Widzę, że robisz coraz fajniejsze rzeczy i zadajesz coraz ciekawsze pytania. Dlatego trochę zmartwiło mnie podejście:

"No nic, poeksperymentuje.."

w sytuacji gdy całą wiedzę masz na talerzu. Przecież nie napisałem "tak" albo "nie" tylko dałem Ci sposób na znalezienie odpowiedzi na każde tego typu pytanie.

Wchodząc na coraz wyższe poziomy zaawansowania powinieneś modyfikować swoje metody pracy. Nie warto tracić czasu na empiryczne sprawdzanie faktów o których możesz po prostu przeczytać, bo robiąc coraz większe projekty będziesz coraz więcej tego czasu poświęcał na upewnianie się, że 2x2=4. Pisząc poprzedniego posta chciałem pokazać Ci, że Twój eksperyment mógł być zastąpiony minutą patrzenia na schemat i tabelkę. A co w przypadku, gdybyś jeszcze nie miał tego lub innego procesora i działającej z nim płytki a już projektował układ korzystający z jakichś nieoczywistych cech sprzętu? Obawiam się, że nie jest to pytanie czysto retoryczne..

  • Lubię! 1

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