Forum: Mikrocontroller und Digitale Elektronik hw spi atmega16


von Christian M. (inscene)


Lesenswert?

Hallo Leute,

ich sitze hier und versuche über die Hardware SPI meines ATMEGA16 Daten 
zu senden. Leider ohne Erfolg. Vielleicht kann mir ja einer meinen 
Fehler zeigen.

Ich habe folgenden Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>  
6
7
#define F_CPU 8000000UL
8
#include <util/delay.h>
9
10
#define SPI_PORT PORTB
11
#define SPI_DDR  DDRB
12
#define SPI_PIN  PINB
13
14
#define SPI_SDI  5
15
#define SPI_SCK  7
16
#define SPI_CS  4
17
#define SPI_SDO   6
18
19
unsigned short spi_Trans(unsigned short data)
20
{
21
    uint8_t highbyte;
22
    uint8_t lowbyte;
23
24
    lowbyte = data;
25
    highbyte = (data >> 8);
26
27
    SPI_PORT &= ~(1 << SPI_CS);  //vorsichtshalber SS selber setzen
28
    SPDR = highbyte;
29
    // Wait for transmission complete 
30
    while(!(SPSR & (1<<SPIF)))
31
    ;
32
    SPI_PORT |= (1 << SPI_CS); // SS zurücksetzen
33
34
35
    SPI_PORT &= ~(1 << SPI_CS);    //vorsichtshalber SS selber setzen
36
    SPDR = lowbyte;
37
    // Wait for transmission complete 
38
    while(!(SPSR & (1<<SPIF)))
39
    ;
40
    SPI_PORT |= (1 << SPI_CS); // SS zurücksetzen
41
    _delay_ms(1);
42
43
    return SPDR;
44
}
45
46
void spi_InitPort(void)
47
{
48
    SPI_DDR=(1<<SPI_SDI)|(1<<SPI_SCK)|(1<<SPI_CS);
49
    SPI_PORT=(1<<SPI_CS);
50
    SPCR|=(1<<SPE)|(1<<MSTR);
51
}
52
53
int main(void)
54
{
55
    spi_InitPort();
56
    spi_Trans(0xA000);
57
}

Ich freue mich über jede hilfe.

von Jean P. (fubu1000)


Lesenswert?

Hi,
Code sieht an sich OK aus. Wohin sendest du denn die Daten und wie sieht 
gegenfalls deine Empfangsroutine aus?

Gruß

von ... .. (docean) Benutzerseite


Lesenswert?

Wieso machst du eine "return SPDR;" deine Funktion empfängt doch gar 
nix...

Du sendest doch bloß 2 Byte..

Wie kontrollierst du ob was ankommt?

Mit was möchtest du sprechen?

von Christian M. (Gast)


Lesenswert?

Ich sende die Daten zu einem RFM12 Funkmodul. Ich habe das ganze per 
Software SPI Implementierung schon am laufen. Nun wollte ich gerne den 
HW SPI verwenden.
Die main Funktion habe ich gekürzt damit es lesbarer ist. Normal werden 
verschiedene Kommandos an das RFM12 zur Konfiguration gesendet und 
danach immer wieder der selbe string verschickt. Aber es kommt nix beim 
Empfänger an.
Wie schon gesagt, per Software SPI läuft das.

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.