Forum: Mikrocontroller und Digitale Elektronik spi problem mega8


von Werner (Gast)


Lesenswert?

kann mir einer sagen ob man den ss pin als ausgang definieren muß und 
high???

beim 128 ist es so aber im datenblatt steht das er nicht benutzt wird.


Leider funktioniert mein SPI nicht


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


#define port_cs()    DDRB|=(1<<1); //CS

//PORT SPI
#define port_spi_sck()  DDRB|=(1<<5); //SCK
#define port_spi_mosi()  DDRB|=(1<<3);//MOSI
#define port_spi_miso()  DDRB&=~(1<<4);//MISO

#define cs_high()  PORTB|=(1<<1); //HEIGH CS
#define cs_low()  PORTB&=~(1<<1); //LOW  CS



void spi_init(void)
{
port_cs();//CS
port_spi_sck(); //SCK
port_spi_mosi();//MOSI
port_spi_miso();//MISO
cs_high();//CS auf high
SPCR=(1<<SPE)|(1<<MSTR);
}


//SPI WRITE
unsigned char Write_SPI(char data)
{SPDR=data;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}

void main(void)
{
unsigned char ergebniss;
spi_init();
Write_SPI(0x8d);
ergebniss=Write_SPI(0xff);
}


leider bleibt er bei Write_SPI Hängen.

Es sieht so aus als ob er in der While Schleife hängt vom Write_SPI():

Pins sind korreckt verbunden und nachgemessen.

Port definitionen stimmen

von Johannes M. (johnny-m)


Lesenswert?

> kann mir einer sagen ob man den ss pin als ausgang definieren muß und
> high???
Ja, der /SS-Pin muss im Master-Betrieb als Ausgang konfiguriert werden 
(bzw. wenn er als Eingang konfiguriert ist, muss er permanent High-Pegel 
haben).

von Werner (Gast)


Lesenswert?

ja jetz bleibt er nicht mehr in der while hängen


aber das nächste problem.


MISO zeigt immer high pegel.

MOSI nur wenn er überträgt.

cs auch nur wenn er überträgt low

sck sehe ich am oszi nicht

deshalb bekomme ich immer 255 (0xff);


was ist das wieder

von Timur Y. (smokingslim)


Lesenswert?

Also ich weiß ja nicht was du mit deiner SPI Schnittstelle ansprechen 
willst.
Aber eigentlich wollen die meisten SPI Partner das mann nach jeder 
abgeschlossener Übertragung das CS wieder aus macht.
Also du solltest das mal in deine Write routine einbinden d.h vor dem 
write aktivieren und danach wieer deaktievieren.

von Timur Y. (smokingslim)


Lesenswert?

Ha jetzt seh ich erst das du deine CS einemal auf High gestetzt hast und 
dann  nicht auf Low dann geht es natürlich nicht.

von Werner (Gast)


Lesenswert?

Ja das habe ich ansprechen will ich eine RTC Ds1390 von MAXIM

bevor ich den ertsen Write mache setze ich cs auf low

nach dem ich alle bits übertagen habe setzte ich ihn wieder auf high


lesen tu ich mit Write_SPI(0xff);

geht problemlos mit dem 128iger aber mit dem Mega 8 nicht.

kann es sein das die ISP Leitungen stören???

Die sind ja mit SCK MISO MOSI verbunden.

beim 128iger nutze ich TX RX und SCK

und natürlich bei beiden den Reset.

von Werner (Gast)


Lesenswert?

Hallo

Also ich habe aber auch immer Pech erst der MEga 8 jetzt der RTC im 
eimer

Habe diesn getauscht


und siehe da es geht.


Danke für eure hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.