logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C/AVR-GCC]Programowe SPI (bit-bang SPI)

sottek 03 Mar 2010 08:32 4249 2
REKLAMA
  • #1 7776802
    sottek
    Poziom 10  
    Witam.
    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
  • REKLAMA
  • Pomocny post
    #2 7777192
    H0miczek
    Poziom 20  
    Zasadniczo SPI obsluguje odczyt jednym ciagiem 16 bitow a nawet dowolnej ilosci bajtow (np pamięć - rozkaz, adres i ile chcesz danych). Samo SPI nie wymaga powtarzania czegokolwiek (tylko CS stale aktywny).
    Jednak wszystko zalezy od tego z czym sie komunikujesz po SPI. byc moze scalak wymaga jakiejs specjalnej procedury, to juz musisz sam sprawdzic.
  • #3 7799652
    sottek
    Poziom 10  
    Wielkie dzięki.
    Potwierdziłeś moje przypuszczenia. Teraz tylko to zrobić!\
    Pozdrawiam
REKLAMA