SPI kerdes

Papp Zoltán zombi at c2.hu
Sat Dec 2 16:52:06 CET 2006


2006.12.02. 15:23:15 dátumon B Z <kalip777 at freemail.hu> írta:

> Sziasztok!
>
> 2db ATmega32 komunikalna egymassal SPI-n keresztul. Addig
> nincs is bajom mig a master ad a slave-nek. Helyesen at is
> kuld mindent. Viszont a slave-vel nem tudok adatot kuldeni a
> master fele. Adatlapot atolvastam ketszer is, bar lehet
> valami elkerulte a figyelmem, vagy a hianyos nyelvtudas
> okozhatja vesztem.
>
> Ahogy kommunikalok:
> Master:
> Slave kivalsztas
> SPDR regiszterbe iras
> SPIF flag vizsgalata, hogy befejezodott-e az atvitel
> Slave tiltasa
>
> Ezutan a slave-nel interrupban:
> SPDR regiszter kiolvasa -> megjott a jo adat
> SPDR regiszter irasa, amit masternak kuldenek
>
> Masternal ezekutan:
> Slave kivalsaztasa
> SPDR reg irasa
> SPIF flag vizsgalata
> SPDR reg olvasa -> rossz az adat amit a slave kuldott
>
> Helyes ez a gondolatmenetem, vagy kihagyok valamit, vagy nem
> is igy kellene kommunikalni?? Az aramkorben kulso felhuzo
> ellenallasok nincsenek. Master fele akkora orajelrol jar
> mint a slave.

A master a slave-t csak az első bájt előtt engedélyezze, és az utolsó  
(jelen esetben a második) után tiltsa.
Érdemes elolvasni az "SS Pin Functionality" részt.

Először mindig a legkisebb SPI sebességen próbálkozzál (fosc/128).

Példa C-ben:

// SPI könyvtár részlet:

#define SPIDONTCARE (0x00)

char spi_rw(char data)
{
	// set data to send into SPI data register
	SPDR = data;
	// Wait for transmission complete
	while(!(SPSR & (1<<SPIF)));
	// return data read from SPI
	return SPDR;
}

char spi_r()
{
	return spi_rw(SPIDONTCARE);
}

//pl. MCP2515 regiszter olvasás:

char mcp2515_readRegister(const char address)
{
	char ret;
	
	MCP2515_SELECT();  //Slave select
	spi_rw(MCP_READ);  //1. byte: Read command
	spi_rw(address);   //2. byte: register address
	ret = spi_r();     //3. byte: reading register
	MCP2515_UNSELECT();//Slave deselect
	
	return ret;
}



Üdv
-- 
Papp Zoltán
OneWay Electronics



More information about the Elektro mailing list