SPI, AVR a C - nastavení PB2 slave select, SPDR a zpoždění

Zdravím. Mám takový dotaz na programování rozhraní SPI pro AVR v jazyce C.

[code]unsigned char SPI_WriteRead(unsigned char dataout)
{
SPDR = dataout; //zapis do prenosoveho registru

while(!(SPSR & (1<<SPIF))); //cekani na dokonceni prenaseni

PORTB = (1<<PB2); //SS pin log 0
_delay_us(1); //zpozdeni 1us

PORTB = ~(1<<PB2); //SS pin log 1

}[/code]

V kódu výše je jednoduchá metoda zápisu přes SPI do slave zařízení (samotné nastavení SPI registrů řeším v metodě main).

A teď mám pár otázek. PB2 je pin slave select, čili když chci zapisovat musím jej nastavit na log 0. Proč se toto děje až po zápisu do přenosového registru SPDR? Proč mi nefunguje, když PB2 nastavím na log 0 již před samotným zápisem do registru? Dále proč je tam to zpoždění 1us a proč to bez něj někdy funguje a někdy ne? Je to tak, že se SPDR funguje jako nějaká cache do zařízení se data odešlou až po nastavení SS na log0? Za každou odpověď díky.

:arrow_right: administrator: přejmenováno z "SPI, AVR a C"

Na první pohled - bez nějakého hlubšího zkoumání vidím toto:

PORTB = (1<<PB2); nenastavuje výstup do nuly jak je tam psáno, ale naopak do jedničky - z toho vyplývá, že nenastavuješ - li SS ještě někde jinde v programu, pak máš na něm trvale “0” a pouze na tu 1 us se ti přepne na “1”.

Neznám to tak dokonale, ale řekl bych, že slave reaguje na sestupnou hranu - proto ten “jedničkový” puls.

Už jsem to vyřešil :slight_smile:

To jsme rádi, ale třeba by někteří uvítali, kdyby ses podělil s tím jak s to vyřešil :slight_smile: .

Tak to je odkáži sem.