PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI slave transmit problem



tristate
04.11.2005, 16:49
So mal wieder ein neues Problem:
wenn ich über spi vom master zum slave sende emfängt dieser auch die daten in der spi interrupt routine (so wie überall beschrieben) allerdings kann ich nichts vom slave zum master senden.
das müsste ja dann vorher in das spdr register geschrieben werden hab ich, er macht aber nichts.
jetzt meine frage kann ich das dann überhaupt in einer int routine machen weil da bekommt er ja schon die anfrage vom master?
oder lass ich den spie weg und frag meinetwegen mit nem timer nach ob der spif irgendwann mal kommt?
nächstes prob:
ich will vom master aus 1 byte senden und der slave soll mir auf dieses byte auch wieder ein byte schicken.
geht ja aber nicht weil nur der master und slave gleichzeitig senden können.

MASTER<------------------------|
|___________________>SLAVE

wie habt ihr so ein problem gelöst?
mfg

SprinterSB
04.11.2005, 16:54
Schon mal versucht 2 Bytes zu schicken? Nach dem Empfang des ersten schreibt der Slave das Datenregister und durch Senden des zweiten wird das Datum zum Master rotiert.

tristate
04.11.2005, 17:02
ok so dachte ich mir das auch aber funzt ja mit dem senden nicht...
machst du das in der int routiene oder fragst du SPIF ab?
kannst ja mal code posten wenn du was hast.
scheinst ja ziemlich fit in den ganzen themen zu sein zu sein...
da versuch ich noch hinzukommen..

mfg

SprinterSB
04.11.2005, 17:09
Poste mal den Code, vielleicht seh ich ja was. Aber erst die Tage...

tristate
04.11.2005, 17:30
so hier mal der sklave der nix sendet:

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define DDR_SPI PORTB
#define DD_SS PB0
#define DD_SCK PB1
#define DD_MOSI PB2
#define DD_MISO PB3

//#####################
void spi_slave_init(void);
void spi_slave_receive(void);
int main(void);
//#####################
volatile char tx_data;
volatile char rx_data;

SIGNAL (SIG_SPI)
{
rx_data=SPDR;
SPDR=tx_data;
}

void spi_transmit(void)
{
switch (rx_data)
{
case 0x00: tx_data=0xFF;break; //1.mal ini
case 0x01: tx_data=0xFE;break; //daten
case 0x02: tx_data=0xFD;break;
case 0x03: tx_data=0xFC;break;
case 0x04: tx_data=0xFB;break;
case 0x05: tx_data=0xFA;break;
case 0x06: tx_data=0xF9;break;
case 0x07: tx_data=0xF8;break;
case 0x08: tx_data=0xF7;break;
case 0x09: tx_data=0xF6;break;
}
}

void spi_slave_init(void)
{
DDR_SPI = (1<<DD_MISO)|(0<<DD_MOSI)|(0<<DD_SS)|(0<<DD_SCK);
SPCR = (1<<SPE)|(1<<SPIE);
sei();
}

/*
void spi_slave_receive(void)
{
SPDR=tx_data;
while(!(SPSR & (1<<SPIF)));
rx_data=SPDR;
}
*/

int main(void)
{
DDRE=0xFF;

spi_slave_init();

while(1)
{
PORTE=rx_data;
spi_transmit();
//spi_slave_receive();
}
return 0;
}

tristate
04.11.2005, 17:52
verflucht!!! ](*,)
fehler gefunden!
#define DDR_SPI PORTB hier liegt der fehler
PORTB muss ja auch DDRB heissen lässt mich ja mal wieder wie n anfänger aussehen...
mfg