Witam.
Mam problem z rozgryzieniem programowego SPI w AVR. Poradziłem sobie z trybem 8 bitowym. Poniżej kod:
Jednak teraz chciałbym uzyskać tryb 16-bitowy, z ciągłym odbiorem danych z jednego układu. I tu pytanie, czy procedura SPI wymaga podania za każdym razem przy odbiorze 16 bitów: wybrania układu, bitu startu, rozkazu odczytu i podania adresu, odczyt 16 bitów, "dezaktywacja" układu. Czy może jest to zbędne i wystarczy np. podać tylko adres przy kolejnej porcji bitów?
Ze względu na szybkość działania chciałbym uniknąć takiej sytuacji, że będę musiał podawać za każdym razem powyższą sekwencję, bo to znacznie wydłuża program nie mówiąc już o czasie reakcji układów.
Za wszelką pomoc, z góry dziękuję.
Pozdrawiam
Mam problem z rozgryzieniem programowego SPI w AVR. Poradziłem sobie z trybem 8 bitowym. Poniżej kod:
void spi_sb(void) { //przeslanie bitu startu
DDRD|=_BV(Din);
PORTD|=_BV(Din);
SK_L;
_delay_ms(1);
SK_H;
_delay_ms(1);
PORTD&=~_BV(Din); //niekonieczne
}
spi_s(uint8_t w, uint8_t data) {
uint8_t i;
DDRD|=_BV(Din); //niekonieczne
for(i=0;i<w;i++) {
if(data&0x80)
PORTD|=_BV(Din);
else
PORTD&=~_BV(Din);
_delay_ms(1);
SK_L; //niski stan na wyjsciu zegarowym
_delay_ms(1);
SK_H; //wysoki stan na wyjsciu zegarowym
_delay_ms(1);
data<<=1;
}
}
uint8_t spi_read(uint8_t n, uint8_t addr) {
uint8_t i,data;
CS_H; //wybranie ukladu
_delay_ms(1);
spi_sb(); //start bit
_delay_ms(1);
spi_s(OP,READ); //wyslanie rozkazu ODCZYT
_delay_ms(1);
spi_s(ADD,addr); //wyslanie adresu
_delay_ms(1);
DDRD&=~_BV(Dout); //ustawienie Dout jako wejscie
PORTD&=~_BV(Dout); //bez podciagania do jedynki
for(i=0;i<8;i++) {
SK_L;
_delay_ms(1);
SK_H;
_delay_ms(1);
data<<=1;
data|=((PIND&_BV(Dout))>0)?1:0; //sprawdz warunek, jesli prawdziwy przyjmij 1 jezeli nie przyjmij 0
}
CS_L;
return data;
}
Jednak teraz chciałbym uzyskać tryb 16-bitowy, z ciągłym odbiorem danych z jednego układu. I tu pytanie, czy procedura SPI wymaga podania za każdym razem przy odbiorze 16 bitów: wybrania układu, bitu startu, rozkazu odczytu i podania adresu, odczyt 16 bitów, "dezaktywacja" układu. Czy może jest to zbędne i wystarczy np. podać tylko adres przy kolejnej porcji bitów?
Ze względu na szybkość działania chciałbym uniknąć takiej sytuacji, że będę musiał podawać za każdym razem powyższą sekwencję, bo to znacznie wydłuża program nie mówiąc już o czasie reakcji układów.
Za wszelką pomoc, z góry dziękuję.
Pozdrawiam