Usunięto zbędne komentarze w spi.h
This commit is contained in:
parent
5ef4217379
commit
4f5cd13787
43
spi.h
43
spi.h
@ -4,22 +4,6 @@
|
|||||||
#define SS_LOW PORTB &= ~(1<<PORTB2)
|
#define SS_LOW PORTB &= ~(1<<PORTB2)
|
||||||
#define SS_HIGH PORTB |= (1<<PORTB2)
|
#define SS_HIGH PORTB |= (1<<PORTB2)
|
||||||
|
|
||||||
//Jaki stan musi być na SS żeby DAC odbierał dane??
|
|
||||||
//musi być to stan niski (zarówno wg kursu jak i danycha katalogowych)
|
|
||||||
|
|
||||||
/*"CS is the Chip Select input pin, which requires an
|
|
||||||
active low to enable serial clock and data functions."*/
|
|
||||||
|
|
||||||
/*CPOL (polaryzacja) - mówi o tym jaki ma być stan zegara w bezczynności
|
|
||||||
W przypadku użytego DAC, w trybie 0,0 (Mode 0, 0), powinien być to stan niski, a więc CPOL = 0 */
|
|
||||||
|
|
||||||
/*CPHA (faza) - określa kiedy są odczytywane, a kiedy wystawiane bity na linii danych DAC.
|
|
||||||
Ponieważ bity są wystawiane na zboczu opadającym, to CPHA = CPOL = 0 (czyli DAC pracuje w trybie 0, 0)*/
|
|
||||||
|
|
||||||
/*W ogólności MCP4xxx wspierają tryb 0,0 i 1,1*/
|
|
||||||
|
|
||||||
/*Wg kursu inne piny odpowiadają za SPI niż w rzeczywistości (PB4, 5, 6, 7 zamiast PB2, 3, 4, 5)*/
|
|
||||||
|
|
||||||
//inicjalizacja
|
//inicjalizacja
|
||||||
void spiInit(void) {
|
void spiInit(void) {
|
||||||
// /SS, MOSI, SCK jako wyjścia
|
// /SS, MOSI, SCK jako wyjścia
|
||||||
@ -32,32 +16,9 @@ void spiInit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//wysłanie jednego bajtu
|
//wysłanie jednego bajtu
|
||||||
/*uint8_t*/ void spiTransfer(uint8_t data) {
|
void spiTransfer(uint8_t data) {
|
||||||
//rozpocznij transmisję
|
//rozpocznij transmisję
|
||||||
SPDR = data;
|
SPDR = data;
|
||||||
//poczekaj na koniec
|
//poczekaj na koniec
|
||||||
while(!(SPSR & (1<<SPIF))); //wstrzymanie programu trwa do chwili zakończenia transmisji (flaga SPIF = 0 w rejestrze statusowym)
|
while(!(SPSR & (1<<SPIF)));
|
||||||
//możliwe jest też wywołanie przerwania w takim przypadku: można by zmieniać w nim własną flagę
|
|
||||||
//wysyłanie i tak następuje co 1600 cykli (f = 10 000 Hz), więc oczekiwanie raczej nie jest do niczego potrzebne
|
|
||||||
//BŁĄD!! Żeby wysłać jedna wartość do DAC wysyłane są dwa bajty jeden za drugim
|
|
||||||
//Czas jaki mija między zakończeniem wysyłki pierwszego i rozpoczęcia transmisji
|
|
||||||
//drugiego pakietu wynosi ok. 600 ns - ok. 10 cykli zegarowych (powinno wyjść dokładnie 10 * 62,5 ns = 625 ns).
|
|
||||||
//Można stworzyć dodatkową funkcję - wysyłającą drugi bajt bez czekania
|
|
||||||
//NIE DZIAŁA! Z jakiegoś powodu, wykorzystując taką funkcję wysyła się tylko pierwszy bajt
|
|
||||||
//Dzieje się tak, ponieważ natychmiast po przekazaniu danych do wysyłki następuje rozłaczenie (bit SS = 1)
|
|
||||||
//Aktywacja DAC SPI na stałe (SS = 0) nic nie daje. Nadal bez while'a, wysyłka drugiego bajtu nie następuje
|
|
||||||
//Obsługa przez przerwania prawdopodobnie byłaby nieopłacalna - więcej procesor musiałby się napracować niż marnuje czasu w while'u
|
|
||||||
//Zmiany stanu wyjscia SS są konieczne do poprawnej pracy przetwornika CA, stąd:
|
|
||||||
//- usunięcie while'a po pierwszym bajcie jest niemożliwe, bo natychmiast nastąpiłoby wprowadzanie
|
|
||||||
//kolejnych danych do rejestru SPDR,
|
|
||||||
//- usunięcie while'a po drugim bajcie jest niemożliwe, bo zanim nastąpiłaby wysyłka, doszłoby do
|
|
||||||
//podniesienia linii SS
|
|
||||||
|
|
||||||
//Cała wysyłka jednego bajtu trwa (1940 ns / 62,5 ns) ok. 31 cykli (czas kiedy SS = 0)
|
|
||||||
//Zanim zostanie wysłany pierwszy bit, mijają (1490 ns / 62,5 ns) ok. 24 cykle
|
|
||||||
//While kończy się zanim na MOSI kończy się wysyłka
|
|
||||||
//Przy wysyłaniu dwóch bajtów całość trwa dłużej (4640 ns / 62,5 ns): ok. 74 cykle
|
|
||||||
//W tym przypadku while kończy się po przekazaniu drugiego bajtu (470 ns / 62,5 ns): ok. 7,5 cykli
|
|
||||||
//zwróć odebraną wartość
|
|
||||||
//return SPDR;
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user