oderlachs
28.10.2018, 13:01
Hallo Freunde !
Ja der Garten hat seine Tore geschlossen, jetzt geht es wieder ans programmieren und Basteln. Nun stehe ich wieder vor einem Problem bei einer SPI Anwendung.
Warscheinlich bin ich in meinem Grunddenken des Ablaufs etwas verkehrt, denn ich verstehe nicht wie dem Slave beigebracht werdenb soll, das er Daten zu Senden hat.
Ich habe auch entsprechender Literatur nicht recht durchgesehen, wie das mit dem Empfang vom Slave im Master(Atmega32) vor sich geht.
Das SPDR wird ja zum Senden beschrieben wie auch beim Empfang dann ausgelesen....Das verwirrt mich ein wenig.
Hier nun mein Source-Code in der Basisform:
/* ================================================== ================ */
/* */
/* Programm interne Definitionen */
/* */
/* ================================================== ================ */
#define DDR_SPI DDRB
#define PORT_SPI PORTB
#define SPI_MOSI 5
#define SPI_MISO 6
#define SPI_SCK 7
#define SPI_SS 4
/* ================================================== ================ */
/* */
/* Funktionen deklarieren */
/* */
/* */
/* ================================================== ================ */
void SPI_Init();
void SPI_Write(uint8_t val);
uint8_t SPI_Read();
/* ================================================== ================ */
/* */
/* SPI Initialisieren */
/* */
/* */
/* ================================================== ================ */
void SPI_Init()
{
DDR_SPI |= (1 << SPI_MOSI);
DDR_SPI |= (1 << SPI_MISO);
DDR_SPI |= (1 << SPI_SCK);
DDR_SPI |= (1 << SPI_SS);
PORT_SPI &= ~(1 << SPI_SS); // CS auf LOW
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); // CPU_CLK/64
}
/* ================================================== ================ */
/* */
/* SPI Schreiben an Perepherie */
/* */
/* */
/* ================================================== ================ */
void SPI_Write(uint8_t val)
{
SPDR = val;
while(!(SPSR & (1 << SPIF)));
}
/* ================================================== ================ */
/* */
/* SPI Lesen von Perepherie */
/* */
/* */
/* ================================================== ================ */
uint8_t SPI_Read()
{
while(!(SPSR & (1 << SPIF)));
return SPDR;
}
/*================================================= ===================*/
/* */
/* */
/* */
/* */
/*================================================= ===================*/
Über einen "Anregungs-Tritt", um in die richtige Gedankenspur zu kommen, wäre ich sehr dankbar.
Ich möchte ein SD _Card Modul per SPI am ATmega32/644 betreiben, aber erst mal muss ich da die Grundlagen verstehen wie das mit dem Datenverkehr ist,
bevor ich dann mit dem SD-Spezifischen Sachen weiter mache.
Zum Lernen möchte ich es so halten das ein zweiter Atmega oder auch ein Arduino als Slave die empfangenen daten zurück sendet, die dann vom Master per UART ausgegeben werden.
So nun will ich hoffen das ich gut genug erklärt habe um was es mir geht und wo ich Hilfe, Hinweise benötige.
Gruss und Dank
Gerhard
Ja der Garten hat seine Tore geschlossen, jetzt geht es wieder ans programmieren und Basteln. Nun stehe ich wieder vor einem Problem bei einer SPI Anwendung.
Warscheinlich bin ich in meinem Grunddenken des Ablaufs etwas verkehrt, denn ich verstehe nicht wie dem Slave beigebracht werdenb soll, das er Daten zu Senden hat.
Ich habe auch entsprechender Literatur nicht recht durchgesehen, wie das mit dem Empfang vom Slave im Master(Atmega32) vor sich geht.
Das SPDR wird ja zum Senden beschrieben wie auch beim Empfang dann ausgelesen....Das verwirrt mich ein wenig.
Hier nun mein Source-Code in der Basisform:
/* ================================================== ================ */
/* */
/* Programm interne Definitionen */
/* */
/* ================================================== ================ */
#define DDR_SPI DDRB
#define PORT_SPI PORTB
#define SPI_MOSI 5
#define SPI_MISO 6
#define SPI_SCK 7
#define SPI_SS 4
/* ================================================== ================ */
/* */
/* Funktionen deklarieren */
/* */
/* */
/* ================================================== ================ */
void SPI_Init();
void SPI_Write(uint8_t val);
uint8_t SPI_Read();
/* ================================================== ================ */
/* */
/* SPI Initialisieren */
/* */
/* */
/* ================================================== ================ */
void SPI_Init()
{
DDR_SPI |= (1 << SPI_MOSI);
DDR_SPI |= (1 << SPI_MISO);
DDR_SPI |= (1 << SPI_SCK);
DDR_SPI |= (1 << SPI_SS);
PORT_SPI &= ~(1 << SPI_SS); // CS auf LOW
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); // CPU_CLK/64
}
/* ================================================== ================ */
/* */
/* SPI Schreiben an Perepherie */
/* */
/* */
/* ================================================== ================ */
void SPI_Write(uint8_t val)
{
SPDR = val;
while(!(SPSR & (1 << SPIF)));
}
/* ================================================== ================ */
/* */
/* SPI Lesen von Perepherie */
/* */
/* */
/* ================================================== ================ */
uint8_t SPI_Read()
{
while(!(SPSR & (1 << SPIF)));
return SPDR;
}
/*================================================= ===================*/
/* */
/* */
/* */
/* */
/*================================================= ===================*/
Über einen "Anregungs-Tritt", um in die richtige Gedankenspur zu kommen, wäre ich sehr dankbar.
Ich möchte ein SD _Card Modul per SPI am ATmega32/644 betreiben, aber erst mal muss ich da die Grundlagen verstehen wie das mit dem Datenverkehr ist,
bevor ich dann mit dem SD-Spezifischen Sachen weiter mache.
Zum Lernen möchte ich es so halten das ein zweiter Atmega oder auch ein Arduino als Slave die empfangenen daten zurück sendet, die dann vom Master per UART ausgegeben werden.
So nun will ich hoffen das ich gut genug erklärt habe um was es mir geht und wo ich Hilfe, Hinweise benötige.
Gruss und Dank
Gerhard